Halcon二维仿射变换实例探究

二维仿射变换,顾名思义就是在二维平面内,对对象进行平移、旋转、缩放等变换的行为(当然还有其他的变换,这里仅论述这三种最常见的)。

Halcon中进行仿射变换的常见步骤如下:

① 通过hom_mat2d_identity算子创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]);

② 在初始化矩阵的基础上,使用hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、hom_mat2d_scale(缩放)等生成仿射变换矩阵;(这几个算子可以叠加或者重复使用

③ 根据生成的变换矩阵执行仿射变换,执行仿射变换的算子通常有:

affine_trans_image

affine_trans_region

affine_trans_contour_xld

即不管对于图像、区域、XLD都可以执行仿射变换。

下面用一个完整程序分别展示hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、hom_mat2d_scale(缩放)这三个算子的的具体功能。(特别要注意程序注释部分)

hom_mat2d_translate( : : HomMat2D, Tx, Ty : HomMat2DTranslate)

hom_mat2d_rotate( : : HomMat2D, Phi, Px, Py : HomMat2DRotate)

hom_mat2d_scale( : : HomMat2D, Sx, Sy, Px, Py : HomMat2DScale)

程序所用图片如下:

                                  

 

 read_image (Image, 'C:/Users/lfw/Desktop/仿射变换.PNG')
rgb1_to_gray(Image,GrayImage)
threshold (GrayImage, Region, 0, 200)
opening_circle (Region, Region, 1.5)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
*得到变换的中心点
area_center (SelectedRegions, Area, Row, Column)
dev_set_draw ('margin')

*hom_mat2d_translate中的两个参数的意思是:Tx和Ty分别代表Row方向和Column方向的平移量
dev_display (GrayImage)
disp_cross (3600, Row, Column, 10, 40)
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity,30, 150, HomMat2DTranslate)
affine_trans_region (Region, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')

*hom_mat2d_rotate中的三个参数的意思是:旋转角度(逆时针为正,弧度制),旋转中心的row和column值
dev_display (GrayImage)
disp_cross (3600, Row, Column, 10, 40)
hom_mat2d_rotate (HomMat2DIdentity, rad(20), Row, Column, HomMat2DRotate)
affine_trans_region (Region, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor')

*hom_mat2d_scale中的四个参数的意思是:Sx和Sy分别代表Row方向和Column方向的缩放系数,缩放中心的row和column值
dev_display (Image)
disp_cross (3600, Row, Column, 10, 40)
hom_mat2d_scale (HomMat2DIdentity, 2.0, 1.05, Row, Column, HomMat2DScale)
affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')

效果分别如下:

                                         

                                    

                                    

有时候,并不需要创建初始化矩阵也可以执行仿射变换,例如vector_angle_to_rigid算子就是如此。

vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)

该算子意思是:先将图像旋转,旋转角度为(Angle2 - Angle1) (逆时针为正),旋转中心坐标是(Row1, Column1)。再将原图的点(Row1, Column1)一一对应移到点 (Row2, Column2)上,移动的row和column方向的位移分别是( Row2 - Row1)、( Column2 - Column1),
 

如果Row1 = Row2, Column1 = Column2,那么就完整等价于旋转变换。可以执行下面的程序感受一下:

 1 read_image (Image, 'hogn-1.jpg')
 2 Row := 100
 3 Column := 200
 4 dev_display (Image)
 5 
 6 
 7 for Index := 1 to 150 by 1  
 8     vector_angle_to_rigid (Row, Column, 0, Row, Column, rad(10), HomMat2D)
 9     disp_cross (3600, 100, 200, 10, 40)
10     affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'nearest_neighbor', 'false')
11     copy_image (ImageAffinTrans, Image) 
12 endfor

可以将vector_angle_to_rigid理解为同时执行旋转变换和平移变换。最难弄明白的是旋转中心是什么?下面的程序可以说明如果先旋转后平移,那么旋转中心是(Row1, Column1),而不是 (Row2, Column2)。(如果先平移后旋转,那么结论刚好相反,大家可以试试)

 1 read_image (Image, 'hogn-1.jpg')
 2 Row1 := 100
 3 Column1 := 100
 4 
 5 Row2 := 100
 6 Column2 := 200
 7 dev_display (Image)
 8 *用vector_angle_to_rigid实现缩放、平移
 9 vector_angle_to_rigid (Row1, Column1, 0, Row2, Column2, rad(10), HomMat2D)
10 affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'nearest_neighbor', 'false')
11 
12 *分两步依次执行缩放、平移
13 hom_mat2d_identity (HomMat2DIdentity)
14 hom_mat2d_rotate (HomMat2DIdentity, rad(10) - 0, Row1, Column1, HomMat2DRotate)
15 hom_mat2d_translate (HomMat2DRotate,Row2 - Row1, Column2 - Column1, HomMat2DTranslate)
16 *观察图像ImageAffinTrans和ImageAffinTrans_2能够完全重合
17 affine_trans_image (Image, ImageAffinTrans_2, HomMat2DTranslate, 'nearest_neighbor', 'false')
18 
19 disp_cross (3600, Row1, Column1, 10, 40)

vector_angle_to_rigid最常用到的场合一般是模板匹配之类的算法场合,通常用在find_shape_model等算子后面。

下面用一个例子说明一下仿射变换的综合应用,即当图片旋转90°时,想办法变换Region使之能够翻转到对应的位置。

                                              

将图片顺时针翻转90°的方法可以是:rotate_image (image, ImageRotate, -90, 'constant')。

但其实它不仅经过了旋转变换、还进行了平移变换,最明显的证据就是:翻转前后的图像,他们的中心点坐标不一样。完整程序如下:

 1 read_image (image, 'C:/Users/happy xia/Desktop/dynPic.png')
 2 binary_threshold (image, Region, 'max_separability', 'dark', UsedThreshold)
 3 dev_set_draw ('margin')
 4 connection (Region, ConnectedRegions)
 5 select_shape_std (ConnectedRegions, SelectedReg, 'max_area', 70)
 6 area_center (image, Area, Row, Column)
 7 
 8 rotate_image (image, ImageRotate, -90, 'constant')
 9 area_center (ImageRotate, Area2, Row2, Column2)
10 
11 hom_mat2d_identity (HomMat2DIdentity)
12 hom_mat2d_rotate (HomMat2DIdentity, -rad(90), Row, Column, HomMat2DRotate)
13 hom_mat2d_translate (HomMat2DRotate,Row2 - Row, Column2 - Column, HomMat2DTranslate)
14 
15 affine_trans_region (SelectedReg, RegionAffineTrans, HomMat2DTranslate, 'constant')

                                                    

该算法顺利达到了目的——图像翻转以后,原先生成的Region也翻转到了对应的位置。

注意:用rotate_image 算子旋转图像时,如果旋转角度不是0°、90°、180°、270°等角度,那么图像其实只做了旋转变换,而没有进行平移变换。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HALCON中,仿射变换是常用的几何变换之一。它可以用来对图像进行平移、旋转、缩放等操作。通过改变图像的几何属性,仿射变换可以对图像进行形状和大小的调整,以及位置和方向的改变。对于HALCON中的仿射变换,具体的实现可以参考给出的HALCON投影变换实例文件"2d_data_codes_rectify_symbol.hdev"。 需要注意的是,HALCON中的线性变换不包含平移,所以并没有归入几何变换的范畴。而相似变换是仿射变换的一种简单情况,它们可以发生在二维空间或三维空间中。 在机器视觉系统中,镜头是重要的成像部件之一,而基于小孔成像原理的工业镜头可能会引起透视畸变。为了进行图像分析,需要对畸变进行校正,而投影变换是其中一种几何变换方法。除了投影变换,HALCON中还提供了平移、旋转、缩放等常用的几何变换操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [halcon中相似变换、仿射变换、投影变换的区别以及应用方式和例程](https://blog.csdn.net/weixin_42398658/article/details/105810328)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值