齊凱,于正林,張博龍,宋慶
(長春理工大學 機電工程學院,長春 130022)
本文中所涉及的微光瞄準鏡故障為簡單的亮點、黑斑。為了較好地識別出這類故障,結合OpenCV[1]與VC 技術,我們采用的是圖像減影法。首先,通過采集系統(tǒng)采集到30 幅微光瞄準鏡圖像,然后對這30 幅圖像求平均得到一幀標準圖像。經(jīng)圖像濾波后,用后來采集到的圖像與標準圖像相減,判斷與標準圖像是否存在差異點,從而判斷是否存在故障。該算法簡單實用,能有效地識別出光學瞄準鏡上諸如亮點、黑斑等故障。
此部分工作由CCD 數(shù)字相機、圖像采集卡與處理計算機構成。本實驗中我們需要一個所謂的微光瞄準鏡標準圖像,然后通過有故障的圖像與標準圖像相減,從而判斷出圖像與標準圖像的差別,繼而判斷出微光瞄準鏡上是否存在故障。在此模塊中設立了一個初值為零的計數(shù)器,在對圖像進行采集的時候,會對新采集到的圖像通過濾波進行降噪處理,然后與前一次采集處理的圖像幀比較,若差異超出噪聲影響范圍則丟棄這幀圖像進行下一次采集,否則將新一幀圖像保存起來并對計數(shù)器加一,之后進行下一次采集。如此循環(huán)下去直到計數(shù)器的值為30,即計算機已經(jīng)保存了30幀經(jīng)過降噪處理的無故障圖像,把這30 幀圖像進行平均化處理便可得到一幀標準圖像,如圖1 所示。
圖1 30 幀圖像進行平均化處理后的標準圖像
圖像故障識別的基本原理是采用當幀圖像與標準圖像相加(減)等算法去除背景等不變的部分,所剩下的就是圖像超差的特征部分[2]。若采集的當幀圖像與標準圖像相減后存在超差的部分,則認為圖像存在故障,反之若不存在超差的部分,則認為不存在圖像故障。
黑斑、亮點故障識別的實現(xiàn)原理:光學瞄準鏡圖像是一個時間平穩(wěn)過程,其屏幕噪聲為正態(tài)白噪聲,可以先用濾波去除圖像噪聲,之后將被測圖像與標準圖像相減,把相減結果與亮、暗閾值圖像加以比較,若超出閾值則認為圖像發(fā)生了黑斑或亮點故障[3]。
本實驗中,由CCD 攝像機傳輸過來的圖像不但存在背景像素,而且也存在噪聲像素。所謂噪聲,就是圖像在傳輸過程中由于各種內(nèi)部或外部的干擾而造成的像素灰度突變[4]。圖像噪聲可能主要是來自以下幾個方面:CCD攝像機的攝取器件在光電、電磁轉換過程中引起的人為噪聲;周圍環(huán)境的影響如人的走動、咳嗽、光照等所引起的噪聲;由物理的不連續(xù)性或粒子性引起。
濾波處理雖然可以較好地消除噪聲,但同時又會在一定程度上帶來平均化的缺點。即噪聲雖然被消除,可圖像灰度尖銳變化的線和邊緣卻模糊不清了。所以本文中我們采用了“中值濾波”法,這種方法既可保持邊緣又能消除其它部分噪聲中值濾波法[5](Median Filtering)是一種可有效抑制噪聲的基于排序統(tǒng)計理論非線性平滑濾波方法。其原理是:先確定一個以某個像素為中心的鄰域,一般為方形鄰域(通常被稱為窗口),然后將鄰域中各個像素的灰度值進行排序,并取其中間值作為中心點像素的新值;當窗口在圖像中上下左右進行移動后,利用中值濾波算法便可以很好地對圖像進行平滑處理。如圖2為濾波后的標準圖像。
圖2 濾波后的圖像
所謂“減影”,也叫做“差影”(Subtraction)。其原理就是將前后捕獲到的兩幅圖像對應坐標的像素灰度值相減,得到的各點灰度差值組成新的結果圖像。實質上也就是要對圖像進行檢測和分割。一幅圖像中包含對象物、背景和噪聲,而我們要得到的只是其中的某個部分或者某些點,將這些部分或者將這些點提取出來的過程我們稱為圖像的分割,常用的方法有:按邊緣不同來劃分各個區(qū)域;按灰度幅度不同來分割各個區(qū)域;按形狀來劃分各個區(qū)域等。
根據(jù)像素灰度的分布以及變化,可以對灰度圖進行分割與檢測,常用的方法是找出對象物和背景灰度的邊界,我們把這個邊界稱為“閾值”,然后以這個閾值為界限將圖像中所有像素分為兩部分:屬于對象物灰度范圍的像素群和不屬于對象物灰度范圍的像素群。接下來再分別將這兩種像素群設置成0 和255 兩個不同的灰度值,我們把這個過程稱作“二值化”[6]。這樣我們就可以在圖像數(shù)據(jù)中很容易的看出哪部分是我們需要的,哪部分是我們不感興趣的。通過對圖像的分割和檢測,就可識別對象物了。
首先,需要設定一個合理有效的閾值。本文使用了OpenCV 中cvCreateTrackbar 這個函數(shù)創(chuàng)建了一個最小值為0 最大值為255 的拖動條,如圖3 所示。這樣,在閾值的選擇方面有著很高的靈活性,在不同的環(huán)境或是其他的特殊情況下,我們可以有選擇地在0 到255 中間選擇我們需要的合理的閾值。經(jīng)過反復測試,本實驗中我們把這個閾值設置在29 到31 區(qū)間,這個區(qū)間的閾值能更有效地識別出亮點、黑斑的故障。
圖3 拖動條
在本文中,對圖像上每個像素點進行了相減運算,為了實現(xiàn)這個功能,在OpenCV 中使用了cvGet2D 這個函數(shù)。s1=cvGet2D(img0,i,j)這個函數(shù)的意思是獲取img0圖像中坐標為(i,j)的像素的點存在s1 中。這時我們便得到了標準圖像中每個像素點的值。同樣我們利用s2=cvGet2D(img1,i,j)這個函數(shù)得到故障圖像中坐標為(i,j)的像素值。然后把有故障圖像與標準圖像逐個像素對應相減。若相減的結果大于所設定的閾值,我們則認為圖像是有故障的,把這些點設置為0,即為黑色。然后把這些有故障的點標記下來。本文使用的是cvSet2D(img2,i,j,s2)函數(shù)。而小于等于閾值的我們設定為255,即為白色。這樣我們在函數(shù)中再次使用一個循環(huán)遍歷img2 相減后得到圖像的所有像素點,如果有值為0 的點,則認為圖像是有故障的。因為是對圖像上逐個點的像素進行對應相減,此種算法的精度很高。另外,此種算法中所用到的cvGet2D 和cvSet2D 兩個函數(shù)會在遍歷整幅圖像時把有故障點的位置記錄并標記下來,這樣我們在計算這些點的坐標時就一目了然了。
圖4為我們所定義的有故障圖像,從中我們可以看出,與標準圖像相比,圖4 中有明顯的4 個亮點以及一些黑斑。在兩幅圖像相減后有故障的點我們已經(jīng)設置成255,即為白色,而沒有故障的點我們已經(jīng)設置為0,即為黑色。所以兩幅圖相減后我們得到了如圖5 所示的減影后的圖像,圖像中白色的部分為有故障的圖像與標準圖像差異的部分。而兩幅圖像相同的部分也就成了如圖所見的黑色的背景。如果出現(xiàn)了如圖5 所示白色小點的部分,那么也就證明了圖像是存在黑斑或者亮點的,這便說明圖像是有故障的,也就證實了我們的算法是合理并且有效的。
圖4 有故障圖像
圖5 減影后的圖像
用減影方法來處理圖像簡單高效,此算法成功地識別出了微光瞄準鏡中諸如亮點、黑斑等圖像的故障。而且可以根據(jù)環(huán)境的變化以及實驗需要自動調節(jié)合理的閾值。在精度上有了質的飛躍,同時能方便地求出故障點的坐標位置。但在判別其他的像閃光、忽明忽暗等故障還存在一些缺陷,算法循環(huán)偏多,不能達到較高的處理速度,在這方面以后還需要多加改進,便于處理更多的圖像故障。
[1]劉瑞禎,于仕琪.OpenCV 教程[M].北京:北京航空航天大學出版社,2007.
[2]GONZALEZ R C.數(shù)字圖像處理[M].北京:電子工業(yè)出版社,2003.
[3]章毓晉.圖像處理和分析[M].北京:清華大學出版社,1999。
[4]陸系群,陳純.圖像處理原理技術與方法[M].杭州:浙江大學出版社,2001.
[5]姚敏.數(shù)字圖像處理[M].北京:機械工業(yè)出版社,2006.
[6]徐利華,陳早生.二值圖像中的游程編碼區(qū)域標記[J].光電工程,2004,6(31):63-65.