“濃淡補正”是基恩士視覺的一個很強大的算法工具。使用“濃淡補正”的預處理,可以消除工件表面的光澤和陰影,僅抽取污點及瑕疵。(如下圖)
至於它的實現原理,網上搜不到相關資料。不過根據它的實現效果,能大致窺見它的原理:排除背景漸變的濃淡變化,只抽取對比度急劇變化的部分。
看到這句話,想必有些人已經想到了一個詞“動態閾值”,沒錯,動態閾值是跟它有幾分相似,這個我們後面再分析。
一、濃淡補正近似實現
下圖中,要把“黑點”和“彎曲的細黑線”提取出來,其中黑點正方形的邊長是5個像素。
處理算法如下:
1 read_image (Image, '白格矩陣.jpg') 2 rgb1_to_gray (Image, GrayImage) 3 4 gen_disc_se (SE, 'byte', 11, 11, 0) //設計結構元素 5 gray_dilation (GrayImage, SE, ImageDilation) 6 gray_erosion (ImageDilation, SE, ImageErosion) 7 sub_image (ImageErosion, GrayImage, ImageSub, 1, 120) //這個120也可以設置其他值
構造的結構原圖是一個11 × 11的矩形結構元素。
分析:
① gray_dilation (GrayImage, SE, ImageDilation),對圖像進行灰度值像素膨脹,即灰度值較大的區域膨脹,面積變大。(如下圖左ImageDilation)
② gray_erosion (ImageDilation, SE, ImageErosion),對圖像進行灰度值像素收縮,即灰度值較大的區域收縮,面積變小。(如下圖右ImageErosion)
③ 在灰度值像素膨脹的過程中,原圖中的“小黑點”和“細長的黑線”被它們周圍的高亮灰度值像素膨脹覆蓋掉了。(如下圖左)
④ 在灰度值像素收縮的過程中,圖中的白格子面積縮小,幾乎恢復原狀,不過在上一步中被膨脹覆蓋掉的小黑點、細黑線不可能再復原了。
⑤ sub_image (ImageErosion, GrayImage, ImageSub, 1, 120),用無黑點、黑線的圖ImageErosion減去原始圖,就有效提取出了黑點和黑線。(如上圖所示)
使用這種方式提取複雜背景的黑點和黑線,有什麼注意點呢?
① 結構元素要構造得合理,一般來說,構造正方形結構元素最通用。
② 圖中“小黑點”的邊長是5 pix,結構元素至少要設置爲6 × 6 纔行,不然不能有效提取出小黑點。
③ 點只能提取較小的,線也只能提取較細長的。(因爲結構元素設計過大,可能會有難以預料的結果)
下圖中展示了結構元素分別爲3 × 3、50 × 50時,最終的效果圖ImageSub:
二、複雜背景下的算法表現
三、動態閾值
四、diff_of_gauss
(待續)