图像预处理
* 1. 读取图像(打印机芯片图像,用于演示工业场景的形态学处理)
read_image (Image, 'printer_chip/printer_chip_01')
* 2. 二值化:将灰度图转为黑白,提取前景区域(芯片的金属引脚/线路)
threshold (Image, Region, 128, 255)
* 3. 圆形腐蚀:缩小前景区域,消除小的亮噪点/细化边缘
* 参数:输入区域、输出区域、腐蚀半径(3.5像素)
erosion_circle (Region, RegionErosion, 3.5)
* 4. 圆形膨胀:扩大前景区域,填补小的暗缺陷/粗化边缘
* 注意:这里是对"腐蚀后的区域"膨胀,本质是先腐蚀再膨胀=开运算
dilation_circle (RegionErosion, RegionDilation,3.5)
* 5. 开运算(内置算子):先腐蚀后膨胀,核心作用是"去除小的亮噪点,保留大区域形状"
* 等同于上面的erosion_circle + dilation_circle(同半径)
opening_circle (Region, RegionOpening, 3.5)
* 6. 闭运算(内置算子):先膨胀后腐蚀,核心作用是"填补小的暗孔洞/缺陷,保留大区域形状"
* 半径11.5更大,用于填补芯片线路中的大一点的缝隙
closing_circle (Region, RegionClosing, 11.5)
* 1. 读取另一张测试图像(clip,裁剪后的图像)
read_image (Image1, 'clip')
* 2. 二值化:提取低灰度的前景区域(10-80灰度值)
threshold (Image1, Region1, 10, 80)
* 3. 自定义结构元:创建一个圆心(200,200)、半径3.5的圆形结构元
* 注意:结构元的坐标不影响膨胀效果,只看形状(圆形)和大小(半径)
gen_circle (Circle, 200, 200, 3.5)
* 4. 自定义结构元的膨胀:通用形态学膨胀算子
* 参数:输入区域、结构元、输出区域、迭代次数(1次)
dilation1 (Region1, Circle, RegionDilation1, 1)
* 5. 简化版圆形膨胀:封装后的算子,等同于上面的gen_circle + dilation1
dilation_circle (Region1, RegionDilation2, 3.5)
表格
| 算子 | 操作逻辑 | 核心作用 | 适用场景 |
|---|---|---|---|
| erosion_circle | 单独腐蚀 | 去除小亮点、细化边缘 | 降噪(亮噪点)、轮廓细化 |
| dilation_circle | 单独膨胀 | 填补小暗孔、粗化边缘 | 补缺陷(暗孔洞)、轮廓加粗 |
| opening_circle | 腐蚀→膨胀 | 去噪(不改变大区域形状) | 工业缺陷检测(去小亮点) |
| closing_circle | 膨胀→腐蚀 | 补缺陷(不改变大区域形状) | 工业缺陷检测(补小暗孔) |
| dilation1 | 自定义结构元膨胀 | 支持任意形状的膨胀(圆 / 矩形 / 异形) | 特殊形状的轮廓规整 |
图像导出保存以及裁剪
一、窗体 / 图像导出保存类(核心:保存可视化结果 / 图像)
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点 |
|---|---|---|---|
dev_get_window |
获取当前激活的窗体句柄 | WindowHandle:输出,窗体句柄(后续导出 / 绘制需用到) |
必须先打开窗体(如dev_open_window)才能获取,否则报错 |
dev_disp_text |
在窗体指定位置显示文本 | 1. 显示内容(如 'hello')2. 显示位置参考('window'= 相对窗体,'image'= 相对图像)3. 垂直对齐('top'/'bottom'/'center')4. 水平对齐('left'/'right'/'center')5. 文本颜色6-7. 扩展参数(一般空) | 文本会叠加在窗体上,dev_clear_window可清除 |
dump_window |
导出整个窗体为文件 | 1. WindowHandle:窗体句柄2. 导出格式('bmp'/'png'/'tiff' 等)3. 保存路径 + 文件名(相对 / 绝对路径) |
保存的是窗体可视化内容(含标注 / 文本),格式选bmp/png更易打开 |
dump_window_image |
将窗体内容转为 Halcon 图像对象 | 1. Image1:输出,转换后的图像2. WindowHandle:窗体句柄 |
先转图像对象,再用write_image保存,比dump_window更灵活 |
write_image |
保存 Halcon 图像对象到本地 | 1. 输入图像(Image/Image1)2. 保存格式('tiff'/'bmp'/'png' 等)3. 压缩等级(0 = 无压缩)4. 保存路径 + 文件名 | 与read_image配对,dump_window_image+write_image可保存带标注的图像 |
二、图像生成 / 转换类(核心:创建自定义图像 / 格式转换)
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点 |
|---|---|---|---|
gen_checker_region |
生成棋盘格形状的区域 | 1. RegionChecker:输出,棋盘格区域2-3. 区域整体大小(511x511)4-5. 单个格子大小(32x32) |
生成的是Region(区域),需用region_to_bin转成图像 |
region_to_bin |
将区域转为二值化图像 | 1. 输入区域(RegionChecker)2. 输出二值图(BinImage)3. 前景灰度值(255 = 白色)4. 背景灰度值(0 = 黑色)5-6. 输出图像尺寸(512x512) | 尺寸需≥生成区域的大小,否则会裁剪;前景 / 背景可自定义(如 128/0) |
三、图像裁剪 / 区域限定类(核心:提取图像局部区域)
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点 |
|---|---|---|---|
crop_part |
按坐标裁剪固定大小的图像区域 | 1. 输入图像(Image2)2. 输出裁剪后图像(ImagePart)3. 起始行(Row=30)4. 起始列(Column=100)5. 裁剪宽度(300)6. 裁剪高度(60) | 坐标是图像原始坐标,超出图像范围会报错 |
draw_ellipse |
手动在窗体绘制椭圆(交互式) | 1. 窗体句柄2-3. 椭圆中心(Row/Column)4. 旋转角度(Phi)5-6. 长短半轴(Radius1/Radius2) | 运行时会暂停,需手动拖动鼠标绘制,按回车确认 |
gen_ellipse |
按参数生成椭圆区域 | 参数与draw_ellipse完全一致 |
非交互式,直接按固定参数生成椭圆 |
reduce_domain |
限定图像的处理域(只保留椭圆内的图像) | 1. 输入图像(Image2)2. 限定区域(Ellipse)3. 输出限定后图像(ImageReduced) | 不会裁剪图像尺寸,只是将区域外的像素设为 "无效",后续操作仅对有效区域生效 |
四、辅助类算子
表格
| 算子名称 | 核心作用 | 参数详解 | 关键注意点 |
|---|---|---|---|
dev_clear_window |
清空窗体显示内容(文本 / 图像 / 区域) | 无参数 | 仅清空显示,不删除变量;多次绘制前调用可避免内容叠加 |
read_image |
从本地读取图像到 Halcon 变量 | 1. 输出图像变量2. 图像路径 + 名称 | 与write_image配对,读取的是纯图像(无标注) |
动态阈值,快速阈值
一、图像基础操作类(获取图像信息)
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点 |
|---|---|---|---|
read_image |
从本地读取图像到 Halcon 变量 | 1. Image:输出,读取后的图像变量2. 图像路径 / 内置示例名(如 'die_pads') |
支持 bmp/tiff/png 等格式,内置示例名可直接使用 |
get_image_size |
获取图像的宽度和高度 | 1. 输入图像(Image)2. Width:输出,图像宽度3. Height:输出,图像高度 |
后续裁剪、绘图等操作需用到图像尺寸,避免坐标越界 |
二、阈值分割类(核心:提取前景区域)
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点 |
|---|---|---|---|
threshold |
全局固定阈值分割 | 1. 输入图像(Image)2. Region:输出,分割后的区域3-4. 灰度值范围(128-255) |
简单高效,但对光照不均的图像效果差 |
fast_threshold |
快速局部阈值分割 | 1. 输入图像(Image)2. Region:输出,分割后的区域3-4. 灰度值范围(128-255)5. 局部窗口大小(20) |
非逐像素检查,而是以 20x20 窗口为单位判断,速度远快于threshold,适合大图像 |
dyn_threshold |
动态阈值分割(抗光照不均) | 1. 原始图像(Image)2. 预处理图像(如均值滤波后的 ImageMean)3. Region:输出,分割后的区域4. 偏移值(10)5. 提取类型('light'= 亮区域 /'dark'= 暗区域) |
对比原始图和预处理图的灰度差,偏移值越小分割越严格,适合光照不均的场景 |
三、图像预处理类(优化图像,提升分割效果)
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点 |
|---|---|---|---|
mean_image |
均值滤波(平滑图像 / 去噪) | 1. 输入图像(Image)2. ImageMean:输出,滤波后的图像3-4. 滤波窗口大小(10x10) |
窗口越大,图像越模糊,需根据噪点大小调整;常作为dyn_threshold的预处理 |
四、连通域与区域筛选类(提取目标区域)
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点 |
|---|---|---|---|
connection |
连通域分析(标记独立区域) | 1. 输入区域(Region)2. ConnectedRegions:输出,所有独立连通域 |
必须输入二值区域,输出是多个独立区域的集合 |
select_shape |
按形状特征筛选区域 | 1. 输入区域集合(ConnectedRegions)2. SelectedRegions:输出,筛选后的区域3. 筛选特征列表(如 ['area','anisometry'])4. 逻辑关系('and'= 同时满足 /'or'= 满足其一)5. 特征最小值列表([150,1])6. 特征最大值列表([9900,2]) |
- area:面积,筛选 150-9900 像素的区域- anisometry:长短轴比,筛选 1-2 的区域(接近矩形) |
五、区域形态学 / 几何处理类(规整区域形状)
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点 |
|---|---|---|---|
fill_up |
填充区域内的孔洞 | 1. 输入区域(SelectedRegions)2. RegionFillUp:输出,填充后的区域 |
仅填充区域内部的孔洞,不改变区域外轮廓 |
shape_trans |
区域形状转换 | 1. 输入区域(RegionFillUp)2. RegionTrans:输出,转换后的区域3. 转换类型('rectangle2'= 最小外接旋转矩形) |
常用类型:'rectangle1'(轴对齐矩形)、'circle'(最小外接圆) |
orientation_region |
获取区域的方向角 | 1. 输入区域(RegionTrans)2. Phi:输出,方向角(弧度,范围 -π/2~π/2) |
角度以图像行列为基准,顺时针为正,用于后续绘制方向箭头 |
area_center |
获取区域的面积和中心坐标 | 1. 输入区域(RegionTrans)2. Area:输出,区域面积3-4. Row/Column:输出,区域中心坐标 |
中心坐标是后续绘制箭头、标注的基准点 |
boundary |
提取区域的边界 | 1. 输入区域(RegionTrans)2. RegionBorder:输出,边界区域3. 边界类型('inner'= 内边界 /'outer'= 外边界 /'true'= 真实边界) |
仅显示区域轮廓,便于可视化区域形状 |
六、可视化与交互类(显示 / 绘制内容)
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点 |
|---|---|---|---|
dev_get_window |
获取当前激活的窗体句柄 | WindowHandle:输出,窗体句柄 |
后续绘制箭头、文本需指定窗体,必须先打开窗体(如dev_open_window) |
dev_display |
在窗体显示图像 / 区域 | 输入:图像(Image)或区域(RegionBorder) | 可叠加显示,dev_clear_window可清空之前的显示内容 |
disp_arrow |
在窗体绘制方向箭头 | 1. 窗体句柄(WindowHandle)2-3. 箭头起点(Row/Column)4-5. 箭头终点(Row-lengthsin(Phi), Column+lengthcos(Phi))6. 箭头宽度(1) | 终点坐标通过角度Phi计算,实现 "沿区域方向绘制箭头";宽度越大箭头越粗 |
图像处理
一、形态学结构元(SE)创建类(核心:定义形态学操作的 "模板")
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点 |
|---|---|---|---|
gen_disc_se |
创建圆形结构元(圆盘 SE) | 1. SE:输出,创建的结构元2. 数据类型('byte'= 字节型,常用)3-4. SE 的宽度 / 高度(5x5)5. SE 的半径(5) |
- SE 是形态学操作的 "模板",形状 / 大小决定操作效果- 圆形 SE 适合处理圆形 / 弧形目标,5x5 是 SE 的尺寸,半径 5 需与尺寸匹配 |
二、灰度形态学核心操作类(区别于二值形态学,直接处理灰度图)
表格
| 算子名称 | 核心作用 | 参数详解(按顺序) | 关键注意点(含公式 / 场景) |
|---|---|---|---|
gray_opening |
灰度开运算(平滑亮区域,去除小亮点) | 1. 输入灰度图(Image)2. 结构元(SE)3. ImageOpening:输出,开运算后的图像 |
- 公式:灰度开运算 = 灰度腐蚀 → 灰度膨胀- 作用:抑制亮的小噪点,保留大的亮区域整体灰度 |
gray_tophat |
灰度顶帽运算(提取微小亮斑) | 1. 输入灰度图(Image)2. 结构元(SE)3. ImageTopHat:输出,顶帽后的图像 |
- 公式:顶帽图 = 原始图 - 灰度开运算图- 核心场景:提取图像中比周围亮的微小区域(如金属表面亮缺陷、电路板亮点)- 若原始图无微小亮斑,中心点灰度值为 0(如示例中 Grayval1=0) |
gray_bothat |
灰度底帽运算(提取微小暗斑) | 1. 输入灰度图(ImageTopHat,示例中用了顶帽图,实际常用原始图)2. 结构元(SE)3. ImageBotHat:输出,底帽后的图像 |
- 公式:底帽图 = 灰度闭运算图 - 原始图(代码注释笔误,正确公式是底帽 = 闭运算 - 原图)- 核心场景:提取图像中比周围暗的微小区域(如医学影像肿瘤、表面暗缺陷、保险丝熔断点) |