一、算子分类与核心解析
1. 图像基础运算算子
这类算子主要用于图像像素级的加减乘除、格式转换、裁剪等基础操作。
表格
| sub_image | 图像灰度相减 (Img1 – Img2) | Mult=1, Add=0 表示直接相减(无缩放 / 偏移) | 背景差分、缺陷检测(减去基准图找差异) |
| mult_image | 图像灰度相乘(你备注的 “相加” 是笔误) | Mult=0.015, Add=0 表示 Img1×Img2×0.015 | 图像增强、掩膜加权运算 |
| convert_image_type | 转换图像数据类型 | 'int2' 表示 16 位有符号整型 | 避免运算溢出(如相减可能出现负数) |
| crop_part | 裁剪图像区域 | Row=0, Column=0, Width, Height | 提取感兴趣区域 (ROI) |
| scale_image_max | 图像对比度最大化 | – | 增强图像视觉辨识度 |
| rotate_image | 图像旋转 | Angle=90, 'constant' 表示旋转后填充常数 | 校正倾斜图像(如文字、条码) |
| tile_images | 拼接多幅图像 | 2, 'horizontal' 表示 2 幅水平拼接 | 可视化多步处理结果 |
| compose3/decompose3 | RGB 图像合成 / 拆分 | – | 彩色图像通道处理 |
| invert_image | 图像反相(255 – 灰度值) | – | 暗背景转亮背景,突出目标 |
| fill_interlace | 修复隔行扫描图像 | 'odd' 修复奇数行 | 解决工业相机采集的图像拼接问题 |
| polar_trans_image | 笛卡尔坐标↔极坐标转换 | 圆心 (Row,Column)、半径范围 | 处理环形 / 圆形区域(如表盘、瓶盖) |
2. 图像滤波与增强算子
这类算子用于降噪、平滑、边缘增强等预处理。
表格
| median_rect | 矩形中值滤波 | 41,41 滤波核大小 | 去除椒盐噪声(如工业图像中的斑点) |
| smooth_image | 图像平滑 | 'deriche2', 0.2 平滑算法 / 系数 | 降噪,保留边缘 |
| gray_erosion_rect | 灰度腐蚀 | 矩形核大小 | 弱化亮区域,突出暗细节 |
| gray_closing/gray_opening | 灰度闭 / 开运算 | 结构元素 | 填充小暗孔 / 去除小亮噪点 |
| hysteresis_threshold | 滞后阈值分割 | 10,20 高低阈值 | 边缘检测(如 Canny 算法的阈值环节) |
3. 区域分割与提取算子
这类算子是视觉处理的核心,用于从图像中分割出目标区域。
表格
| auto_threshold | 自动多阈值分割 | 10 直方图波谷最小距离 | 多灰度目标分割(如多色零件) |
| bin_threshold | 单阈值分割 | – | 简单黑白图像分割 |
| char_threshold | 字符专用阈值分割 | 6,95 直方图波峰参数 | 字符识别 (OCR) 的阈值提取 |
| dyn_threshold | 动态阈值分割 | 3, 'light' 偏差 / 亮目标 | 不均匀光照下的分割(如曲面物体) |
| regiongrowing | 区域生长 | 邻域大小、灰度差、最小面积 | 相似灰度区域合并(如纹理分割) |
| fast_threshold | 快速阈值分割 | 灰度范围 + 最小面积 | 实时性要求高的场景 |
| check_difference | 图像差异分割 | 'diff_outside', -255,15 | 缺陷检测(对比基准图找差异) |
| select_shape_std | 选指定特征区域 | 'max_area',70 选最大面积 | 提取主要目标(如最大的零件) |
4. 区域形态学与操作算子
对分割后的区域进行形态学处理、合并、筛选等。
表格
| closing/fill_up_shape | 区域闭运算 / 填充 | 'area',1,40 填充小面积孔洞 | 修复区域孔洞(如字符断笔) |
| intersection/difference | 区域交 / 差运算 | – | 提取重叠 / 非重叠区域 |
| complement | 区域补集 | – | 提取背景区域 |
| union2/concat_obj | 区域合并 | – | 合并分散的目标区域 |
| select_region_point | 选择包含指定点的区域 | 点坐标 (Row,Column) | 定位点击位置的目标 |
| partition_dynamic | 区域动态分割 | 特征阈值 | 按区域特征(如灰度)拆分 |
5. 轮廓 (XLD) 处理算子
Halcon 中最核心的轮廓操作,用于提取、筛选、拟合、变换轮廓。
表格
| lines_gauss/lines_color | 提取灰度 / 彩色线条 | 高斯核、宽度阈值 | 提取边缘、标线、轮廓 |
| select_contours_xld | 筛选轮廓 | 'closed'/'curvature' | 选封闭轮廓 / 曲率符合要求的轮廓 |
| select_shape_xld | 按形态筛选轮廓 | 'contlength',15,500 长度范围 | 过滤过短 / 过长的轮廓 |
| fit_circle_contour_xld | 轮廓拟合成圆 | 拟合算法、精度 | 检测圆形目标(如焊点、圆孔) |
| gen_contour_region_xld | 从区域生成轮廓 | 'border_holes' 包含孔洞边界 | 提取区域的边缘轮廓 |
| union_collinear_contours_xld | 连接共线轮廓 | 最大间距、角度差 | 修复断裂的直线(如道路标线) |
| gen_parallels_xld | 生成平行轮廓 | 距离、角度 | 提取平行线(如轨道、边框) |
| test_xld_point | 测试点是否在轮廓内 | 点坐标 | 判断目标是否在指定区域内 |
| split_contours_xld | 拆分轮廓 | 'polygon',1,5 | 把复杂轮廓拆分成简单段 |
6. 矩阵与坐标变换算子
用于 2D/3D 坐标转换、位姿计算,是视觉引导、机械手定位的核心。
表格
| hom_mat2d_identity/hom_mat3d_identity | 生成单位矩阵 | – | 变换的初始矩阵 |
| hom_mat2d_translate/scale/rotate | 2D 平移 / 缩放 / 旋转 | 平移量、缩放因子、角度 | 2D 图像配准、校正 |
| hom_mat3d_rotate/translate/compose | 3D 旋转 / 平移 / 矩阵相乘 | 旋转轴、角度、平移量 | 3D 位姿计算(机械手抓取) |
| pose_to_hom_mat3d/hom_mat3d_to_pose | 位姿↔矩阵转换 | – | 视觉与机器人坐标系转换 |
| vector_to_proj_hom_mat2d | 透视变换矩阵计算 | 4 对对应点坐标 | 图像矫正(如透视畸变校正) |
| affine_trans_contour_xld | 轮廓仿射变换 | 变换矩阵 | 轮廓的平移 / 旋转 / 缩放 |
7. 特征提取算子
提取图像 / 区域 / 轮廓的关键特征(坐标、角度、灰度等)。
表格
| local_max/local_min | 提取灰度极值点 | – | 检测亮点 / 暗点(如焊点、缺陷) |
| critical_points_sub_pix | 亚像素级关键点提取 | 'facet' 提取算法 | 高精度特征点定位 |
| orientation_region/orientation_points_xld | 提取区域 / 轮廓方向 | – | 目标角度校正(如文字倾斜) |
| min_max_gray | 提取区域灰度极值 | – | 目标灰度特征分析 |
| area_center_xld | 计算轮廓中心坐标 | – | 目标定位(如零件中心) |
| gray_histo | 计算灰度直方图 | – | 阈值选择的依据 |
8. 可视化与交互算子
用于图像显示、交互操作(如鼠标取点)。
表格
| dev_set_color/dev_set_draw/dev_set_shape | 设置显示颜色 / 填充方式 / 形状 | 'cyan'/'margin'/'ellipse' | 可视化区分不同目标 |
| dev_set_part | 设置显示区域 | 行 / 列范围 | 聚焦显示感兴趣区域 |
| get_mposition | 获取鼠标坐标 | 窗口句柄 | 交互选择 ROI |
| paint_xld/paint_gray | 绘制轮廓 / 灰度图像 | 颜色 / 灰度值 | 可视化处理结果 |
二、关键使用示例
示例 1:图像相减找差异(缺陷检测)
hdevelop
* 读取基准图和检测图
read_image(Image1, 'reference.png')
read_image(Image2, 'test.png')
* 转换为整型(避免相减溢出)
convert_image_type(Image1, ImageConverted1, 'int2')
convert_image_type(Image2, ImageConverted2, 'int2')
* 图像相减(Image1 – Image2)
sub_image(ImageConverted1, ImageConverted2, ImageSub, 1, 0)
* 转换回8位灰度图,便于后续处理
convert_image_type(ImageSub, ImageSub8, 'byte')
* 阈值分割提取差异区域
bin_threshold(ImageSub8, Regions)
* 筛选有效缺陷区域(面积过滤)
select_shape_std(Regions, DefectRegions, 'max_area', 70)
示例 2:提取圆形轮廓并拟合
hdevelop
* 读取图像并预处理
read_image(Image, 'circle.png')
median_rect(Image, ImageMedian, 5, 5) * 降噪
* 提取边缘
lines_gauss(ImageMedian, Lines, 1.5, 1, 8, 'light', 'true', 'true', 'true')
* 筛选圆形相关轮廓
select_contours_xld(Lines, SelectedContours, 'closed', 0, 20, 0, 0)
* 拟合成圆,获取圆心和半径
fit_circle_contour_xld(SelectedContours, 'ahuber', -1, 2, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
* 可视化结果
dev_set_color('red')
gen_circle_contour_xld(ContCircle, Row, Column, Radius, 0, rad(360), 'positive', 1.0)
dev_display(ContCircle)
示例 3:3D 位姿转换(机械手抓取)
hdevelop
* 生成3D单位矩阵
hom_mat3d_identity(HomMat3DIdentity)
* 绕Z轴旋转(抓取角度)
hom_mat3d_rotate(HomMat3DIdentity, rad(90), 'z', 0, 0, 0, HomMat3D_RZ)
* 平移到目标位置
hom_mat3d_translate(HomMat3D_RZ, 100, 200, 50, HomMat3D_Trans)
* 转换为机器人位姿
hom_mat3d_to_pose(HomMat3D_Trans, PoseGrasp)
总结
- 图像运算前需用convert_image_type转换数据类型,避免溢出;
- 分割前优先滤波降噪(如median_rect),提升分割准确性;
- 轮廓处理后需筛选(select_contours_xld),过滤无效轮廓;

