これは主に、私の作品で傾斜したフォントのテキスト行を修正する方法の調査を記録するためのものです。ナンセンスはあまりありません。見てみましょう。
目次
斜めのテキストラインフォントの修正は、主に2つの部分に分けられ、1つは傾斜角度の検出であり、もう1つは傾斜修正です。その中でも、傾斜角の検出は非常に重要であり、その後の補正に関係しています。
1.アルゴリズムのフローチャート
2、アルゴリズムの実装
2.1、前処理
原画:
主にグレースケール、フィルタリング、2値化があり、結果は次のとおりです。
2.2、レベルがぼやけている
水平方向のぼかしは、ランスムージングとも呼ばれます。これは、特定のしきい値未満の長さの連続する黒い点を画像上の白い点に変換するアルゴリズムです。画像がブラーアルゴリズムによって処理された後、互いに接近している画像内の接続されたコンポーネントは、より大きな接続領域を形成します。
def horizontal_blur(image):
'''水平平滑'''
dst=image
#计算图像的字符宽度
hor_vec=np.sum(dst,axis=0)
width=hor_vec.shape[0]
left=right=0
for i in range(width):
if hor_vec[i]!=0:
left=i
break
for j in range(width-1,-1,-1):
if hor_vec[j]!=0:
right=j
break
char_width=right-left+1 if right-left+1>0 else 10
# 计算游程平滑阈值
thres=char_width//10
h,w=dst.shape
for r in range(h):
c=0
while c<w and dst[r,c]==0:
c+=1
max_w=0
for i in range(w-1,-1,-1):
if dst[r,i] !=0:
max_w=i
break
start=0
end=0
flag=True
for j in range(c,max_w):
if flag and dst[r,j]==0:
start=j
flag=False
if not flag and dst[r,j]!=0:
end=j
if end>start and end-start <= thres:
k=start
while k<end:
dst[r,k]=255
k+=1
flag=True
return dst
処理後の結果は次のとおりです。
2.3、垂直投影
これは計算が簡単なので、ここでは紹介しません。結果を直接見てください:
2.4。ショートスラッシュの傾斜角の統計計算
1.垂直投影角度測定の原理
すると、傾斜角の計算式は次のようになります。
つまり、上の2番目の画像から傾斜フォントの角度を計算でき、2番目の画像が投影曲線です。したがって、傾斜角である投影曲線の角度を計算します。
なお、ファジー領域の境界における投影曲線の形状は、文字の構造と大きな関係があります。たとえば、文字の境界が垂直ストローク(英字X)ではない場合や、境界ストロークが斜角(A、Wなど)で得られる文字に干渉します。したがって、短いスラッシュのすべての傾斜がイタリック体の傾斜であるとは限りません。一般に、正しいポリラインの数は、正しくないポリラインよりも多くなります。これに基づいて、この論文では、アルゴリズムを設計するときに正しい角度を取得するために投票を使用します。つまり、取得したすべての角度について、投票によって最も頻繁に現れる角度であり、この角度があなたが探している傾斜角度です。
2.コードの実装
コードは会社のものであるため、ここでは詳しく説明しません。再度投稿したり、困っている友達がプライベートにチャットしたりできます。解決のお手伝いをします。
2.5、傾き補正
def bilinear_interpolation(image,angle,center,y_min,y_max):
'''对倾斜字体进行双线性插值'''
center_x, center_y=center
h,w=image.shape
dst=np.zeros((h,w),dtype=np.uint8)
for r in range(h):
for c in range(w):
#计算原图上的坐标
i = r
if r<center_y:
j=c+(center_y-r)/math.tan(angle)
elif r>center_y:
j=c-(r-center_y)/math.tan(angle)
else:
j=c
#计算源图上的四个近邻点
x_0=max(int(np.floor(j)),0)
y_0=max(int(np.floor(i)),0)
x_1=min(x_0+1,w-1)
y_1=min(y_0+1,h-1)
#双线性插值
if (x_0 >=x_1) or (y_0>=y_1):
continue
value0=((x_1-j)*image[y_0,x_0]+(j-x_0)*image[y_0,x_1])
value1=((x_1-j)*image[y_1,x_0]+(j-x_0)*image[y_1,x_1])
dst[r,c]=int(((y_1-i)*value0+(i-y_0)*value1))
return dst
def correct_slanted_fonts(image,mask,angle):
'''倾斜字体的矫正'''
h,w=mask.shape
# 计算倾斜字体的中心点
center_x=0
center_y=0
num=0
for r in range(h):
for c in range(w):
if mask[r,c]==255:
center_x+=c
center_y+=r
num+=1
center_x=center_x//num
center_y=center_y//num
#计算文本的上下边界
ver_vec=np.sum(mask,axis=1)
up=0
down=0
h=ver_vec.shape[0]
for i in range(h):
if ver_vec[i]!=0:
up=i
break
for i in range(h-1,-1,-1):
if ver_vec[i]!=0:
down=i
break
#对图像进行双线性插值
dst=bilinear_interpolation(image,angle,(center_x,center_y),up,down)
# cv2.namedWindow("test1",0)
# cv2.imshow("test1", dst)
# cv2.waitKey(0)
return dst
第三に、アルゴリズム実装の最終結果
修正後の最終結果:
参照: