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

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)

程序所用图片如下:

  1. read_image (Image, 'hogn-1.jpg')
  2. threshold (Image, Region, , )
  3. opening_circle (Region, Region, 1.5)
  4. connection (Region, ConnectedRegions)
  5. select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', )
  6. *得到变换的中心点
  7. area_center (SelectedRegions, Area, Row, Column)
  8. dev_set_draw ('margin')
  9.  
  10. *hom_mat2d_translate中的两个参数的意思是:TxTy分别代表Row方向和Column方向的平移量
  11. dev_display (Image)
  12. disp_cross (, Row, Column, , )
  13. hom_mat2d_identity (HomMat2DIdentity)
  14. hom_mat2d_translate (HomMat2DIdentity,30, 150, HomMat2DTranslate)
  15. affine_trans_region (Region, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')

  16. *hom_mat2d_rotate中的三个参数的意思是:旋转角度(逆时针为正,弧度制),旋转中心的rowcolumn
  17. dev_display (Image)
  18. disp_cross (, Row, Column, , )
  19. hom_mat2d_rotate (HomMat2DIdentity, rad(20), Row, Column, HomMat2DRotate)
  20. affine_trans_region (Region, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor')
  21.  
  22. *hom_mat2d_scale中的四个参数的意思是:SxSy分别代表Row方向和Column方向的缩放系数,缩放中心的rowcolumn
  23. dev_display (Image)
  24. disp_cross (, Row, Column, , )
  25. hom_mat2d_scale (HomMat2DIdentity, 2.0, 1.05, Row, Column, HomMat2DScale)
  26. 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 :=
  3. Column :=
  4. dev_display (Image)
  5.  
  6. for Index := to by
  7. vector_angle_to_rigid (Row, Column, 0, Row, Column, rad(10), HomMat2D)
  8. disp_cross (, , , , )
  9. affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'nearest_neighbor', 'false')
  10. copy_image (ImageAffinTrans, Image)
  11. endfor

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

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

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', )
  6. area_center (image, Area, Row, Column)

  7. rotate_image (image, ImageRotate, -, 'constant')
  8. area_center (ImageRotate, Area2, Row2, Column2)

  9. hom_mat2d_identity (HomMat2DIdentity)
  10. hom_mat2d_rotate (HomMat2DIdentity, -rad(90), Row, Column, HomMat2DRotate)
  11. hom_mat2d_translate (HomMat2DRotate,Row2 - Row, Column2 - Column, HomMat2DTranslate)
  12.  
  13. affine_trans_region (SelectedReg, RegionAffineTrans, HomMat2DTranslate, 'constant')

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

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

Halcon二维仿射变换实例探究的更多相关文章

  1. Laravel5中通过SimpleQrCode扩展包生成二维码实例

    Simple Qrcode是基于强大的Bacon/BaconQrCode库开发的针对Laravel框架的封装版本,用于在Laravel中为生成二维码提供接口. 安装SimpleQrCode扩展包 在项 ...

  2. Book of Shaders 02 - 矩阵:二维仿射变换练习

    0x00 一些废话 如果要深入学习 CG (Computer Graphics,计算机图形学),必然要学习相关的数学知识.CG 涉及到多个不同的领域,根据所研究领域的不同,也会涉及到不同的数学分支.但 ...

  3. 用Pyinstaller 实现py.转化为exe可执行文件----二维码实例

    1,安装 Pyinstaller 命令提示符窗口:pip install pyinstaller 2,制作二维码脚本 d5_code.py from MyQR import myqr #生成二维码 w ...

  4. thinkphp5动态生成二维码实例总结

    thinkphp5关于动态生成二维码类库总结: 遇到的最大问题如下:我想大部分人也碰到过,所有觉得有必要总结下: thinkphp5提示找不到Qrcode类,可是自己明明都放置到了,vendor 目录 ...

  5. Yii2.0-生成二维码实例

    原文地址:http://www.yii-china.com/post/detail/19.html

  6. js生成二维码实例(真实有效)

    js文件  qrcode.js   代码 /*from tccdn minify at 2014-6-4 14:59:43,file:/cn/c/c/qrcode.js*/ /** * @fileov ...

  7. js生成二维码实例

    <!DOCTYPE html><html><head>    <title></title>    <meta charset=&qu ...

  8. Halcon的二维码解码步骤和解码技巧

    一.二维码简介 1 . 类型多样,常见的有QR Code二维码. Data Matrix二维码等. 2.高密度编码,信息容量大. 3.容错能力强,具有纠错功能:二维码因穿孔.污损等引起局部损坏时,照样 ...

  9. 利用google api生成二维码名片例子

    二维条码/二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码.堆叠式/行排式二维条码形态上是由多行短截的一维条码堆叠而成:矩阵式二维条码以矩阵的形式组成,在矩阵相应元素位置上用“点”表示二进制“1” ...

随机推荐

  1. ionic2中跨页面回传值

    1.在跳转到新页面时传入一个contactsCallback的参数,在该参数的函数定义中做出一个承诺. 注意:最开始我本来是采用如下图方式的,但是很不幸,出现了问题,问题所在就是关于这个this的作用 ...

  2. C# 后台线程更新UI控件

    /********************************************************************************* * C# 后台线程更新UI控件 * ...

  3. ubuntu修改分辨率

    ubuntu分辨率真是坑爹,不知什么原因,ubuntu分辨率一下子变了,通过,显示->分辨率,都改不过来... 无奈,有重装系统的冲动,从网上找了很多方法,都不管用,有一次,在这里 sudo g ...

  4. A-B Problem nyoj

    A-B Problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 A+B问题早已经被大家所熟知了,是不是很无聊呢?现在大家来做一下A-B吧. 现在有两个实数A和 ...

  5. ab压力测试之post与get请求

    安装ab工具 yum install httpd-tools 参数说明 -n:执行的请求个数,默认时执行一个请求 -c:一次产生的请求个数,即并发个数 -p:模拟post请求,文件格式为gid=2&a ...

  6. 【linux】du命令

    Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...

  7. ELF文件和BIN文件

    文件的内容:1. BIN文件是 raw binary 文件,这种文件只包含机器码.2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等. 所以ELF文件的体 ...

  8. 用T4模版生成对应数据库表的实体类

    <#@ template debug="false" hostspecific="false" language="C#" #> ...

  9. centos使用163 yum源

    备份# cp /etc/yum.repos.d/CentOS-Base.repo  /etc/yum.repos.d/CentOS-Base.repo.bak修改# vi /etc/yum.repos ...

  10. 十、api自动化环境问题及解决方案汇总(持续更新)

    1.jenkins报错: Unable to read /root/.jenkins/config.xml at hudson.WebAppMain$3.run(WebAppMain.java:248 ...