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 形状和变换方式,结合图像预处理提升效果。
