這又是一個簡短的示例,用簡單的幾個操作,就能將工件的表面毛刺檢測出來。
示例代碼如下:
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,通過兩個區域相減,即可得到毛刺區域,在做減法之前,需要先得到包含毛刺的區域,和不包含毛刺的區域。
整個代碼通過二值化 + 形態學 + 差分,就得到了毛刺區域,處理的手法很簡單,在檢測中是很經典的方式。大家可以從簡單到複雜的掌握這種方法。
更多最新文章,請關注公衆號:
程序執行流程:
待處理的圖像:
不包含毛刺的區域,右邊紅色的區域:
包含毛刺的區域,右邊綠色框包含的區域:
區域差分後的結果:
對包含毛刺的區域進行開運算之後,完全得到毛刺區域:
在原圖中標記出毛刺區域: