自動光學檢測(AOI, Automated Optical Inspection)是最近這些年興起來的一種視覺檢 測方法。它是通過CCD 來獲取圖像,通過計算機的處理和分析比較來判斷缺陷和故障。AOI 在PCB 板生產線上的應用,其優點是檢測速度快,編程時間短,能大批量的對圖像進行智 能檢測和控制。隨著工業技術的發展,對PCB 板的孔徑大小的要求越來越精確,對機器的 大批量生產的要求也越來越高了。本文來源于某生產數孔機公司的一個項目,技術要求PCB 孔位的最小半徑為0.2mm,每塊PCB 板上多達2000 個的圓孔,要求總處理時間不超過10s, 處理后得到的圓心精確到0.01 個像素級,并且每個圓心與模版圓心的偏差不得超過25um, 若有80%的圓心偏差超過這個指標,即視為為不合格,那么就需要調整設備基準。 邊緣是指圖像中像素灰度有階躍變化或屋頂狀變化的那些像素的集合。它存在于目標與 背景 、目標與目標、區域與區域、基元與基元之間。他對圖像識別和分析十分有用,邊緣 能勾畫出目標物體輪廓,使觀察者一目了然,包含了豐實的信息 ,所以要獲得孔位的信 息,首先得進行邊緣檢測和輪廓跟蹤,本文用freeman 鏈碼對邊緣進行輪廓跟蹤,采用鏈碼 表和線段表存儲和處理數據。具體流程圖如圖1: 1 圖像的獲取和預處理 (1)本文采用背光照明和高分辨率的相機獲得高對比度和高質量的圖像,圖像分辨率 為409*096,圖像源的質量非常重要,它將直接影響到后續圖像處理的效果。 (2)采用中值濾波對圖像進行平滑處理,其目的是盡量減少或消除噪聲的影響,改善 圖像質量。中值濾波在一定的條件下可以克服線性濾波器如最小均方濾波、均值濾波等帶來 的圖像細節模糊,而且對濾波脈沖干擾及圖像掃描噪聲最為有效,對于本文涉及的圖像是 PCB 板的孔位細節缺陷,所以采取中值濾波更為合適,它的好處是既可以消除噪聲又不破 壞圖像的邊緣。 (3)用OSTU(最大類間方差法)進行閾值分割,此方法簡單且穩定有效,它是在判 定最小函數和二乘法原理的基礎上自動選取閾值的二值化方法,其思路是將圖像直方圖用某 一灰度分割成兩組,被分割成的兩組中方差最大時,此灰度就被定了最佳閾值。 2 用鏈碼表和線段表對圖像的數據結果進行描述 (1)用Freeman 鏈碼輪廓跟蹤 Freeman 鏈碼分為八連通和四連通鏈碼,八連通鏈碼用中心像素指向它的8 個鄰點的 方向來定義,四連通是用中心像素指向它的4 個鄰點方向,取值0~3。本文運用八連通鏈 碼,如下圖2 所示,8 連通鏈碼按順時針方向旋轉,每順時針旋轉45 度,鏈碼值就減少1; 鏈碼值加4,則方向反向,加8 則又回到原來的方向。鏈碼值超過8 或者小于0 的時候,就 用模8 運算除去或者補上8。 (2)鏈碼表的應用 對于PCB 板中單個孔位的跟蹤,本文采用Freeman 鏈碼方式來對目標物體求取邊界鏈 碼,當搜索到某一點為目標體的灰度級時,此點即為目標體的邊界點,如果此點未進行編碼 過,則此點即為某一個孔位的起始點,從該點開始用Freeman 鏈碼的方式進行輪廓跟蹤,可 以跟蹤到邊界上每個點的鏈碼值,并且根據中心點與各鄰點坐標的偏差值,如表1,可由起 始點的坐標得到每一個邊界點的坐標,即可表達為一個二維數組inc。 具體編碼過程為:設目標物體的灰度級為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) 鏈碼表到線段表的轉換 用線段表表示可以得出圖像其他的重要參數,與鏈碼表向線段表的轉換可以依照表2。 具體步驟如下: 鏈碼經過表的轉化后,得到三種類型:中間點、類型號0;左端點、類型號1;右端 點、類型號2;奇異點、類型號3。根據鏈碼表中的數據可知進入的鏈碼值和離開的鏈碼值, 對這兩者的方向可以確定出此點的類型。在程序設計上面,可以依照表3 進行點的類型判定, 若為左右端點,則將其坐標存入臨時數組中,奇異點可以看成是一個相同的左右點重合,即 應存兩次,中間點不用存入。在線段表中端點按Y 坐標的大小排序,在同一行中按X 坐標 的大小排序。 4 實驗結果 本實驗采取本項目 PCB 圖像的一個截圖來進行處理,截圖和處理填充后的圖像如圖3 所示。 對截圖用本文的算法和程序進行處理,用鏈碼表和線段表進行數據的存儲,可以得到PCB 孔位的一些參數信息,如表4 所示: 5 結束語 本文采用背光源獲取高質量的 PCB 圖像,并用OSTU 閾值分割法穩定而簡單的獲取源 圖像的二值圖像,掃描并進行輪廓跟蹤,采用向右追蹤下一點的原則,更準備更省時,運用 鏈碼表和線段表存儲數據和數據處理,非常方便和精確地獲取到PCB 板的周長,面積和孔 位形心,成功地解決了PCB 板打孔時的定位問題。本實驗在Visual C++軟件平臺上進行 了運行和驗證,可以在31us 的時間內檢測并處理216 個圓孔,獲取本項目所要求的速度和 精度,結果證明此方法是可行的。 本文作者創新點: 針對本項目的特點,采用背光源采集PCB 圖像,用freeman 鏈碼進 行輪廓跟蹤,并通過鏈碼表和線段表來儲存數據,使本項目的完成更精確更省時。 |