4. ROI提取与图像分割基础

在PCB板焊点缺陷检测中,相机采集到的图像往往包含整块电路板、定位孔、丝印字符、元器件本体以及大片背景。如果直接在全图上做阈值或形态学处理,不仅运算量大,还会把丝印、铜箔走线误判为焊点。ROI(Region of Interest,感兴趣区域)提取与图像分割,就是把“整幅图”逐步收敛为“焊点候选区域”的核心手段。本节围绕ROI创建与操作、全局阈值、自适应阈值、区域生长和分水岭算法展开,并落到PCB焊点提取这一具体任务上。

一、ROI的创建与操作

HALCON中ROI本质是一个区域(Region)对象,它既可以是矩形、圆、椭圆等规则形状,也可以是由阈值、边缘或手工绘制得到的任意区域。常见创建方式有三类:一是用gen_rectangle1、gen_circle等算子生成规则ROI;二是用draw_rectangle1、draw_polygon等交互算子由操作员在图像上勾画;三是由分割结果反向生成ROI,例如先阈值得到亮斑,再用connection和select_shape筛选出焊点区域。

ROI操作的关键是集合运算:intersection取交集、union2取并集、difference取差集、complement取补集。在PCB检测中,典型做法是先用定位标记(Mark点)建立坐标系,再按焊盘设计坐标生成一组矩形ROI,最后用reduce_domain把图像裁剪到这些ROI内。这样后续所有分割都只在焊盘附近进行,既提速又降误检。

ROI不是一次性画死的。工程上常把ROI做成“模板+偏移”的形式:先由Mark点求出平移和旋转量,再用affine_trans_region把标准ROI变换到当前图像位置,从而适应PCB在视野中的轻微偏移与旋转。

二、全局阈值与自适应阈值

阈值分割的依据是灰度直方图。全局阈值假设整幅图光照均匀,用一个固定阈值MinGray把像素分为前景和背景,HALCON对应算子为threshold。例如焊点通常比基板亮,可先取threshold(Image, Region, 120, 255)得到所有亮区。但实际产线光源很难完全均匀,板边与板中心亮度可能相差几十个灰度级,此时固定阈值会把暗侧焊点漏掉、把亮侧丝印误收。

自适应阈值则让阈值随位置变化。HALCON常用dyn_threshold,它先对原图做一次均值或高斯平滑得到参考图,再逐像素比较原图与参考图的差值:

mean_image(Image, Mean, 25, 25)
dyn_threshold(Image, Mean, RegionDyn, 8, 'light')

这里25×25是平滑窗口,8是灰度差阈值,'light'表示提取比局部背景亮8个灰度以上的像素。窗口越大,对缓慢光照变化的补偿越强,但会削弱小焊点的对比;窗口越小,越能保留细节,却容易把噪声也当成前景。工程上常从15×15到35×35之间试选,并以焊点是否完整、丝印是否被误收作为判断依据。

三、区域生长与分水岭算法

当焊点与背景灰度接近、边界模糊时,单靠阈值难以得到完整区域。区域生长从一个或多个种子点出发,把与种子灰度相近的邻域像素逐步并入区域。HALCON中可用regiongrowing实现,其参数Row、Column控制邻域尺寸,Tolerance控制灰度相似度。种子点可由阈值粗定位得到,例如先取亮斑中心作为种子,再生长出完整焊点。

分水岭算法把灰度图看作地形,灰度值对应海拔,向低处“注水”形成汇水盆地,盆地之间的分水岭即为边界。HALCON用watersheds得到盆地,再用watersheds_threshold合并过分割的小区域。它对焊点粘连、相邻焊点边界不清的场景特别有效:先对图像做gauss_filter平滑抑制噪声,再求梯度幅值图,最后在梯度图上做分水岭,可把相互接触的多个焊点分开。

PCB焊点ROI提取与分割链路 原始图像 整板 + 背景 光照不均 丝印/走线干扰 Mark点定位 find_shape_model 求平移/旋转量 affine_trans_region ROI裁剪 reduce_domain 仅保留焊盘附近 运算量↓ 误检↓ 分割方法选择 ① threshold 全局阈值 ② dyn_threshold 自适应 ③ regiongrowing 区域生长 ④ watersheds 分水岭 全局阈值 threshold(Img,R,120,255) 适用:光照均匀 优点:快、简单 风险:暗侧漏检 亮侧丝印误收 自适应阈值 mean_image + dyn_threshold 窗口25×25,差8 适用:光照渐变 优点:抗光照不均 风险:窗口需调 区域生长 regiongrowing 种子+灰度相似度 适用:边界模糊 优点:区域完整 风险:种子敏感 分水岭 gauss_filter → 梯度 → watersheds watersheds_threshold 合并 适用:焊点粘连 优点:可分粘连 风险:易过分割 输出:焊点候选区域 Region 后续 select_shape 按面积/圆度筛选 → 缺陷判定

四、面向PCB焊点的组合策略

实际项目很少只用一种分割方法,而是按“粗定位—精分割—筛选”组合。下面给出一段可直接参考的HALCON处理序列(参数为示例值,需按实际光源与相机标定调整):

* 1. 定位Mark点,建立坐标系
find_shape_model(Image, ModelID, -0.1, 0.1, 0.8, 1, 0.5, 'least_squares',
                 0, 0.9, Row, Col, Angle, Score)
vector_angle_to_rigid(RowRef, ColRef, 0, Row, Col, Angle, HomMat2D)

* 2. 生成标准焊盘ROI并变换到当前图像
gen_rectangle1(RectROI, 100, 100, 160, 160)
affine_trans_region(RectROI, ROI, HomMat2D, 'nearest_neighbor')
reduce_domain(Image, ROI, ImageROI)

* 3. 自适应阈值粗分割
mean_image(ImageROI, Mean, 25, 25)
dyn_threshold(ImageROI, Mean, RegionDyn, 8, 'light')

* 4. 形态学清理与连通
closing_circle(RegionDyn, RegionClose, 2.5)
connection(RegionClose, ConnectedRegions)

* 5. 按面积与圆度筛选焊点
select_shape(ConnectedRegions, SolderRegion,
             ['area','circularity'], 'and', [80, 0.6], [2000, 1.0])

判断结果是否合格,主要看三点:一是每个焊盘ROI内是否恰好得到一个连通区域,若出现多个说明有噪声或焊点被切碎;二是区域面积是否落在工艺允许区间,例如示例中取80~2000像素;三是圆度是否接近1,焊点通常近似圆形,若圆度偏低可能混入了走线或丝印。若发现相邻焊点粘连成一个区域,可改用分水岭:先对ImageROI做gauss_filter平滑,再求梯度并执行watersheds,最后用watersheds_threshold合并面积过小的盆地。

分水岭对噪声非常敏感,若不做平滑直接使用,会把每个灰度起伏都切成独立区域,造成严重过分割。务必先平滑、再求梯度、后分水岭,并用阈值合并小盆地。

五、参数选择与常见问题

问题现象可能原因调整方向
暗侧焊点漏检全局阈值固定改用dyn_threshold,增大平滑窗口
丝印被误收阈值偏低或ROI过大提高MinGray,收紧ROI,加圆度筛选
焊点被切碎阈值偏高或噪声大降低阈值,先做中值/高斯滤波
相邻焊点粘连焊点间距小、边界模糊改用分水岭,或加大腐蚀后再连通
区域生长溢出Tolerance过大减小灰度容差,限制生长邻域尺寸

ROI与分割是焊点检测的第一道关口,其质量直接决定后续特征提取与分类的可靠性。掌握“定位—裁剪—分割—筛选”这条链路,并能根据光照、焊点形态和粘连情况在全局阈值、自适应阈值、区域生长与分水岭之间灵活切换,是构建稳定PCB缺陷检测系统的基本功。