在图像中自动识别和分类不同颜色
创作时间:
作者:
@小白创作中心
在图像中自动识别和分类不同颜色
引用
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 := [...]: 定义一个消息数组,用于显示最终的识别结果。
这段代码主要解决了在图像中自动识别和分类不同颜色的游戏棋子的问题。它首先让用户在彩色图像中选择不同颜色的区域,然后训练一个分类器来识别这些颜色。接着,它使用这个分类器来检查图像中是否包含每种颜色的四个游戏棋子。这个过程在彩色图像和灰度图像中都进行了测试,以评估灰度图像是否适合这种类型的分类任务。最终,代码显示了一个消息,说明在灰度图像中进行分类的局限性。
热门推荐
国际仲裁的范围及其法律探讨
助听器选购指南:如何为老年人挑选合适的助听器?
助听器种类全解析:如何选择适合您的听力辅助设备
欧盟旅行携带烟酒指南:各国规定一文全览
无线话筒的防啸叫功能:提升音质与用户体验的关键技术
揭秘音频处理救星:反馈抑制器的使用秘籍
肠癌转移全身扩散的治疗方案
小孩子能不能吃鱼籽?小孩子吃鱼籽适宜的年龄
鱼籽什么季节有?春季秋季是旺季,其他季节也有供应
什么是杜比视界 IQ?它的工作原理是怎样的?
硬卧和软卧区别在哪里?
Steam特别好评的《七龙珠 电光炸裂!ZERO》值得买吗?
《七龙珠 电光炸裂!ZERO》评测:7 分
体检发现肝囊肿、肾囊肿严重吗?医生:这3个地方有囊肿要警惕
何尊登上历史教科书封面 新学期教材上“新”有哪些变化?
Excel计算BMI的完整教程:从公式到数据分析
物业费收费不合理如何投诉?投诉渠道和要求详解
防爆配电箱安装与接线全攻略,简单实用
CAD软件中三维剖切功能的使用指南
缓刑人员的心理辅导:合法性与必要性的探讨
传统丧葬礼俗之祭扫:祭扫的由来和各种祭扫
复旦大学附属肿瘤医院厦门医院:沪厦携手,调理异地办医“水土不服”
对董宇辉的深度剖析
Excel中出生日期计算年龄的函数公式
Excel中设置年龄格式的多种方法
好消息!北京这些景区无需再预约
如何挑选长期稳定的高性价比宽带套餐
网站制作中的前端资源懒加载优化:提升首屏加载速度
优化固定污染源废气监测:从采样到数据分析的全面流程精进
厂房废气处理设备的维护要点详解