アフィン変換におけるせん断変換の研究と応用

アフィン変換は、平行移動、反転、回転、スケーリング、せん断変換の5つの変換の組み合わせです。

せん断変換は上記の5つ目の変換です。

画像のせん断は、投影面上での平面物体の非直角投影を表します。せん断により、画像内の図形が歪みます。一般的には、水平方向のせん断垂直方向のせん断の2種類があります。(下図参照)

具体的な数学的説明については、以下のブログ記事を参照してください:https://blog.csdn.net/ghy_111/article/details/78056441

以下では、Halconを使用したせん断変換の具体的な使用方法について詳しく見ていきます。

一、水平方向のせん断——X方向のせん断

コード例:

 1 read_image (Image1, '未标题-1.png')
 2 rgb1_to_gray (Image1, GrayImage)
 3 threshold (GrayImage, Region, 0, 200)
 4 area_center (GrayImage, Area, CenterRow, CenterColumn)
 5 gen_rectangle2 (Rectangle, CenterRow, CenterColumn, 0, 300, 150)
 6 intersection (Region, Rectangle, IntersectionRegion)
 7 area_center (IntersectionRegion, Area1, Row1, Column1)  //<strong>中央の文字列の中心点を求める
</strong> 8 gen_cross_contour_xld (Cross, Row1, Column1, 16, 0.785)
 9 
10 * 文字領域の傾き角度を取得
11 <strong>text_line_slant </strong>(IntersectionRegion, GrayImage, <strong>85</strong>, -0.723599, 0.723599, SlantAngle)  //<strong>85は文字のピクセル高さ
</strong>12 
13 * マトリックスの初期化
14 hom_mat2d_identity (IdentityMatrix)
15 
16 * <strong>SlantAngleは以前に取得した文字の傾き角度</strong>であり、これを修正するためには逆方向に傾ける必要がある
17 hom_mat2d_slant (IdentityMatrix, <strong>-SlantAngle, 'x'</strong>, Row1, Column1, SlantMatrix)
18 affine_trans_image (Image1, <strong>AffineTransformedImage</strong>, SlantMatrix, 'constant', 'false')

出力されるAffineTransformedImageの画像は以下のようになります:(文字が正しく向きを修正されています)

二、垂直方向のせん断——Y方向のせん断

コード例:

 1 read_image (Image2, '未标题-2.png')
 2 rgb1_to_gray (Image2, GrayImage)
 3 threshold (GrayImage, Region, 0, 200)
 4 area_center (GrayImage, Area, CenterRow, CenterColumn)
 5 gen_rectangle2 (Rectangle, CenterRow, CenterColumn, 0, 300, 150)
 6 intersection (Region, Rectangle, IntersectionRegion)
 7 area_center (IntersectionRegion, Area1, Row1, Column1)
 8 gen_cross_contour_xld (Cross, Row1, Column1, 16, 0.785)
 9 
10 * 文字領域の傾き角度を取得(<strong>Y方向のせん断、この演算子は使えない場合がある</strong>)
11 * text_line_slant (IntersectionRegion, GrayImage, 85, -0.723599, 0.723599, SlantAngle)
12 
13 * マトリックスの初期化
14 hom_mat2d_identity (IdentityMatrix)
15 
16 * SlantAngleは以前に取得した文字の傾き角度であり、これを修正するためには逆方向に傾ける必要がある
17 <strong>hom_mat2d_slant</strong> (IdentityMatrix, <strong>0.18, 'y'</strong>, Row1, Column1, SlantMatrix)
18 affine_trans_image (Image2, <strong>AffineTransformedImage</strong>, SlantMatrix, 'constant', 'false')

出力されるAffineTransformedImageの画像は以下のようになります:(文字が正しく向きを修正されています)

三、原画像での水平方向と垂直方向のせん断

コード例:

 1 read_image (Image3, '未标题-3.png')
 2 rgb1_to_gray (Image3, GrayImage)
 3 threshold (GrayImage, Region, 0, 200)
 4 area_center (GrayImage, Area, CenterRow, CenterColumn)
 5 gen_rectangle2 (Rectangle, CenterRow, CenterColumn, 0, 300, 150)
 6 intersection (Region, Rectangle, IntersectionRegion)
 7 area_center (IntersectionRegion, Area1, Row1, Column1)
 8 gen_cross_contour_xld (Cross, Row1, Column1, 16, 0.785)
 9 
10 * マトリックスの初期化
11 hom_mat2d_identity (IdentityMatrix)
12 <strong>hom_mat2d_slant</strong> (IdentityMatrix, <strong>0.3, 'x'</strong>, Row1, Column1, SlantMatrix)
13 * 一時的な結果確認
14 affine_trans_image (GrayImage, TempImage, SlantMatrix, 'constant', 'false')
15 <strong>hom_mat2d_slant</strong> (SlantMatrix, <strong>-0.4, 'y'</strong>, Row1, Column1, <strong>CombinedSlantMatrix</strong>)
16 affine_trans_image (Image3, AffineTransformedImage, CombinedSlantMatrix, 'constant', 'false')
17 
18 * 反せん断で元に戻す試み(<strong>失敗</strong>)
19 hom_mat2d_identity (IdentityMatrix)
20 <strong>hom_mat2d_slant</strong> (IdentityMatrix, <strong>0.4, 'y'</strong>, Row1, Column1, SlantMatrix)
21 <strong>hom_mat2d_slant</strong> (SlantMatrix, <strong>-0.3, 'x'</strong>, Row1, Column1, <strong>InverseSlantMatrix</strong>)
22 affine_trans_image (AffineTransformedImage, <strong>RevertedImage</strong>, <strong>InverseSlantMatrix</strong>, 'constant', 'false')
23 
24 * 逆行列を使用して元に戻す試み(<strong>成功</strong>)
25 <strong>hom_mat2d_invert</strong> (CombinedSlantMatrix, InverseMatrix)
26 affine_trans_image (AffineTransformedImage, <strong>CorrectedImage</strong>, <strong>InverseMatrix</strong>, 'constant', 'false')

出力されるRevertedImageの画像は以下のようになります:(元の画像の文字とは若干異なる)

出力されるCorrectedImageの画像は以下のようになります:(元の画像の文字と完全に一致)

四、まとめ

① 演算子text_line_slantは一行の文字の水平せん断角度を取得できます。

② 水平せん断と垂直せん断は、どちらもアフィン変換によって修正できます。

③ 正しい逆行列を見つけられれば、複数のせん断変換後の図形を元の形状に戻すことができます。

text_line_slant演算子が機能しない場合でも、外輪郭のフィッティングや直線の傾き角度を求めることでせん断角度を得ることができます。(詳細は省略)

⑤ せん断変換は「斜体文字」のOCR認識によく使用されます。下図のように、斜体文字を正体文字に変換し、文字を分割してからOCR認識を行うことができます。

タグ: halcon アフィン変換 せん断変換 OCR 画像処理

6月9日 22:31 投稿