问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

在图像中自动识别和分类不同颜色

创作时间:
作者:
@小白创作中心

在图像中自动识别和分类不同颜色

引用
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 := [...]: 定义一个消息数组,用于显示最终的识别结果。

这段代码主要解决了在图像中自动识别和分类不同颜色的游戏棋子的问题。它首先让用户在彩色图像中选择不同颜色的区域,然后训练一个分类器来识别这些颜色。接着,它使用这个分类器来检查图像中是否包含每种颜色的四个游戏棋子。这个过程在彩色图像和灰度图像中都进行了测试,以评估灰度图像是否适合这种类型的分类任务。最终,代码显示了一个消息,说明在灰度图像中进行分类的局限性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号