今天我们实现将一组图片导入,然后对它们进行颜色检测分类。
比如下面一组图片:
首先我们需要导入这组图片
之后会在编辑器里面生成这样一段代码
之后再继续相应代码编写 ,我的思路是利用颜色空间转换 RGB转到HSV
trans_from_rgb(R, G, B, H, S, V, 'hsv')
先以V图进行灰度值分割,在特征筛选出所有瓶盖。之后再循环遍历出每个瓶盖的像素点行列坐标,将得到的行列坐标元组利用get_grayval算子得到每个像素点灰度值。
将取到的灰度值进行取中值,因为每个颜色不同,中值也就不同。
再利用if语句,根据中值不同,分别得到不同的颜色。
完整代码(附有注释,很详细)
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)
*颜色空间转换 RGB转到HSV
trans_from_rgb(R, G, B, H, S, V, 'hsv')
threshold (V, Regions, 80, 255)
connection(Regions, ConnectedRegions)
select_shape(ConnectedRegions,SelectedRegions,\
'area','and',80000,240000)
count_obj(SelectedRegions,Number)
*定义四个变量,分别统计各种颜色数量
Number1:=0
Number2:=0
Number3:=0
Number4:=0
*清空窗口
dev_clear_window()
*展示原图
dev_display(Image)
for i :=1 to Number by 1
dev_update_off()
select_obj(SelectedRegions, ObjectSelected, i)
get_region_points(ObjectSelected, Rows, Columns)
get_grayval(H, Rows, Columns, Grayval)
gra:=median(Grayval)
area_center(ObjectSelected,Area,Row,Column)
if(gra>0 and gra<20)
Number1:=Number1+1
set_display_font(3600,28, '楷体', 'true', 'false')
disp_message(3600,'红色圆片',\
'image',Row,Column,'green','false')
endif
if(gra>30 and gra<50)
Number2:=Number2+1
set_display_font(3600,28, '楷体', 'true', 'false')
disp_message(3600,'黄色圆片',\
'image',Row,Column,'green','false')
endif
if(gra>80 and gra<110)
Number3:=Number3+1
set_display_font(3600,28, '楷体', 'true', 'false')
disp_message(3600,'绿色圆片',\
'image',Row,Column,'green','false')
endif
if(gra>140 and gra<160)
Number4:=Number4+1
set_display_font(3600,28, '楷体', 'true', 'false')
disp_message(3600,'蓝色圆片',\
'image',Row,Column,'green','false')
endif
*stop()
wait_seconds(1)
endfor
set_display_font(3600,28, '楷体', 'true', 'false')
disp_message(3600,'红色圆片数量:'+Number1,\
'image',10,10,'black','true')
disp_message(3600,'黄色圆片数量:'+Number2,\
'image',110,10,'black','true')
disp_message(3600,'蓝色圆片数量:'+Number3,\
'image',210,10,'black','true')
disp_message(3600,'绿色圆片数量:'+Number4,\
'image',310,10,'black','true')
*stop()
wait_seconds(1)
endfor