4. 图像预处理与增强

在 HALCON 工业视觉项目里,相机采集到的原始图像几乎不可能直接进入测量或识别环节。光照波动、镜头渐晕、传感器噪声、工件表面反光、背景纹理干扰,都会让后续的阈值分割、边缘提取或模板匹配变得不稳定。图像预处理与增强的任务,就是在不破坏目标特征的前提下,把图像整理成“算法容易处理”的状态。本节围绕灰度变换、滤波去噪、形态学处理、图像增强、ROI 提取、光照不均校正与背景抑制七类手段展开,重点说明它们各自解决什么问题、在 HALCON 中如何实现、参数如何选取以及结果如何判断。

一、灰度变换:先把灰度分布拉回可用区间

灰度变换是最基础的预处理,它逐像素改变灰度值,不改变像素位置关系。HALCON 中常用 scale_image 做线性拉伸,用 scale_image_max 自动把灰度范围拉满,用 invert_image 反相,用 gamma_image 做非线性伽马调整。线性变换公式为 g' = α·g + β,其中 α 控制对比度,β 控制亮度偏移。

例如一幅 8 位灰度图实际灰度集中在 60~150,目标与背景只差十几个灰度级。若直接阈值分割,阈值窗口很窄,容易受噪声影响。此时可用 scale_image(Image, ImageScaled, 2.0, -120),把 60 映射到 0、150 映射到 180,对比度明显拉开。判断依据是观察灰度直方图:变换后目标峰与背景峰应分离更清晰,而不是简单看图像“变亮”。伽马变换则用于压暗或提亮中间调,γ<1 提亮暗部,γ>1 压暗亮部,适合处理背光或过曝场景。

二、滤波去噪:区分噪声类型再选算子

噪声处理的关键是先判断噪声性质。高斯噪声适合用 gauss_filter 或 smooth_image;椒盐噪声适合用 median_image 中值滤波;需要保边时用 bilateral_filter 或 guided_filter;对周期性纹理干扰可用频域 fft_image 配合 gen_bandfilter 抑制特定频段。

以中值滤波为例,median_image(Image, ImageMedian, 'circle', 3, 'mirrored') 中,掩膜类型和半径决定去噪强度。半径 3 的圆形掩膜约覆盖 29 个像素,能有效去除孤立噪点,但半径过大(如 7 以上)会磨掉细边缘和小孔。工程上常用做法是:先用 median_image 半径 2~3 去除脉冲噪声,再用 gauss_filter 半径 1~2 平滑残余高斯噪声。判断标准是:噪声方差下降,同时目标边缘位置偏移不超过 1 个像素。

三、形态学处理:按结构元素修整区域形状

形态学处理针对二值区域或灰度图像,核心算子是腐蚀、膨胀、开运算和闭运算。HALCON 中 erosion_circle、dilation_rectangle1、opening_circle、closing_rectangle1 分别对应不同结构元素。开运算先腐蚀后膨胀,用于去除小毛刺和孤立点;闭运算先膨胀后腐蚀,用于填补小孔和连接断裂区域。

例如检测金属件表面划痕时,阈值分割后划痕区域常出现断裂。可用 closing_rectangle1(Region, RegionClosed, 5, 5) 把相邻片段连成完整划痕,再用 opening_circle(RegionClosed, RegionClean, 2.5) 去掉细小噪点。结构元素尺寸必须与目标特征尺度匹配:划痕宽度约 3 像素时,闭运算结构元素取 5 像素较合适;若取 15 像素,会把两条相近划痕错误合并。判断依据是区域数量、面积和连通域变化是否符合预期。

四、图像增强与 ROI 提取:把计算资源集中在目标区

图像增强包括对比度增强、锐化和局部增强。emphasize 可增强高频细节,shock_filter 可锐化边缘同时抑制噪声。ROI 提取则是用 gen_rectangle1、gen_circle、gen_region_polygon 等生成区域,再用 reduce_domain 把后续算子限制在目标区域内。ROI 的价值不仅是减少计算量,更重要的是排除背景干扰,让阈值和模板只对目标区域生效。

实际项目中,ROI 常分两级:一级 ROI 由机械定位或标定给出大致区域,二级 ROI 在区域内用 threshold 或 dyn_threshold 动态提取目标。这样即使工件有轻微位移,也不会因为固定 ROI 偏移而丢失目标。

五、光照不均校正与背景抑制:让阈值在整幅图都成立

光照不均表现为图像一侧亮、一侧暗,固定阈值无法同时分割亮区和暗区。HALCON 中常用 estimate_background_illumination 估计背景光照,再用 illuminate 校正;也可用大核均值滤波或高斯滤波得到背景,再与原图做 sub_image 相减。背景抑制则常用 dyn_threshold,它比较原图与平滑背景图,在局部对比度超过 offset 时才输出区域。

例如一幅 2448×2048 图像,左侧背景灰度约 180,右侧约 120,目标灰度约 200。固定阈值 160 只能分割左半部分。此时用 mean_image(Image, Background, 61, 61) 得到背景,再 dyn_threshold(Image, Background, RegionDyn, 15, 'light'),即可在两侧都稳定提取目标。offset 的选取原则是:大于背景噪声波动,小于目标与背景的局部对比度。若 offset 取 5,噪声会被误检;取 40,弱目标会漏检。工程上可先用 gray_histo 统计局部对比度分布,再确定 offset。

图像预处理与增强处理链(HALCON 算子与参数关系) 原始图像 read_image / grab_image 灰度变换 scale_image α=2.0 β=-120 gamma_image γ=0.8 滤波去噪 median_image r=3 gauss_filter σ=1.5 光照不均校正 mean_image 61×61 dyn_threshold offset=15 ROI 提取 gen_rectangle1 reduce_domain 形态学处理 closing_rectangle1 5×5 opening_circle 2.5 图像增强 emphasize 7×7 1.0 shock_filter 预处理后图像 / 区域 供阈值分割、边缘提取、模板匹配使用 参数选取判断依据 • 灰度变换:直方图双峰分离度 • 滤波:噪声方差↓,边缘偏移≤1px • 形态学:结构元素≈目标特征尺度 • dyn_threshold:噪声<offset<对比度 • ROI:排除背景,减少计算量 结果判读 ✓ 目标区域完整、无断裂 ✓ 背景噪点被抑制 ✓ 阈值在整幅图稳定成立 ✓ 边缘位置偏移在允许公差内 ✗ 过处理导致细节丢失需回退

六、工程实践中的组合策略与参数记录

实际项目很少只用一种预处理。一个典型的金属零件尺寸测量流程可能是:先 scale_image 拉开对比度,再 median_image 去噪,接着 mean_image 估计背景并 dyn_threshold 提取目标,然后 closing_rectangle1 连接断裂,最后 reduce_domain 限定测量区域。每一步的参数都应记录在项目配置中,便于换批次或换光照时快速复现和调整。

需要特别提醒的是,预处理不是越多越好。过度滤波会模糊边缘,过度形态学会改变目标尺寸,过度增强会放大噪声。判断是否“处理够了”的标准始终是:后续测量或识别结果的重复精度和稳定性是否满足要求,而不是图像看起来是否“干净”。建议在 HALCON 中用 dev_display 分步显示中间结果,配合 count_obj、area_center、measure_pos 等算子量化每一步的影响,再决定是否保留该步骤。

参数调试建议:先用 gray_histo 查看灰度分布,再用 dev_display 逐步叠加处理结果。每次只改一个参数,观察区域数量、面积和边缘位置的变化,避免多参数同时调整导致无法定位问题。
注意:dyn_threshold 的 offset 过小会把背景噪声当成目标,过大则漏掉弱对比目标。建议先用 gray_histo 统计目标与背景的局部灰度差,取差值的 30%~50% 作为初始 offset,再根据误检和漏检情况微调。