system: [SYSTEM]

user: 2. PCB板的圆定位算法 图1给出了圆定位算法，其主要包含四个主要处理过程：预处理、圆心粗定位、半径计算、圆心再定位。 图1所示的圆定位算法流程图中虚框框起来的是四个主要处理工作，接下来以最常见的电容元件为例，介绍论文提出的定位算法的这四个具体处理工作。介绍每一处理工作的内容、处理的结果，以及得到的结果。 图1. 圆定位算法流程 2.1. 预处理 2.1.1. 灰度化 本步工作主要完成对所拍摄的彩图进行灰度化转换。方法是基于计算公式1把输入的彩色图像(图2左所示)的每一坐标值对应计算，从而使其转换为单通道的灰度图像(如图2中所示)，即将RGB三通道彩色图像通过变换，转化为灰度图像的计算。 (公式1) 其中x，y为图中每个点的坐标值。 2.1.2. 高斯平滑处理 对于图像非圆周的细节信息，并不会对圆定位有所贡献，反而会对定位工作带来干扰，所以要减弱这种干扰。 本文采用高斯平滑算法 [ 6 ] [ 7 ] ，用它来减少图像噪音以及降低细节层次，平滑窗口取5 × 5像素。图2右显示出图像的细节已被模糊处理。 2.2. 粗定位圆心区域 粗定位圆心区域的工作可分为：计算边沿、计算边沿点Sobel切线、生成交点图和计算滑动窗口圆心四个步骤，从而得到一个圆心的圆区域。 2.2.1. 边沿的计算 边沿(边缘)：图像的边缘是指图像局部区域亮度变化显著的部分，该区域的灰度梯度变化一般可以看作是一个阶跃，既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。通常图像的边沿集中了图像的很多信息，是图像场景识别和理解的基础，是图像分割、定位、测量、识别的重要手段。图3给出了边沿方向和梯度方向，图中高度表示灰度值。 圆心在圆定位的过程中是通过圆周的定位来确定的，圆周在图像中即为的圆的边沿。本文对此采用最常用的Canny算法来计算圆的边沿图，得到图4所示结果。Canny边缘检测算子是John F. Canny [ 8 ] 图2. 彩色图的灰度化和平滑处理 图3. 边沿和梯度方向 图4. 基于Canny计算边沿 于1986年开发出来的一个多级边缘检测算法，主要包括五个处理步骤： 1) 应用高斯滤波来平滑图像去除噪声； 2) 找寻图像的强度梯度(intensity gradients)，用一阶偏导(Sobel算子)计算梯度的方向和幅度值； 3) 应用非最大抑制(non-maximum suppression)技术来消除边误检； 4) 应用双阈值的方法来决定可能的边界； 5) 利用滞后技术来跟踪边界。 2.2.2. 边沿点Sobel切线方向的计算 Sobel [ 9 ] [ 10 ] [ 11 ] 算子常用于边缘检测中计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子，将会产生该点对应的梯度矢量或是其法矢量。本文使用的Sobel算子如下： Sobel X: X方向求导，将图像(I)与一个奇数大小的内核进行卷积。 Sobel Y: Y方向求导，将图像(I)与一个奇数大小的内核进行卷积。 对灰度图的每一个点分别计算Sobel X Y卷积得到X、Y两个方向的Sobel图得到图5所示结果。 从图5左和中图中可看出X，Y方向的Sobel计算结果即为X、Y方向的灰度变换梯度，将其视为该 点的正弦、余弦，那么过该点的正切即为 。 由于本文只对图像的边沿感兴趣，所以只需要计算Canny边沿图上的每一个边沿点的正切线即可。 以边沿图中边沿点(56，56)为例，Sobel X的(56，56)值为s_x = 573，Sobel Y的(56，56)值为s_y = 653， (56，56)点的正切值为，(i，j)为计算点的坐标，计算得到 ，计算反正切，得到角度为θ = 48.73˚， 从图6右中看到计算和实际方向一致。 2.2.3. 绘制交点图 对Canny的边沿图(图4)中白色的边沿上的每一个点，计算正切值，并将计算后得到的切线绘制到统计图中，最终得到对应的图6所示的切线交点图，处理步骤如下： 1) 创建空白的切线交点图Cross； 2) Canny图中按坐标顺序，取一点边沿点C； 3) 根据SobelX，Sobel计算C点的正切； 4) 在Corss图中，绘制经过C的切线； 5) 如果切线经过点P，P当前的值位D； 6) 修改P点的值为D + 1； 7) 依次计算切线上每一个点的新值； 8) 计算Canny图中下一个边沿点，直到遍历完毕。 2.2.4. 滑动窗口圆心区域粗定位 在图6右中可看出，亮度最高的区域就是边沿切线交汇最多的区域，即圆心所在的区域。粗定位步骤如下： 1) 图的宽W，高H，设定滑动窗口的宽为 ，高为 ； 2) 设定搜索步长X方向为 ，Y方向为 ； 3) 遍历全图(图6右)，找到滑动窗口像素和最大的区域，得到粗定位的圆心区域； 图5. 计算Sobel X和Sobel Y及其切线方向示意图 图6. 切线交点图 4) 初始化滑动窗口像素和最大值 sum_max = 0，最大值坐标位置 ； 5) 滑动窗口左上角坐标 从图7左上角 开始，计算 ，区域的像素值总数sum，如果sum > sum_max： a) sum_max = sum， ； b) 更新 坐标为 ，计算新坐标 的sum，直到遍历完毕； c) ， ； d) 如果 ，新坐标为 ； e) 如果 且 ，新坐标为 ； f) 如果 ，遍历完毕，结束运算。 通过上面的步骤，得到图7中绿框所示的圆心区域，取绿色矩形的中心点为粗定位圆心Center。 2.3. 半径计算 计算得到粗定位圆心后，再对边沿点集中的点进行筛选，步骤如下： 1) 计算Canny图(图4)的边沿点中，对圆心区域(图8)有贡献的边沿点。 a) 对Canny中每一个白点； b) 取Canny中白点P(X，Y)； c) P点切线穿过圆心粗定位区域(图8的绿色区域)； d) P点到矩形中心的连线，和P点切线的角度小于设定值15˚； e) P点满足条件则保留，否则删除，最终得到有贡献的边沿图，如图8所示。 图7. 圆心粗定位 图8. 圆心有贡献边沿 2) 以粗定位圆心Center(X，Y)为中心，从外向内确定半径R。 a) 图像宽高 。X，(W-X)，Y，(H-Y)四个值中最小值，作为搜索半径的最大值 ，半径的搜索区域为 ， ，搜索宽度为 ； b) 初始 ，计算 ， ，环形区域内的所有白点数目Sum； c) 如果 ，即环形区域达到70%的圆半径，则得到最终的半径R； d) 否则 ，继续搜索，直到找到。如果 ，还未找到，则定位半径失败。 最终计算得到的半径R如图9所示。 2.4. 圆心再定位 粗定位的圆心并不准确，在计算得到半径后，我们还需要对圆心再一次定位，步骤如下。 1) 将图9中，半径 ，圆环区域内的边沿点保留，去掉其他的边沿点。 2) 如图10中白色边沿所示。 3) 根据SobelX、SobelY，对图10中每个边沿点，按照圆心粗定位的算法，得到切线交汇图(图11)。 4) 在切线交汇图中，使用圆心滑动窗口(半径为 )，找到切线交汇最多的区域，小圆圆心即为最终的圆心，如图10中心点所示。 最终，获得圆定位结果如图12所示。 图9. 半径定位 图10. 圆环边沿 图11. 切线交汇图 图12. 定位结果 2.5. 算法验证 本文算法在电子电路检测中，主要针对的圆形检测对象可以是：电容、蜂鸣器、锂电池等圆形手插件、板卡上的各种孔、洞、定位点、螺丝等各种紧固件，以及其他圆形边缘元件。为验证本文算法的准确性和实际性能，首先要对相应的电路板进行拍照，应用本文提出的圆定位算法对其上面的圆形元件或板卡上的孔洞进行检测实验。 为此，本文搭建了包括拍摄平台、算法平台、识别程序三部分组成的测试环境。其中：拍摄实验平台是由千万像素CCD工业相机、镜头、LED光源、封闭机柜、工控机组成；算法测试平台是在高性能PC (intel i5 CPU、4G DDR3 1600内存、运行Win7操作系统)运行；识别程序是使用VS2005的MFC编写，图像库使用OpenCV2.0。选择了几种典型的圆形元件，如：电容，螺丝，圆形打孔，塑料、金属支撑立柱等常见的圆形元件。实验结果如表1所示。 采用圆定位算法得到的圆心平均偏移误差在2个像素以内，半径误差在4个像素之内，运算时间和图像的像素数目有关，对于200 × 200像素的图像，运算时间在30 ms左右，可以满足大多数圆形元件的准实时定位需求。与传统的基于Hough变换的圆定位算法相比，该算法数学模型清晰、易于实现、更适用于PCB光学检测系统的定位需求。 Table 1 Experimental resul 元件 搜索区域 (像素) 平均耗时 (ms) 平均误差 (x，y，r) 200 × 200 37 (1，1，1) 200 × 200 32 (1，1，1) 250 × 250 47 (1，1，2) 200 × 200 30 (1，1，1) 280 × 280 58 (2，3，2) 480 × 480 67 (2，2，4) 表1. 实验结果 2.6. 结论 本文提出的圆形电池定位算法具有一定的通用性，实际应用时，可根据实际需要调节模、canny变换、滑动窗口、圆周比例等参数。如果效果不理想，还可以对模糊、圆心定位、半径搜索的算法加以改进，即可得到满意的效果。