今天我们来讨论一下如何让机器能够从含不良产品的物品中选出优品。
假如这个为优品(OK):
这个为次品(NG):
那么我这里有一系列物品图片,分拣出好的和坏的,分辨标上OK、NG
先对所有文件做一次筛选,踢去非图片类的文件。
list_files ('./img/物块', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
由于我们这么多图片,肯定是要放一个for循环,进行循环处理。
for Index := 0 to |ImageFiles| - 1 by 1
...
endfor
像往常一样,我们先进行通道分解,将多通道分解成RGB单通道灰度图像。
decompose3(Image,R,G,B)
阈值分割
threshold (G, Regions, 0, 20)
连通域打散
connection(Regions,ConnectedRegions)
特征筛选
select_shape(ConnectedRegions,SelectedRegions,\
'area','and',200000,300000)
因为用G图像分解
优品在灰度直方图里面没有的
而次品就很明显全红,这也是两种区别最大的地方
次品选中区域的面积为
然后大部分面积都处于200000-300000之间。所以我们特征筛选范围为200000,300000。
将每一个选出来的区域放在SelectedRegions变量里面,然后统计数量
count_obj(SelectedRegions,Number)
因为只要面积范围选的对,那么Number就为1
所以只要Number为1就说明为次品,打印NG;否则打印OK
if(Number==1)
*清空窗口
dev_clear_window()
*展示原图
dev_display(Image)
set_display_font(3600,28, '楷体', 'true', 'false')
disp_message(3600,'NG',\
'image',10,10,'red','false')
endif
if(Number!=1)
*清空窗口
dev_clear_window()
*展示原图
dev_display(Image)
set_display_font(3600,28, '楷体', 'true', 'false')
disp_message(3600,'OK',\
'image',10,10,'green','false')
endif
完整代码
list_files ('./img/物块', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index])
decompose3(Image,R,G,B)
*第一次阈值分割(分骰子的主体部分)
threshold (G, Regions, 0, 20)
*连通域打散
connection(Regions,ConnectedRegions)
*特征筛选
select_shape(ConnectedRegions,SelectedRegions,\
'area','and',200000,300000)
count_obj(SelectedRegions,Number)
if(Number==1)
*清空窗口
dev_clear_window()
*展示原图
dev_display(Image)
set_display_font(3600,28, '楷体', 'true', 'false')
disp_message(3600,'NG',\
'image',10,10,'red','false')
endif
if(Number!=1)
*清空窗口
dev_clear_window()
*展示原图
dev_display(Image)
set_display_font(3600,28, '楷体', 'true', 'false')
disp_message(3600,'OK',\
'image',10,10,'green','false')
endif
stop()
endfor
最终成功案例