印刷电路板 链码表
摘要:本文对工业上印刷电路板(Printed-Circuit Board)孔位的定位问题进行研究,达到对PCB板的打孔机进行基准调整的目的。对CCD所获取的图像进行有效的预处理,采取链码表和线段表相互结合运用,精确快速的确定PCB孔位的形心,本文的方法对形心的检测可以精确到0.001个像素级,并求出孔位的面积、周长、形状、形心。此方法在VC++6.0的平台上运行成功,其编程速度快,能达到实时、精确、智能化、成批量的检测,从很大程度上提高了PCB板检测的质量和速度。
引言
自动光学检测(AOI, Automated Optical Inspection)是最近这些年兴起来的一种视觉检 测方法。它是通过CCD 来获取图像,通过计算机的处理和分析比较来判断缺陷和故障。AOI 在PCB 板生产线上的应用,其优点是检测速度快,编程时间短,能大批量的对图像进行智 能检测和控制。随着工业技术的发展,对PCB 板的孔径大小的要求越来越精确,对机器的 大批量生产的要求也越来越高了。本文于某生产数孔机公司的一个项目,技术要求PCB 孔位的最小半径为0.2mm,每块PCB 板上多达2000 个的圆孔,要求总处理时间不超过10s, 处理后得到的圆心精确到0.01 个像素级,并且每个圆心与模版圆心的偏差不得超过25um, 若有80%的圆心偏差超过这个指标,即视为为不合格,那么就需要调整设备基准。
边缘是指图像中像素灰度有阶跃变化或屋顶状变化的那些像素的集合。它存在于目标与 背景 、目标与目标、区域与区域、基元与基元之间。他对图像识别和分析十分有用,边缘 能勾画出目标物体轮廓,使观察者一目了然,包含了丰实的信息[1] ,所以要获得孔位的信 息,首先得进行边缘检测和轮廓跟踪,本文用freeman 链码对边缘进行轮廓跟踪,采用链码 表和线段表存储和处理数据。具体流程图如图1:
1 图像的获取和预处理
(1)本文采用背光照明和高分辨率的相机获得高对比度和高质量的图像,图像分辨率 为409*096,图像源的质量非常重要,它将直接影响到后续图像处理的效果。
(2)采用中值滤波对图像进行平滑处理,其目的是尽量减少或消除噪声的影响,改善 图像质量。中值滤波在一定的条件下可以克服线性滤波器如最小均方滤波、均值滤波等带来 的图像细节模糊,而且对滤波脉冲干扰及图像扫描噪声最为有效,对于本文涉及的图像是 PCB 板的孔位细节缺陷,所以采取中值滤波更为合适,它的好处是既可以消除噪声又不破 坏图像的边缘。
(3)用OSTU(最大类间方差法)进行阈值分割,此方法简单且稳定有效,它是在判 定最小函数和二乘法原理的基础上自动选取阈值的二值化方法,其思路是将图像直方图用某 一灰度分割成两组,被分割成的两组中方差最大时,此灰度就被定了最佳阈值[2]。
2 用链码表和线段表[3]对图像的数据结果进行描述
(1)用Freeman 链码轮廓跟踪 Freeman 链码[4]分为八连通和四连通链码,八连通链码用中心像素指向它的8 个邻点的 方向来定义,四连通是用中心像素指向它的4 个邻点方向,取值0~3。本文运用八连通链 码,如下图2 所示,8 连通链码按顺时针方向旋转,每顺时针旋转45 度,链码值就减少1; 链码值加4,则方向反向,加8 则又回到原来的方向。链码值超过8 或者小于0 的时候,就 用模8 运算除去或者补上8。
(2)链码表的应用
对于PCB 板中单个孔位的跟踪,本文采用Freeman 链码方式来对目标物体求取边界链 码,当搜索到某一点为目标体的灰度级时,此点即为目标体的边界点,如果此点未进行编码 过,则此点即为某一个孔位的起始点,从该点开始用Freeman 链码的方式进行轮廓跟踪,可 以跟踪到边界上每个点的链码值,并且根据中心点与各邻点坐标的偏差值,如表1,可由起 始点的坐标得到每一个边界点的坐标,即可表达为一个二维数组inc[8][2]。
具体编码过程为:设目标物体的灰度级为G1,背景灰度级为G2。对整个PCB 板的图 像进行搜索,当某一点A 满足G1 的灰度级时,即视为边界点,从A 开始,顺时针进行搜 索孔位的边界,定义初时值为链码值等于4 的方向进行搜索下一个点,若下一个点灰度值等 于G1,即为下一个边界点,否则,搜索方向再顺时针旋转45 度,继续搜索链码值为3 的点, 这样一直找到第一个满足灰度值等于G1 的点B 为止。然后把B 作为新的边界点,并置跟 踪结束标志为0,若在邻点中没有找到边界点,则置跟踪结束标志为1,表示它为孤立点。
B 点作为新的边界点,取它的链码值为起始链码的方向,顺时针方向重复上面的跟踪,一直 到最后的一个边界点为A 点为止,单个孔位图跟踪完毕,并对此区域进行颜色填充标记, 代表已经搜索过,所跟踪的链码值存入链码表中。本文把链码表存放在一维整形数组code[ ] 中,下标为0 和1 的存放内容分别为起始边界点的坐标X 和Y,在下标为2 的单元中存放 总的链码个数N,从下标为3 的单元开始一次存放第一个边界点的链码值,第二个边界点的 链码值……一直到最后的第N 个边界点的链码值。
3 线段表
(1)线段表的定义
由于链码表只能表示目标体的边界,而不能表示边界的内外,链码表无法表示目标体的 内部像素,但实际上,对一个图像进行处理除了要得到边界点和周长,也取得其他的参数, 如本文着重要得到的孔心数据,以及面积等,要实现内部像素的处理和运算,还需要另外的 一个种结构——线段表。
区域也可以看成由一条条水平的线段所组成。每一个线段可由它的两个端点来表示。将 区域中的所有水平线段按扫描顺利排列起来的端点表称为线段表。线段表的每一个点由两部 分组成,偶数点表示左端点的坐标,奇数点表示右端点的坐标,如果定义一个结构DOT 来 表示线段表,用一个一维数组dot[ ], 设i 表示线段的个数,则此此线段的左端点可以表示为 dot[2*i],右端点为dot[2*i+1]。
(2)线段表的应用
线段表获取了每一条线段和线段的端点值,所以通过运算可以非常方便的获取区域的内 部像素,并求出图像的其他重要参数,如本文需要求出的参数:计算区域的面积,重心;对 某个区域进行快速填充(避免重复搜索,提高效率);区域的形状参数,其公式表示为:F =L*L/4 πS
本项目的目的重在检测圆孔的圆心,所以对于区域的形状检测也尤为重要,上述公式中 L 是周长,S 是面积,通过这种比值得出的形状参数F,圆的形状参数为1,与1 的差异越 大,与圆的形状相差就越大,为了统计PCB 板孔中圆孔的个数和圆心,可以用到此形状参 数进行判断,如果在1 附近的,可以近似作为圆孔进行处理,否则直接填充为非圆孔颜色标 记,不记入结果之中。
(3) 链码表到线段表的转换[5]
用线段表表示可以得出图像其他的重要参数,与链码表向线段表的转换可以依照表2。
具体步骤如下:
链码经过表的转化后,得到三种类型[6]:中间点、类型号0;左端点、类型号1;右端 点、类型号2;奇异点、类型号3。根据链码表中的数据可知进入的链码值和离开的链码值, 对这两者的方向可以确定出此点的类型。在程序设计上面,可以依照表3 进行点的类型判定, 若为左右端点,则将其坐标存入临时数组中,奇异点可以看成是一个相同的左右点重合,即 应存两次,中间点不用存入。在线段表中端点按Y 坐标的大小排序,在同一行中按X 坐标 的大小排序。
4 实验结果
本实验采取本项目 PCB 图像的一个截图来进行处理,截图和处理填充后的图像如图3 所示。
对截图用本文的算法和程序进行处理,用链码表和线段表进行数据的存储,可以得到PCB 孔位的一些参数信息,如表4 所示:
5 结束语
本文采用背光源获取高质量的 PCB 图像,并用OSTU 阈值分割法稳定而简单的获取源 图像的二值图像,扫描并进行轮廓跟踪,采用向右追踪下一点的原则,更准备更省时,运用 链码表和线段表存储数据和数据处理,非常方便和精确地获取到PCB 板的周长,面积和孔 位形心,成功地解决了PCB 板打孔时的定位问题。本实验在Visual C++软件平台上进行 了运行和验证,可以在31us 的时间内检测并处理216 个圆孔,获取本项目所要求的速度和 精度,结果证明此方法是可行的。
本文作者创新点: 针对本项目的特点,采用背光源采集PCB 图像,用freeman 链码进 行轮廓跟踪,并通过链码表和线段表来储存数据,使本项目的完成更精确更省时。
更多回帖