鏈碼表和線段表在PCB孔位檢測(cè)中的應(yīng)用
摘要:本文對(duì)工業(yè)上印刷電路板(Printed-Circuit Board)孔位的定位問(wèn)題進(jìn)行研究,達(dá)到對(duì)PCB板的打孔機(jī)進(jìn)行基準(zhǔn)調(diào)整的目的。對(duì)CCD所獲取的圖像進(jìn)行有效的預(yù)處理,采取鏈碼表和線段表相互結(jié)合運(yùn)用,精確快速的確定PCB孔位的形心,本文的方法對(duì)形心的檢測(cè)可以精確到0.001個(gè)像素級(jí),并求出孔位的面積、周長(zhǎng)、形狀、形心。此方法在VC++6.0的平臺(tái)上運(yùn)行成功,其編程速度快,能達(dá)到實(shí)時(shí)、精確、智能化、成批量的檢測(cè),從很大程度上提高了PCB板檢測(cè)的質(zhì)量和速度。
引言
自動(dòng)光學(xué)檢測(cè)(AOI, Automated Optical Inspection)是最近這些年興起來(lái)的一種視覺(jué)檢 測(cè)方法。它是通過(guò)CCD 來(lái)獲取圖像,通過(guò)計(jì)算機(jī)的處理和分析比較來(lái)判斷缺陷和故障。AOI 在PCB 板生產(chǎn)線上的應(yīng)用,其優(yōu)點(diǎn)是檢測(cè)速度快,編程時(shí)間短,能大批量的對(duì)圖像進(jìn)行智 能檢測(cè)和控制。隨著工業(yè)技術(shù)的發(fā)展,對(duì)PCB 板的孔徑大小的要求越來(lái)越精確,對(duì)機(jī)器的 大批量生產(chǎn)的要求也越來(lái)越高了。本文來(lái)源于某生產(chǎn)數(shù)孔機(jī)公司的一個(gè)項(xiàng)目,技術(shù)要求PCB 孔位的最小半徑為0.2mm,每塊PCB 板上多達(dá)2000 個(gè)的圓孔,要求總處理時(shí)間不超過(guò)10s, 處理后得到的圓心精確到0.01 個(gè)像素級(jí),并且每個(gè)圓心與模版圓心的偏差不得超過(guò)25um, 若有80%的圓心偏差超過(guò)這個(gè)指標(biāo),即視為為不合格,那么就需要調(diào)整設(shè)備基準(zhǔn)。
邊緣是指圖像中像素灰度有階躍變化或屋頂狀變化的那些像素的集合。它存在于目標(biāo)與 背景 、目標(biāo)與目標(biāo)、區(qū)域與區(qū)域、基元與基元之間。他對(duì)圖像識(shí)別和分析十分有用,邊緣 能勾畫出目標(biāo)物體輪廓,使觀察者一目了然,包含了豐實(shí)的信息[1] ,所以要獲得孔位的信 息,首先得進(jìn)行邊緣檢測(cè)和輪廓跟蹤,本文用freeman 鏈碼對(duì)邊緣進(jìn)行輪廓跟蹤,采用鏈碼 表和線段表存儲(chǔ)和處理數(shù)據(jù)。具體流程圖如圖1:
1 圖像的獲取和預(yù)處理
(1)本文采用背光照明和高分辨率的相機(jī)獲得高對(duì)比度和高質(zhì)量的圖像,圖像分辨率 為409*096,圖像源的質(zhì)量非常重要,它將直接影響到后續(xù)圖像處理的效果。
(2)采用中值濾波對(duì)圖像進(jìn)行平滑處理,其目的是盡量減少或消除噪聲的影響,改善 圖像質(zhì)量。中值濾波在一定的條件下可以克服線性濾波器如最小均方濾波、均值濾波等帶來(lái) 的圖像細(xì)節(jié)模糊,而且對(duì)濾波脈沖干擾及圖像掃描噪聲最為有效,對(duì)于本文涉及的圖像是 PCB 板的孔位細(xì)節(jié)缺陷,所以采取中值濾波更為合適,它的好處是既可以消除噪聲又不破 壞圖像的邊緣。
(3)用OSTU(最大類間方差法)進(jìn)行閾值分割,此方法簡(jiǎn)單且穩(wěn)定有效,它是在判 定最小函數(shù)和二乘法原理的基礎(chǔ)上自動(dòng)選取閾值的二值化方法,其思路是將圖像直方圖用某 一灰度分割成兩組,被分割成的兩組中方差最大時(shí),此灰度就被定了最佳閾值[2]。
2 用鏈碼表和線段表[3]對(duì)圖像的數(shù)據(jù)結(jié)果進(jìn)行描述
(1)用Freeman 鏈碼輪廓跟蹤 Freeman 鏈碼[4]分為八連通和四連通鏈碼,八連通鏈碼用中心像素指向它的8 個(gè)鄰點(diǎn)的 方向來(lái)定義,四連通是用中心像素指向它的4 個(gè)鄰點(diǎn)方向,取值0~3。本文運(yùn)用八連通鏈 碼,如下圖2 所示,8 連通鏈碼按順時(shí)針?lè)较蛐D(zhuǎn),每順時(shí)針旋轉(zhuǎn)45 度,鏈碼值就減少1; 鏈碼值加4,則方向反向,加8 則又回到原來(lái)的方向。鏈碼值超過(guò)8 或者小于0 的時(shí)候,就 用模8 運(yùn)算除去或者補(bǔ)上8。
(2)鏈碼表的應(yīng)用
對(duì)于PCB 板中單個(gè)孔位的跟蹤,本文采用Freeman 鏈碼方式來(lái)對(duì)目標(biāo)物體求取邊界鏈 碼,當(dāng)搜索到某一點(diǎn)為目標(biāo)體的灰度級(jí)時(shí),此點(diǎn)即為目標(biāo)體的邊界點(diǎn),如果此點(diǎn)未進(jìn)行編碼 過(guò),則此點(diǎn)即為某一個(gè)孔位的起始點(diǎn),從該點(diǎn)開始用Freeman 鏈碼的方式進(jìn)行輪廓跟蹤,可 以跟蹤到邊界上每個(gè)點(diǎn)的鏈碼值,并且根據(jù)中心點(diǎn)與各鄰點(diǎn)坐標(biāo)的偏差值,如表1,可由起 始點(diǎn)的坐標(biāo)得到每一個(gè)邊界點(diǎn)的坐標(biāo),即可表達(dá)為一個(gè)二維數(shù)組inc[8][2]。
具體編碼過(guò)程為:設(shè)目標(biāo)物體的灰度級(jí)為G1,背景灰度級(jí)為G2。對(duì)整個(gè)PCB 板的圖 像進(jìn)行搜索,當(dāng)某一點(diǎn)A 滿足G1 的灰度級(jí)時(shí),即視為邊界點(diǎn),從A 開始,順時(shí)針進(jìn)行搜 索孔位的邊界,定義初時(shí)值為鏈碼值等于4 的方向進(jìn)行搜索下一個(gè)點(diǎn),若下一個(gè)點(diǎn)灰度值等 于G1,即為下一個(gè)邊界點(diǎn),否則,搜索方向再順時(shí)針旋轉(zhuǎn)45 度,繼續(xù)搜索鏈碼值為3 的點(diǎn), 這樣一直找到第一個(gè)滿足灰度值等于G1 的點(diǎn)B 為止。然后把B 作為新的邊界點(diǎn),并置跟 蹤結(jié)束標(biāo)志為0,若在鄰點(diǎn)中沒(méi)有找到邊界點(diǎn),則置跟蹤結(jié)束標(biāo)志為1,表示它為孤立點(diǎn)。
B 點(diǎn)作為新的邊界點(diǎn),取它的鏈碼值為起始鏈碼的方向,順時(shí)針?lè)较蛑貜?fù)上面的跟蹤,一直 到最后的一個(gè)邊界點(diǎn)為A 點(diǎn)為止,單個(gè)孔位圖跟蹤完畢,并對(duì)此區(qū)域進(jìn)行顏色填充標(biāo)記, 代表已經(jīng)搜索過(guò),所跟蹤的鏈碼值存入鏈碼表中。本文把鏈碼表存放在一維整形數(shù)組code[ ] 中,下標(biāo)為0 和1 的存放內(nèi)容分別為起始邊界點(diǎn)的坐標(biāo)X 和Y,在下標(biāo)為2 的單元中存放 總的鏈碼個(gè)數(shù)N,從下標(biāo)為3 的單元開始一次存放第一個(gè)邊界點(diǎn)的鏈碼值,第二個(gè)邊界點(diǎn)的 鏈碼值……一直到最后的第N 個(gè)邊界點(diǎn)的鏈碼值。
3 線段表
(1)線段表的定義
由于鏈碼表只能表示目標(biāo)體的邊界,而不能表示邊界的內(nèi)外,鏈碼表無(wú)法表示目標(biāo)體的 內(nèi)部像素,但實(shí)際上,對(duì)一個(gè)圖像進(jìn)行處理除了要得到邊界點(diǎn)和周長(zhǎng),也取得其他的參數(shù), 如本文著重要得到的孔心數(shù)據(jù),以及面積等,要實(shí)現(xiàn)內(nèi)部像素的處理和運(yùn)算,還需要另外的 一個(gè)種結(jié)構(gòu)——線段表。
區(qū)域也可以看成由一條條水平的線段所組成。每一個(gè)線段可由它的兩個(gè)端點(diǎn)來(lái)表示。將 區(qū)域中的所有水平線段按掃描順利排列起來(lái)的端點(diǎn)表稱為線段表。線段表的每一個(gè)點(diǎn)由兩部 分組成,偶數(shù)點(diǎn)表示左端點(diǎn)的坐標(biāo),奇數(shù)點(diǎn)表示右端點(diǎn)的坐標(biāo),如果定義一個(gè)結(jié)構(gòu)DOT 來(lái) 表示線段表,用一個(gè)一維數(shù)組dot[ ], 設(shè)i 表示線段的個(gè)數(shù),則此此線段的左端點(diǎn)可以表示為 dot[2*i],右端點(diǎn)為dot[2*i+1]。
(2)線段表的應(yīng)用
線段表獲取了每一條線段和線段的端點(diǎn)值,所以通過(guò)運(yùn)算可以非常方便的獲取區(qū)域的內(nèi) 部像素,并求出圖像的其他重要參數(shù),如本文需要求出的參數(shù):計(jì)算區(qū)域的面積,重心;對(duì) 某個(gè)區(qū)域進(jìn)行快速填充(避免重復(fù)搜索,提高效率);區(qū)域的形狀參數(shù),其公式表示為:F =L*L/4 πS
本項(xiàng)目的目的重在檢測(cè)圓孔的圓心,所以對(duì)于區(qū)域的形狀檢測(cè)也尤為重要,上述公式中 L 是周長(zhǎng),S 是面積,通過(guò)這種比值得出的形狀參數(shù)F,圓的形狀參數(shù)為1,與1 的差異越 大,與圓的形狀相差就越大,為了統(tǒng)計(jì)PCB 板孔中圓孔的個(gè)數(shù)和圓心,可以用到此形狀參 數(shù)進(jìn)行判斷,如果在1 附近的,可以近似作為圓孔進(jìn)行處理,否則直接填充為非圓孔顏色標(biāo) 記,不記入結(jié)果之中。
(3) 鏈碼表到線段表的轉(zhuǎn)換[5]
用線段表表示可以得出圖像其他的重要參數(shù),與鏈碼表向線段表的轉(zhuǎn)換可以依照表2。
具體步驟如下:
鏈碼經(jīng)過(guò)表的轉(zhuǎn)化后,得到三種類型[6]:中間點(diǎn)、類型號(hào)0;左端點(diǎn)、類型號(hào)1;右端 點(diǎn)、類型號(hào)2;奇異點(diǎn)、類型號(hào)3。根據(jù)鏈碼表中的數(shù)據(jù)可知進(jìn)入的鏈碼值和離開的鏈碼值, 對(duì)這兩者的方向可以確定出此點(diǎn)的類型。在程序設(shè)計(jì)上面,可以依照表3 進(jìn)行點(diǎn)的類型判定, 若為左右端點(diǎn),則將其坐標(biāo)存入臨時(shí)數(shù)組中,奇異點(diǎn)可以看成是一個(gè)相同的左右點(diǎn)重合,即 應(yīng)存兩次,中間點(diǎn)不用存入。在線段表中端點(diǎn)按Y 坐標(biāo)的大小排序,在同一行中按X 坐標(biāo) 的大小排序。
4 實(shí)驗(yàn)結(jié)果
本實(shí)驗(yàn)采取本項(xiàng)目 PCB 圖像的一個(gè)截圖來(lái)進(jìn)行處理,截圖和處理填充后的圖像如圖3 所示。
對(duì)截圖用本文的算法和程序進(jìn)行處理,用鏈碼表和線段表進(jìn)行數(shù)據(jù)的存儲(chǔ),可以得到PCB 孔位的一些參數(shù)信息,如表4 所示:
5 結(jié)束語(yǔ)
本文采用背光源獲取高質(zhì)量的 PCB 圖像,并用OSTU 閾值分割法穩(wěn)定而簡(jiǎn)單的獲取源 圖像的二值圖像,掃描并進(jìn)行輪廓跟蹤,采用向右追蹤下一點(diǎn)的原則,更準(zhǔn)備更省時(shí),運(yùn)用 鏈碼表和線段表存儲(chǔ)數(shù)據(jù)和數(shù)據(jù)處理,非常方便和精確地獲取到PCB 板的周長(zhǎng),面積和孔 位形心,成功地解決了PCB 板打孔時(shí)的定位問(wèn)題。本實(shí)驗(yàn)在Visual C++軟件平臺(tái)上進(jìn)行 了運(yùn)行和驗(yàn)證,可以在31us 的時(shí)間內(nèi)檢測(cè)并處理216 個(gè)圓孔,獲取本項(xiàng)目所要求的速度和 精度,結(jié)果證明此方法是可行的。
本文作者創(chuàng)新點(diǎn): 針對(duì)本項(xiàng)目的特點(diǎn),采用背光源采集PCB 圖像,用freeman 鏈碼進(jìn) 行輪廓跟蹤,并通過(guò)鏈碼表和線段表來(lái)儲(chǔ)存數(shù)據(jù),使本項(xiàng)目的完成更精確更省時(shí)。