3. 图像预处理核心算子

在 HALCON 的字符识别与工业读码流程中,预处理不是“随便调几个算子”的环节,而是决定后续分割、特征提取与识别稳定性的关键。字符与码区域提取的目标通常很明确:让字符笔画与背景之间的对比度尽可能大,同时抑制噪声、光照不均、反光、划痕、脏污等干扰,并尽量保留字符的连通性与边缘完整性。围绕这个目标,灰度变换、滤波、增强和形态学操作各有分工,选择依据主要看干扰类型、字符尺度、对比度方向和后续算子的输入要求。

一、先判断“干扰是什么”,再选算子

如果图像整体偏暗或偏亮,但字符与背景的相对关系仍然存在,优先考虑灰度变换。HALCON 中常用 scale_image 做线性拉伸,把原灰度区间映射到更宽的范围;用 scale_image_max 自动拉伸到 0~255;用 emphasize 增强高频细节;用 equ_histo_image 做直方图均衡,适合背景灰度集中、字符与背景混在一起的情况。若光照不均导致同一字符在图像不同位置灰度差异很大,则不要只做全局变换,应转向局部增强或背景校正,例如 illuminate 或先大核均值滤波得到背景,再用 sub_image 做差分。

如果干扰是随机噪声,例如传感器噪声、低照度噪声,优先考虑滤波。高斯滤波 gauss_filter 适合抑制高斯噪声,但会模糊边缘;中值滤波 median_image 对椒盐噪声更有效,且能较好保留边缘;均值滤波 mean_image 计算快,但会同时模糊字符笔画。对于字符识别,滤波核不宜过大,通常 3×3 到 7×7 之间,核越大越平滑,但笔画断裂和粘连风险也越高。

二、增强与形态学的选择依据

增强类算子的核心是“拉开字符与背景的差异”。emphasize 通过原图与平滑图之差增强边缘,适合字符边缘较软、对比度不足的情况;shock_filter 可在增强边缘的同时保持平坦区域,适合字符轮廓需要锐化的场景。若字符是暗底亮字或亮底暗字,需先明确极性,再决定用 dyn_threshold 还是 threshold。动态阈值 dyn_threshold 对光照渐变特别有效,它比较原图与平滑图,适合背景缓慢变化、字符局部对比度稳定的图像。

形态学操作主要用于“修形状”,而不是直接增强对比度。字符提取中常见三类用法:一是用 opening_rectangle1 或 opening_circle 去掉小噪点和细毛刺;二是用 closing_rectangle1 或 closing_circle 填补笔画内部小孔、连接断裂笔画;三是用 dilation_rectangle1 或 erosion_rectangle1 调整字符区域的连通性。结构元尺寸必须与字符笔画宽度匹配:若笔画宽约 3 像素,结构元取 3×3 或 5×5 较合适;过大将导致相邻字符粘连,过小则去噪不彻底。

字符/码区域提取的预处理算子选择路径 输入图像 灰度图 / 彩色转灰度 干扰类型? 光照 / 噪声 / 对比度 / 形状 光照不均 / 渐变 illuminate / dyn_threshold 先背景校正,再局部阈值 随机噪声 gauss_filter / median_image 核 3×3~7×7,保边优先 对比度不足 scale_image / emphasize 线性拉伸或高频增强 笔画断裂 / 孔洞 / 毛刺 opening / closing / dilation 结构元匹配笔画宽度 输出到分割 threshold / dyn_threshold connection / select_shape 字符区域 ROI 判断:连通、完整、无粘连 参数调优要点: 滤波核 ≤ 笔画宽度;形态学结构元 ≈ 笔画宽度;dyn_threshold 的 Offset 控制灵敏度;scale_image 的 Mult/Add 控制对比度方向与幅度。

三、参数调优的实操思路

以工业读码中常见的金属表面字符为例:图像存在明显反光和局部阴影,字符为暗字亮底,笔画宽约 4 像素。第一步用 rgb1_to_gray 转灰度;第二步用 mean_image 取 15×15 大核得到背景估计,再用 sub_image 做差分,消除光照渐变;第三步用 emphasize 增强字符边缘;第四步用 dyn_threshold 分割,Offset 取 8~15 之间,观察字符是否完整;第五步用 opening_rectangle1 去掉 1~2 像素的噪点,再用 closing_rectangle1 填补笔画小孔。若发现相邻字符粘连,应减小 closing 结构元,或改用 erosion_rectangle1 先分离再膨胀恢复。

参数调优不能只看单张图。建议在 HALCON 中把关键参数做成变量,用 for 循环遍历候选值,配合 count_obj、area_center、select_shape 统计字符区域数量和面积分布,选择“字符数正确、面积稳定、无粘连”的参数组合。对于码区域提取,还要关注码的模块宽度,形态学结构元不应大于模块宽度,否则会破坏码的条空结构。

选择顺序建议:先判断干扰类型,再决定是灰度变换、滤波、增强还是形态学;不要一上来就叠加多个算子,每加一个算子都要能说清它解决什么问题。

四、常见误区与判断依据

第一个误区是“滤波越强越好”。实际上,过强的滤波会把细笔画抹掉,导致字符断裂。判断依据是:滤波后字符区域面积不应明显缩小,笔画连通性应保持。第二个误区是“形态学可以替代阈值分割”。形态学是在二值或灰度区域上修形状,不能凭空产生对比度,若字符与背景灰度接近,应先做增强或变换。第三个误区是“所有图像都用同一组参数”。不同批次、不同光照、不同材质的图像,最佳参数往往不同,应建立参数模板并按图像质量分类调用。

最终判断标准可以归纳为三条:字符区域是否完整、是否粘连、是否包含过多背景。只要这三条满足,后续的 connection、select_shape、sort_region 和 OCR/读码算子就能稳定工作。预处理的价值不在于算子多,而在于每一步都针对具体干扰,并且参数与字符尺度匹配。