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 较合适;过大将导致相邻字符粘连,过小则去噪不彻底。
三、参数调优的实操思路
以工业读码中常见的金属表面字符为例:图像存在明显反光和局部阴影,字符为暗字亮底,笔画宽约 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/读码算子就能稳定工作。预处理的价值不在于算子多,而在于每一步都针对具体干扰,并且参数与字符尺度匹配。