仿射变换中错切变换的研究与应用

仿射变换中错切变换的研究与应用仿射变换是平移、翻转、旋转、缩放、错切这五种变换的组合。错切变换就是上图中的第5种。图像的错切实际上是平面景物在投影平面上的非垂直投影。错切使图像中的图形产生扭变,其一般有两种情况:水平方向错切、垂直方向错切。(如下图所示)具体数学解释,可参考网上的这篇博客:https://blog.csdn

大家好,欢迎来到IT知识分享网。

 

仿射变换是平移、翻转、旋转、缩放、错切这五种变换的组合。

 

仿射变换中错切变换的研究与应用

 

错切变换就是上图中的第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识别。

 

仿射变换中错切变换的研究与应用

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/31359.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信