檢測-工件毛刺

這又是一個簡短的示例,用簡單的幾個操作,就能將工件的表面毛刺檢測出來。

示例代碼如下:

dev_update_window ('off')
* 讀圖像
* 此處讀圖像是一次性讀取多個圖像文件
read_image (Fins, 'fin' + [1:3])
get_image_size (Fins, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width[0], Height[0], 'black', WindowID)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
for I := 1 to 3 by 1
    * 選擇讀取的多個圖像中一個圖像對象
    select_obj (Fins, Fin, I)
    dev_display (Fin)
    * 快速二值化 圖像分割,選擇了圖像中亮的那一部分
    binary_threshold (Fin, Background, 'max_separability', 'light', UsedThreshold)
    dev_set_color ('blue')
    dev_set_draw ('margin')
    dev_set_line_width (4)
    dev_display (Background)
    disp_continue_message (WindowID, 'black', 'true')
    stop ()
    * 閉運算,通過該手法,去掉了那個凸起的區域
    closing_circle (Background, ClosedBackground, 250)
    dev_set_color ('green')
    dev_display (ClosedBackground)
    disp_continue_message (WindowID, 'black', 'true')
    stop ()
    * 差分,兩個區域相減,相減的兩個區域是:二值化時選中的亮區域和閉運算完畢之後的區域
    difference (ClosedBackground, Background, RegionDifference)
    * 開運算  
    * 作用是:去掉多餘的區域,獨留凸起的區域
    opening_rectangle1 (RegionDifference, FinRegion, 5, 5)
    dev_display (Fin)
    dev_set_color ('red')
    dev_display (FinRegion)
    area_center (FinRegion, FinArea, Row, Column)
    if (I < 3)
        disp_continue_message (WindowID, 'black', 'true')
        stop ()
    endif
endfor

重點說明:
1. 對於讀圖像文件的算子read_image,可以一次讀取多個文件,然後在使用的時候再循環的取單個對象進行處理。取對象的算子是select_obj
2. 快速二值化算子binary_threshold,對於黑白分明的灰度圖像,能通過亮和暗來提取我們需要的區域
3. 差分算子difference,通過兩個區域相減,即可得到毛刺區域,在做減法之前,需要先得到包含毛刺的區域,和不包含毛刺的區域。

整個代碼通過二值化 + 形態學 + 差分,就得到了毛刺區域,處理的手法很簡單,在檢測中是很經典的方式。大家可以從簡單到複雜的掌握這種方法。

更多最新文章,請關注公衆號:

 

程序執行流程:
待處理的圖像:

不包含毛刺的區域,右邊紅色的區域:

包含毛刺的區域,右邊綠色框包含的區域:

區域差分後的結果:

對包含毛刺的區域進行開運算之後,完全得到毛刺區域:

在原圖中標記出毛刺區域:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章