在图像中自动识别和分类不同颜色
创作时间:
作者:
@小白创作中心
在图像中自动识别和分类不同颜色
引用
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 := [...]: 定义一个消息数组,用于显示最终的识别结果。
这段代码主要解决了在图像中自动识别和分类不同颜色的游戏棋子的问题。它首先让用户在彩色图像中选择不同颜色的区域,然后训练一个分类器来识别这些颜色。接着,它使用这个分类器来检查图像中是否包含每种颜色的四个游戏棋子。这个过程在彩色图像和灰度图像中都进行了测试,以评估灰度图像是否适合这种类型的分类任务。最终,代码显示了一个消息,说明在灰度图像中进行分类的局限性。
热门推荐
如何深入了解期货市场的价格变化趋势?这种趋势对投资操作有何影响?
自贡五年答卷:“4567模式”如何织就一座城的心理健康底色
电线电缆质量追溯:数字化技术如何保障电缆安全?
《自然》揭晓2025年七大技术突破,生命科学领域独占四席
恶性肿瘤就是癌症的意思吗?
云南工程项目进展迅速,交通网络日益完善
新建筑墙柱钢筋连接技术要求详解
狗咬人民事纠纷:法律应对与责任分析
客户关系:打造卓越的企业竞争优势
普通轿车应该配多大容量的灭火器
克服拖延症的十种方法
无因管理和不当得利的区别
不当得利的法律概念与基本特征
补钙晒太阳,怎么晒才最有效安全?
如何降低企业融资成本?这种成本降低措施如何落实?
笋是凉性的还是热性的
春季吃“三尖”,养肝降火
如何在微星主板上设置双硬盘,确保固态硬盘优先启动
如何为电脑装双硬盘并为两块硬盘分别装不同的系统
预防脑梗死,守护大脑健康!
逃税漏税的证据如何收集
队长:团队领导者的全面解析
如何选团队队长
SQL获取数据库记录总数量的方法与性能优化
数据库分页字段如何设计
右胸口刺痛像针扎一样,可能与这些原因有关
清明节祭祖东西清单,清明节祭祖要准备什么东西
列车运维“智”变 出行体验“质”变
强制结束电脑任务按哪些键?一文读懂全面指南
社会达尔文主义的影响与现代社会的关系解析