仿射變換中錯切變換的研究與應用

 

仿射變換是平移、翻轉、旋轉、縮放、錯切這五種變換的組合。

 

 

錯切變換就是上圖中的第5種

 

圖像的錯切實際上是平面景物在投影平面上的非垂直投影。錯切使圖像中的圖形產生扭變,其一般有兩種情況:水平方向錯切、垂直方向錯切。(如下圖所示)

 

 

 

具體數學解釋,可參考網上的這篇博客:https://blog.csdn.net/ghy_111/article/details/78056441

 

 

下面,我們來研究一下錯切變換在Halcon中的具體使用方法。

 

 

一、水平方向錯切——X向錯切

 

 

代碼如下:

 1 read_image (Image1, '未標題-1.png')
 2 rgb1_to_gray (Image1, Image)
 3 threshold (Image, Region, 0, 200)
 4 area_center (Image, Area, Row, Column)
 5 gen_rectangle2 (Rectangle, Row, Column, 0, 300, 150)
 6 intersection (Region, Rectangle, Region)
 7 area_center (Region, Area1, Row1, Column1)  //求出中間一行字的中心點
 8 gen_cross_contour_xld (Cross, Row1, Column1, 16, 0.785)
 9 
10 *獲取字體區域偏轉的角度
11 text_line_slant (Region, Image, 85, -0.723599, 0.723599, SlantAngle)  //85是字符的像素高度
12 
13 *生成矩陣初始化
14 hom_mat2d_identity (HomMat2DIdentity)
15 
16 *SlantAngle是之前獲取的字體斜了多少度,那麼要轉正的話就要糾正這個偏轉角度,所以就要向相反方向偏正
17 hom_mat2d_slant (HomMat2DIdentity, -SlantAngle, 'x', Row1, Column1, HomMat2DSlant)
18 affine_trans_image (Image1, ImageAffinTrans, HomMat2DSlant, 'constant', 'false')

 

輸出的ImageAffinTrans圖如下:(可見圖中文字已被轉正)

 

 

二、垂直方向錯切——Y向錯切

 

代碼如下:

 1 read_image (Image2, '未標題-2.png')
 2 rgb1_to_gray (Image2, Image)
 3 threshold (Image, Region, 0, 200)
 4 area_center (Image, Area, Row, Column)
 5 gen_rectangle2 (Rectangle, Row, Column, 0, 300, 150)
 6 intersection (Region, Rectangle, Region)
 7 area_center (Region, Area1, Row1, Column1)
 8 gen_cross_contour_xld (Cross, Row1, Column1, 16, 0.785)
 9 
10 *獲取字體區域偏轉的角度(Y向錯切,這行算子貌似不可用11 * text_line_slant (Region, Image, 85, -0.723599, 0.723599, SlantAngle)
12 
13 *生成矩陣初始化
14 hom_mat2d_identity (HomMat2DIdentity)
15 
16 *SlantAngle是之前獲取的字體斜了多少度,那麼要轉正的話就要糾正這個偏轉角度,所以就要向相反方向偏正
17 hom_mat2d_slant (HomMat2DIdentity, 0.18, 'y', Row1, Column1, HomMat2DSlant)
18 affine_trans_image (Image2, ImageAffinTrans, HomMat2DSlant, 'constant', 'false')

 

輸出的ImageAffinTrans圖如下:(可見圖中文字已被轉正)

 

 

三、原圖嘗試水平方向+垂直方向錯切

 

 

代碼如下:

 1 read_image (Image3, '未標題-3.png')
 2 rgb1_to_gray (Image3, Image)
 3 threshold (Image, Region, 0, 200)
 4 area_center (Image, Area, Row, Column)
 5 gen_rectangle2 (Rectangle, Row, Column, 0, 300, 150)
 6 intersection (Region, Rectangle, Region)
 7 area_center (Region, Area1, Row1, Column1)
 8 gen_cross_contour_xld (Cross, Row1, Column1, 16, 0.785)
 9 
10 * 生成矩陣初始化
11 hom_mat2d_identity (HomMat2DIdentity)
12 hom_mat2d_slant (HomMat2DIdentity, 0.3, 'x', Row1, Column1, HomMat2DSlant)
13 * 臨時觀察旋轉圖結果
14 affine_trans_image (Image, ImageTemp, HomMat2DSlant, 'constant', 'false')
15 hom_mat2d_slant (HomMat2DSlant, -0.4, 'y', Row1, Column1, HomMat2DSlant2)
16 affine_trans_image (Image3, ImageAffinTrans, HomMat2DSlant2, 'constant', 'false')
17 
18 * 嘗試通過反錯切,看能否仿射回來(×)
19 hom_mat2d_identity (Hom)
20 hom_mat2d_slant (Hom, 0.4, 'y', Row1, Column1, HomSlant)
21 hom_mat2d_slant (HomSlant, -0.3, 'x', Row1, Column1, HomSlant2)
22 affine_trans_image (ImageAffinTrans, ImageBack, HomSlant2, 'constant', 'false')
23 
24 * 通過逆矩陣仿射試試(25 hom_mat2d_invert (HomMat2DSlant2, HomMat2DInvert)
26 affine_trans_image (ImageAffinTrans, ImageBack2, HomMat2DInvert, 'constant', 'false')

 

輸出的ImageBack圖如下:(與原圖中的字有一定出入,具體應該怎麼正確構造這個反向仿射矩陣,我還不是很清楚)

 

輸出的ImageBack2圖如下:(與原圖中的字完全一致)

 

 

四、總結

 

① 算子text_line_slant 能獲得一行文字的水平錯切角度

② 水平錯切、垂直錯切,均可以通過仿射變換校正。

③ 只要能找到正確的逆矩陣,就可以將多次錯切變換後的圖形仿射回原始形狀。

④ 當text_line_slant算子無法起作用時,也可以通過擬合外輪廓,擬合直線求傾斜角的方式得到錯切角度。(具體本文略去) 

⑤ 錯切變換經常用於“斜體文字”的OCR識別。下圖中可先將斜體字轉成正體字,然後分割字符,再進行OCR識別。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章