检测-工件毛刺

这又是一个简短的示例,用简单的几个操作,就能将工件的表面毛刺检测出来。

示例代码如下:

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,通过两个区域相减,即可得到毛刺区域,在做减法之前,需要先得到包含毛刺的区域,和不包含毛刺的区域。

整个代码通过二值化 + 形态学 + 差分,就得到了毛刺区域,处理的手法很简单,在检测中是很经典的方式。大家可以从简单到复杂的掌握这种方法。

更多最新文章,请关注公众号:

 

程序执行流程:
待处理的图像:

不包含毛刺的区域,右边红色的区域:

包含毛刺的区域,右边绿色框包含的区域:

区域差分后的结果:

对包含毛刺的区域进行开运算之后,完全得到毛刺区域:

在原图中标记出毛刺区域:

 

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