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

 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')

 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')

 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')

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

② 水平错切、垂直错切，均可以通过仿射变换校正。

③ 只要能找到正确的逆矩阵，就可以将多次错切变换后的图形仿射回原始形状。

④ 当text_line_slant算子无法起作用时，也可以通过拟合外轮廓，拟合直线求倾斜角的方式得到错切角度。（具体本文略去）

⑤ 错切变换经常用于“斜体文字”的OCR识别。下图中可先将斜体字转成正体字，然后分割字符，再进行OCR识别。

posted on 2022-07-07 19:19  xh6300  阅读(1019)  评论(0编辑  收藏  举报