当前位置: 首页 > news >正文

Halcon ROI 与图像仿射变换笔记

一、ROI(感兴趣区域)操作

ROI(Region of Interest)是图像中需要重点处理的区域,通过提取 ROI 可减少计算量并聚焦关键信息。

1. ROI 创建方式

(1)工具创建(手动绘制后自动生成代码)

在 HDevelop 图形窗口中手动绘制 ROI,通过「工具→插入代码」生成区域代码:

* 圆形ROI
gen_circle (ROI_0, 160.047, 691.688, 128.546)
* 椭圆ROI
gen_ellipse (ROI_0, 813.953, 466.688, rad(-1.4321), 281.338, 42.8571)
* 带旋转的矩形ROI
gen_rectangle2 (ROI_0, 80.9348, 215.78, rad(-38.8627), 57.489, 23.0014)
(2)交互式创建(运行时手动绘制)
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
read_image (Image, 'printer_chip/printer_chip_01')
​
* 圆形
draw_circle (WindowHandle, Row, Column, Radius)  * 交互获取参数
gen_circle (Circle, Row, Column, Radius)         * 生成圆形区域
​
* 椭圆
draw_ellipse (WindowHandle, Row1, Column1, Phi, Radius1, Radius2)
gen_ellipse (Ellipse, Row1, Column1, Phi, Radius1, Radius2)
​
* 不规则多边形
draw_polygon (PolygonRegion, WindowHandle)  * 直接生成多边形区域
​
* 直线
draw_line (WindowHandle, Row1, Column1, Row2, Column2)
​
* 矩形
draw_rectangle1 (WindowHandle, Row11, Column11, Row21, Column21)

2. ROI 区域运算

(1)基本集合运算
* 交集(两区域重叠部分)
intersection (Circle1, Circle2, RegionIntersection)
​
* 差集(区域1减去与区域2重叠的部分)
difference (Circle1, Circle2, RegionDifference)
​
* 反选(图像中除区域外的部分)
complement (Circle1, RegionComplement)
​
* 对称差集(两区域合并后减去交集)
symm_difference (Circle1, Circle2, RegionSymmDiff)
​
* 合并区域
union1 (ConnectedRegions, RegionUnion)  * 合并多个区域(输入为区域集合)
union2 (Circle1, Circle2, RegionUnion2) * 合并两个区域
(2)ROI 提取与保存
read_image (Image, 'clip')
zoom_image_factor (Image, ImageZoomed, 0.5, 0.5, 'constant')  * 缩放图像
​
* 生成带旋转的矩形ROI
gen_rectangle2 (ROI, 80.9348, 215.78, rad(-38.8627), 57.489, 23.0014)
​
* 提取ROI区域(原图中仅保留ROI,其他区域为黑)
reduce_domain (ImageZoomed, ROI, ImageReduced)
​
* 裁剪ROI为独立图像(尺寸与ROI一致)
crop_domain (ImageReduced, ImagePart)
​
* 保存结果
dump_window (WindowHandle, 'bmp', './roi_window')  * 保存窗口截图
write_image (ImagePart, 'png', 1, './roi_image')   * 保存裁剪后的图像

二、图像仿射变换

仿射变换用于调整图像的位置、大小、角度等,支持平移、旋转、缩放、斜切,通过变换矩阵实现。

1. 变换矩阵生成

(1)基础变换矩阵
* 初始化单位矩阵(无变换)
hom_mat2d_identity (HomMat2DIdentity)
​
* 平移(Tx:行方向偏移,Ty:列方向偏移)
hom_mat2d_translate (HomMat2DIdentity, Tx, Ty, HomMat2DTranslate)
​
* 旋转(Phi:弧度制角度,Px/Py:旋转中心)
hom_mat2d_rotate (HomMat2DIdentity, Phi, Px, Py, HomMat2DRotate)
​
* 缩放(Sx/Sy:缩放比例,Px/Py:缩放中心)
hom_mat2d_scale (HomMat2DIdentity, Sx, Sy, Px, Py, HomMat2DScale)
​
* 斜切(Theta:弧度制角度,Axis:'x'或'y',斜切轴)
hom_mat2d_slant (HomMat2DIdentity, Theta, 'x', Px, Py, HomMat2DSlant)
(2)组合变换(基于已有矩阵累加)
* 先平移再旋转(基于平移矩阵继续旋转)
hom_mat2d_translate (HomMat2DIdentity, 200, 100, HomMat2DTranslate)
hom_mat2d_rotate (HomMat2DTranslate, 0.78, 200, 100, HomMat2DRotate)  * 0.78弧度≈45°

2. 基于点对的变换矩阵计算

通过对应点对生成变换矩阵,适用于已知特征点的场景:

* 刚性变换(旋转+平移,需要至少2对点)
vector_to_rigid (Px, Py, Qx, Qy, HomMat2D)  * P:原始点,Q:变换后点
​
* 相似变换(旋转+平移+缩放,需要至少2对点)
vector_to_similarity (Px, Py, Qx, Qy, HomMat2D)
​
* 仿射变换(支持斜切,需要至少3对点)
vector_to_hom_mat2d (Px, Py, Qx, Qy, HomMat2D)

3. 执行仿射变换

(1)对图像执行变换
affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'bilinear', 'false')  * 插值方式:bilinear(双线性)更平滑
(2)对区域 / 轮廓执行变换
* 区域变换
affine_trans_region (Region, RegionAffineTrans, HomMat2D, 'nearest_neighbor')* XLD轮廓变换
affine_trans_contour_xld (Contours, ContoursAffinTrans, HomMat2D)

4. 透视变换(纠正倾斜 / 畸变)

用于解决透视畸变(如二维码倾斜、文档拍摄角度问题),需至少 4 对点:

read_image (Image, 'toushi.png')  * 带透视畸变的图像* 原始畸变区域的4个角点(按顺序选取)
Row := [159, 277, 357, 77]    * 行坐标
Col := [127, 120, 360, 333]   * 列坐标* 目标矩形的4个角点(与原始点顺序对应)
Qx := [75, 360, 360, 75]
Qy := [110, 110, 360, 360]* 计算透视变换矩阵
hom_vector_to_proj_hom_mat2d (Row, Col, [1,1,1,1], Qx, Qy, [1,1,1,1], 'normalized_dlt', HomMat2D)* 执行透视校正
projective_trans_image (Image, TransImage, HomMat2D, 'bilinear', 'false', 'false')

5. 案例:区域旋转动画

read_image (Image, 'affine.jpg')
threshold (Image, Region, 0, 200)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)  * 选最大区域
area_center (SelectedRegions, Area, Row, Column)  * 获取区域中心* 循环旋转区域
dev_display (Image)
hom_mat2d_identity (HomMat2DIdentity)
for Index := 1 to 150 by 1  * 每次旋转10度(围绕区域中心)hom_mat2d_rotate (HomMat2DIdentity, rad(10*Index), Row, Column, HomMat2DRotate)affine_trans_region (SelectedRegions, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor')dev_clear_window ()dev_display (Image)dev_display (RegionAffineTrans)
endfor

总结

  • ROI 操作:通过交互式绘制或工具生成区域,结合集合运算(交、并、差)提取关键区域,用于聚焦分析对象。

  • 仿射变换:通过变换矩阵实现平移、旋转、缩放、斜切,适用于图像校正和姿态调整。

  • 透视变换:解决复杂畸变(如倾斜、透视),需通过特征点对计算变换矩阵,广泛应用于文档校正、二维码识别等场景。

实际应用中,需根据具体需求选择 ROI 形状和变换方式,结合图像预处理提升效果。

http://www.dtcms.com/a/613945.html

相关文章:

  • 软件设计师(软考中级)公式速记笔记
  • 电商网站开发过程手机推广app
  • 18.HTTP协议(三)
  • 产科信息管理系统,智慧产科源码,支持与医院HIS、EMR系统及国家级妇幼平台的数据对接
  • 在VPython中使用向量计算3D物体移动
  • R语言在线编译器 | 提供方便快捷的数据分析工具
  • YOLOv8多场景人物识别定位与改进ASF-DySample算法详解
  • 网网站基础建设优化知识成都感染人数最新消息
  • 电商网站建设实训要求威海好的网站建设公司哪家好
  • Ionic 安装指南
  • kubernetes 导入镜像tar包
  • 南通网站开发上海网站搭建
  • oracle 物化视图设置自动更新日志
  • Java测试题
  • YOLO v11的学习记录(五) 使用自定义数据从头训练一个实例分割的模型
  • 大模型Agent工作流设计模式深度解析:从ReAct到ReWOO的实践演进
  • redis的配置windows
  • 漯河英文网站建设秦皇岛陵县网站建设
  • HTML5+CSS3+JS小实例:螺旋鼠标轨迹
  • 长沙市云网站建设大型电商网站开发方案
  • 从一到无穷大 #57:Snowflake的剪枝方案
  • 网页网站的区别是什么最适合seo的wordpress主题
  • 深入理解 OverlayFS:用分层的方式重新组织 Linux 文件系统
  • 定制型网站制作公司织梦图片自适应网站源码
  • 解决mac端pycharm执行allure命令报错:returned non-zero exit status 127
  • 公司官网制作报价青岛关键词优化平台
  • ModelScope微调模型
  • Ollama本地电脑运行无限制AI模型超简单案例
  • 银川网站建设那家好品牌整合营销方案
  • 南京手机网站制作公司手机做图纸app下载网站