本次分享的示例代碼很簡單,總共加起來不到20行,但是這個很簡單的案例,確有兩個很重要的halcon知識點,因此該示例算是小而精的典範。
先上代碼:
* PCB板線路檢測
* 讀圖像
read_image (Image, 'pcb')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
* detect defects ...
* 灰度圖像進行腐蝕和開運算 暗的像素變多
* 灰度圖像進行膨脹和閉運算 亮的像素變多
* 通過灰度圖像的開運算,讓線路板中斷開的地方連接起來了
gray_opening_shape (Image, ImageOpening, 7, 7, 'octagon')
* 通過灰度圖像的閉運算,讓線路板中斷開的地方斷得更開了
gray_closing_shape (Image, ImageClosing, 7, 7, 'octagon')
* 動態二值化,達到差分的效果
* 兩個輸入的灰度圖像,以offset爲基礎,按照指定的條件,選擇特定的灰度值組成輸出的結果灰度圖像
dyn_threshold (ImageOpening, ImageClosing, RegionDynThresh, 75, 'not_equal')
dev_display (Image)
dev_set_color ('red')
dev_set_draw ('margin')
dev_display (RegionDynThresh)
兩個重點:
1. 關於形態學,可以對兩種不同的對象進行處理,一種是區域,一種是灰度圖像。在本示例代碼中,是對灰度圖像進行的處理。
對灰度圖像處理:
腐蝕和開運算 -> 暗的像素變多
膨脹和閉運算 -> 亮的像素變多
對區域進行處理:
腐蝕和開運算 -> 區域變小
膨脹和閉運算 -> 區域變大
2. 在此示例中,通過灰度形態學處理+dyn_threashold這個算子結合處理,達到了difference算子進行區域差分達到的效果。也通過差分,從而得到了PCB線路中的斷開區域。
機器視覺在3C行業的使用,PCB板的檢測是一個很重要的方面,同時和機械臂結合起來,能真正實現機器代替人,將有缺陷的PCB板區分出來。當然,本案例只是一個簡單的示例,實際的使用會比這個要複雜,但是,在實際場景中,本示例所使用的方法,是可以借鑑的。
更多最新文章,請關注公衆號:
代碼的執行效果如下所示:
待處理的PCB板圖像,通過肉眼,可以看到是有斷線的。
灰度圖像開運算:
灰度圖像閉運算:
通過dyn_threshold處理後,得到的差分區域,紅色的都是:
在原圖中標記出斷線位置: