opencvに基づく傾斜したテキスト行の修正

これは主に、私の作品で傾斜したフォントのテキスト行を修正する方法の調査を記録するためのものです。ナンセンスはあまりありません。見てみましょう。


目次

1.アルゴリズムのフローチャート

2、アルゴリズムの実装

2.1、前処理

2.2、レベルがぼやけている

2.3、垂直投影

2.4。ショートスラッシュの傾斜角の統計計算

2.5、傾き補正

第三に、アルゴリズム実装の最終結果


斜めのテキストラインフォントの修正は、主に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.垂直投影角度測定の原理

イタリックの要約は 、平行四辺形として見ることができます。 一般に、 黒いピクセル 構成される平行四辺形の立体画像の場合 、垂直投影ヒストグラムは台形です。詳細は次のとおりです。

すると、傾斜角の計算式は次のようになります。

                             \ small tan(A)= \ frac {y_ {1}} {x_ {2} -x_ {1}}

                            \ small \ angle A = arctan(\ frac {y_ {1}} {x_ {2} -x_ {1}})

つまり、上の2番目の画像から傾斜フォントの角度を計算でき、2番目の画像が投影曲線です。したがって、傾斜角である投影曲線の角度を計算します。

しかし、 2.3 見た投影図では、まず、斜体のぼけのレベルが理想的な平行四辺形ではありません。次に、複数の斜端のぼけ傾斜角情報と図面が存在しますが、計算エラーなどの理由がある可能性があります。いくつかのエラーより正確な角度測定情報を取得するには、すべての傾斜角度情報を統計的に分析する必要があります。

なお、ファジー領域の境界における投影曲線の形状は、文字の構造と大きな関係があります。たとえば、文字の境界が垂直ストローク(英字X)ではない場合や、境界ストロークが斜角(A、Wなど)で得られる文字に干渉します。したがって、短いスラッシュのすべての傾斜がイタリック体の傾斜であるとは限りません。一般に、正しいポリラインの数は、正しくないポリラインよりも多くなります。これに基づいて、この論文では、アルゴリズムを設計するときに正しい角度を取得するために投票を使用します。つまり、取得したすべての角度について、投票によって最も頻繁に現れる角度であり、この角度があなたが探している傾斜角度です。

2.コードの実装

コードは会社のものであるため、ここでは詳しく説明しません。再度投稿したり、困っている友達がプライベートにチャットしたりできます。解決のお手伝いをします。

2.5、傾き補正

画像内の斜めの文字の修正は、実際にはピクセル座標の空間回転変換です。 傾斜文字が右にねじれていると仮定すると Xは、 横軸と一致する軸線 、及び 方向 Yは、 文字のねじれ方向である軸 Y 軸の方向が水平軸に垂直に なるように文字画像を水平方向に回転させる と、画像の歪みが補正され ます。 傾斜した文字「 を例にとる と、 空間変換式は次のように導出されます。

回転すると、 Aの 下の文字 部分が水平方向に右 移動し 上の部分が水平方向に左に移動します。Bの例として、点セットは、座標値、回転I、J)が、それは、ときに右の縦軸と同じレベルを知ることは容易であり、横軸は増加BCを、変換式です
 
                                               
同様 に、 左シフト部分の変換式は 次のとおりです
 
                                               
ただし、画像内の点の座標値は整数のままである ため、変換後に得られる結果を丸める必要があります。 これ により、エラーが発生し 必然的に画像の歪みが発生します。 この論文では、双線形補間が丸めによる歪みを低減するために使用され 補正二値画像を平滑化する 補間によって生じるバリポイントを排除します。
 
具体的な実装は次のとおりです。
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

第三に、アルゴリズム実装の最終結果

次に、修正が必要なサンプルテキストデータを見てみましょう。具体的なサンプル画像は次のとおりです。

 修正後の最終結果:

参照:

イタリック体の印刷文字の傾斜角を検出するためのアルゴリズム

おすすめ

転載: blog.csdn.net/wxplol/article/details/105567497