这又是一个简短的示例,用简单的几个操作,就能将工件的表面毛刺检测出来。
示例代码如下:
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,通过两个区域相减,即可得到毛刺区域,在做减法之前,需要先得到包含毛刺的区域,和不包含毛刺的区域。
整个代码通过二值化 + 形态学 + 差分,就得到了毛刺区域,处理的手法很简单,在检测中是很经典的方式。大家可以从简单到复杂的掌握这种方法。
更多最新文章,请关注公众号:
程序执行流程:
待处理的图像:
不包含毛刺的区域,右边红色的区域:
包含毛刺的区域,右边绿色框包含的区域:
区域差分后的结果:
对包含毛刺的区域进行开运算之后,完全得到毛刺区域:
在原图中标记出毛刺区域: