在图像中自动识别和分类不同颜色
创作时间:
作者:
@小白创作中心
在图像中自动识别和分类不同颜色
引用
CSDN
1.
https://blog.csdn.net/zhangyy57/article/details/140483759
本文介绍了一种使用VLFeat库(一个开源的计算机视觉算法库)编写的MATLAB脚本,用于识别和分类图像中的不同颜色游戏棋子。通过详细讲解代码实现和逐行解释,帮助读者理解如何使用VLFeat库进行颜色识别和分类。
下述代码是一个使用VLFeat库(一个开源的计算机视觉算法库)编写的MATLAB脚本,它主要用于图像处理和模式识别任务。代码的目的是识别和分类图像中的不同颜色的游戏棋子。
dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 557, 416, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_color ('black')
dev_set_draw ('margin')
% Initialization
ImageRootName := 'color/color_pieces_0'
Regions := ['yellow','pink','blue','background']
Highlight := ['goldenrod','magenta','cyan']
gen_empty_obj (Classes)
for Mode := 0 to 1 by 1
read_image (Image, ImageRootName + '0')
% Simulate gray image
if (Mode == 1)
rgb1_to_gray (Image, GrayImage)
compose3 (GrayImage, GrayImage, GrayImage, Image)
dev_display (Image)
disp_message (WindowHandle, 'Train and apply the classes again on gray images', 'window', 12, 12, 'black', 'false')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endif
% Colored images
if (Mode == 0)
% Specify color classes
for I := 1 to 4 by 1
dev_display (Image)
dev_display (Classes)
disp_message (WindowHandle, ['Drag rectangle inside ' + Regions[I - 1] + ' color','Click right mouse button to confirm'], 'window', 24, 12, 'black', 'false')
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
concat_obj (Classes, Rectangle, Classes)
endfor
endif
% Train the specified color classes
disp_message (WindowHandle, 'Training...', 'window', 100, 12, 'black', 'false')
Radius := []
Center := []
Quality := []
select_obj (Classes, Background, 4)
gen_empty_region (Background)
Circles := []
% Generate the classification clusters for each color
for Class := 1 to 3 by 1
select_obj (Classes, TrainClass, Class)
learn_ndim_norm (TrainClass, Background, Image, 'euclid', 40, 0, Rad, Cen, Qua)
Circles := [Circles,|Rad|]
Radius := [Radius,Rad]
Center := [Center,Cen]
endfor
RadiusDup := Radius
CenterDup := Center
% Use the Euclidian classifier to test if each image
% contains four game pieces of each color
for J := 0 to 3 by 1
Radius := RadiusDup
Center := CenterDup
read_image (Image, ImageRootName + J)
if (Mode == 1)
rgb1_to_gray (Image, GrayImage)
compose3 (GrayImage, GrayImage, GrayImage, Image)
endif
dev_display (Image)
disp_message (WindowHandle, 'Looking for 4 game pieces of each color...', 'window', 24, 12, 'black', 'false')
% Apply the trained classes to subsequent images
for Class := 1 to 3 by 1
dev_set_color (Highlight[Class - 1])
class_ndim_norm (Image, ClassRegions, 'euclid', 'multiple', Radius[0:Circles[Class - 1] - 1] + 30, Center[0:Circles[Class - 1] * 3 - 1])
connection (ClassRegions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 400, 99999)
count_obj (SelectedRegions, Number)
if (Class < 3)
Radius := Radius[Circles[Class - 1]:|Radius| - 1]
Center := Center[Circles[Class - 1] * 3:|Center| - 1]
endif
dev_display (SelectedRegions)
dev_set_color ('black')
OutString := Regions[Class - 1] + ': ' + Number + ' '
dev_set_color ('green')
disp_message (WindowHandle, Regions[Class - 1] + ': ' + Number, 'window', 24 + 30 * Class, 12, 'black', 'false')
if (Number != 4)
disp_message (WindowHandle, 'NotOK', 'window', 24 + 30 * Class, 120, 'red', 'false')
else
disp_message (WindowHandle, 'OK', 'window', 24 + 30 * Class, 120, 'green', 'false')
endif
endfor
dev_set_line_width (2)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endfor
endfor
dev_clear_window ()
dev_display (Image)
Message := 'The game pieces cannot be classified reliable on'
Message[1] := 'gray images because the gray values of the'
Message[2] := 'game pieces cannot always be distinguished from'
Message[3] := 'the gray values of the background.'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
运行结果如下:
以下是代码的逐行解释和它解决的问题:
dev_update_off(): 关闭设备更新,这通常用于在处理图像时避免不必要的屏幕刷新,提高性能。dev_close_window(): 关闭当前打开的图形窗口。dev_open_window(0, 0, 557, 416, 'black', WindowHandle): 打开一个新的图形窗口,窗口大小为557x416像素,背景颜色为黑色,并返回窗口句柄。set_display_font(WindowHandle, 14, 'mono', 'true', 'false'): 设置窗口中显示文本的字体和大小。dev_set_color('black'): 设置绘图颜色为黑色。dev_set_draw('margin'): 设置绘图模式为边缘绘制。ImageRootName := 'color/color_pieces_': 定义图像文件的根名称。Regions := ['yellow','pink','blue','background']: 定义图像中需要识别的颜色区域。Highlight := ['goldenrod','magenta','cyan']: 定义用于突出显示的高亮颜色。gen_empty_obj(Classes): 创建一个空的对象列表,用于存储后续识别的区域。for Mode := 0 to 1 by 1: 循环两次,一次处理彩色图像,一次处理灰度图像。read_image(Image, ImageRootName + '0'): 读取图像文件。rgb1_to_gray(Image, GrayImage): 如果模式为1(灰度图像),则将彩色图像转换为灰度图像。compose3(GrayImage, GrayImage, GrayImage, Image): 将灰度图像的三个颜色通道合并,以便在彩色图像中显示。dev_display(Image): 显示当前图像。- `disp_message(...): 在窗口中显示消息,指导用户操作。
- `draw_rectangle1(...): 允许用户在图像上绘制矩形,用于选择特定颜色的区域。
- `gen_rectangle1(Rectangle, ...): 生成矩形对象。
concat_obj(Classes, Rectangle, Classes): 将新生成的矩形添加到对象列表中。select_obj(Classes, Background, 4): 从对象列表中选择背景区域。gen_empty_region(Background): 清除背景区域。Circles := []: 初始化一个空的圆列表,用于存储每个颜色的圆心。for Class := 1 to 3 by 1: 循环处理三种颜色。- `learn_ndim_norm(...): 使用非线性维度归一化方法训练颜色分类器。
- `class_ndim_norm(...): 应用训练好的分类器到图像中,识别特定颜色的区域。
- `connection(...): 连接识别的区域,形成更大的区域。
- `select_shape(...): 根据面积选择特定大小的区域。
- `count_obj(...): 计算选定区域中的对象数量。
dev_display(SelectedRegions): 显示选定的区域。- `disp_message(...): 显示识别结果和状态信息。
dev_set_line_width(2): 设置线条宽度。- `disp_continue_message(...): 显示继续消息。
stop(): 暂停执行,等待用户操作。dev_clear_window(): 清除窗口内容。- `Message := [...]: 定义一个消息数组,用于显示最终的识别结果。
这段代码主要解决了在图像中自动识别和分类不同颜色的游戏棋子的问题。它首先让用户在彩色图像中选择不同颜色的区域,然后训练一个分类器来识别这些颜色。接着,它使用这个分类器来检查图像中是否包含每种颜色的四个游戏棋子。这个过程在彩色图像和灰度图像中都进行了测试,以评估灰度图像是否适合这种类型的分类任务。最终,代码显示了一个消息,说明在灰度图像中进行分类的局限性。
热门推荐
律协如何保障举报人信息的保密性
野生茯苓生长环境要求详解
检测支原体是咽拭子还是血液更准确
斯宾诺莎主义:理性与泛神论的哲学探索
干皮护肤全攻略:从环境到生活习惯的全方位护理指南
如何给文件夹设置密码?文件夹添加密码的4个方法,简单易操作
零碎情感文案:轻描淡写中的伤感与共鸣
五金工具与衣架收纳全攻略:15种实用方案让空间瞬间整洁!
“汉初三杰”分别指的是谁?看完涨知识了!建议收藏
蟾蜍的药用价值与功效
芬兰奥卢大学:北欧顶尖学府的辉煌历程
民族常识我来说——探索我国各民族的特色与传承
以书为媒 搭建中阿文明交流互鉴之桥
派出所的主要职位是什么?
国潮涌动梅溪湖,烟火文化醉人心
「码时代」已来 公立医院这样优化门诊和住院流程最有效!
Tris-HCl缓冲溶液的配制与缓冲范围
Tris-HCl缓冲溶液的配制与缓冲范围
乳胶床垫选购指南,打造健康舒适的睡眠环境
固态电池新进展:量产提速 硫化物路线受推崇
如何改善肌肉低代谢的情况
有氧运动如何提高代谢率
新三板挂牌敲钟的意义是什么?挂牌敲钟对企业的发展有何推动作用?
宁波到厦门三天旅游行程景点全攻略
五种适合人工养殖的蚯蚓,药材、饲料各不同
上海人均可支配收入创新高,全国第一!打工人工资收入情况如何?
钦州3项入选第三批广西文化旅游打卡点,赶~快~来~打~卡!
圆周角知识点
ESG企业调研行| 一滴水能发6次电,全球水电龙头长江电力逐“绿”发展
陆游《宝剑吟》:取酒起酹剑,至宝当潜形