matlab 图片RGB颜色提取

新版本链接:matlab图片RGB颜色提取第二版
https://blog.csdn.net/slandarer/article/details/103832973


写了一个程序能实现导入图片识别颜色
matlab 图片RGB颜色提取_第1张图片
支持屏幕截图和从电脑倒入图片
matlab 图片RGB颜色提取_第2张图片
鼠标移动到想要取色的地方点击可以获取颜色
matlab 图片RGB颜色提取_第3张图片
可以将颜色暂时保存在右边
matlab 图片RGB颜色提取_第4张图片
目前导出颜色数据是从命令行窗口输出
matlab 图片RGB颜色提取_第5张图片

完整代码

function getcolor
clc;clear;              %清空工作区数据
%设置全局变量==============================================================
global selected;        %是否选中颜色,值为1时选中颜色,方形颜色展示框内颜色不随鼠标移动而变化
                        %              值为0时选未中颜色,方形颜色展示框内颜色随鼠标移动而改变
                        
global ima;             %图片展示区要展示的图片
global GUI;             %绘制GUI的类
global x_limit;         %展示区图片x坐标范围
global y_limit;         %展示区图片y坐标范围
global color;           %当前鼠标选中的颜色
global IMA;             %ima图像的绘制函数

global color_list;      %存储的颜色(列表形式)
global color_number;    %下一次存储颜色会存储到颜色列表的第几行
color_number=1;         %第一次存储颜色会存储到颜色列表第一行
color_list=[];

%GUI绘制===================================================================
GUI.fig=figure('units','pixels',...    %绘制背景
    'position',[350 100 800 500],...
    'Numbertitle','off',...
    'menubar','none',...
    'resize','off',...
    'name','getcolor',...
    'color',[0.95 0.95 0.95]);
%图像及颜色展示部分的文本和画框--------------------------------------------
GUI.axes=axes('Units','pixels',...         %绘制图片展示框
      'PlotBoxAspectRatio',[1 1 1],...
      'Position',[50 30 400 400],...
      'Color',[0.98 0.98 0.98],...
      'Box','on', ...
      'XLim',[0 500],...
      'YLim',[0 500], ...
      'XColor','w','YColor','w',...
      'YDir','reverse', ...
      'Tag','imageaxes',...
      'xtick',[],'ytick',[]);
  
GUI.title=uicontrol('parent',GUI.fig,...  %绘制小标题
    'style','text',...
    'string','色彩识别',...
    'horizontalalign','center',...
    'position',[50 440 400 30],...
    'backgroundcolor',[0.85 0.89 0.85],...
    'foregroundcolor','k',...
    'fontsize',15);

GUI.colordisplaybox=...                  %绘制方形颜色展示框
    uicontrol('parent',GUI.fig,...
    'style','text',...
    'string','',...
    'horizontalalign','left',...
    'position',[460 330 100 100],...
    'backgroundcolor',[1 1 1],...
    'foregroundcolor','k',...
    'fontsize',10);

GUI.rgbdisplaybox=...                    %绘制rgb数据展示框
    uicontrol('parent',GUI.fig,...
    'style','text',...
    'string','',...
    'horizontalalign','center',...
    'position',[350 440 210 30],...
    'backgroundcolor',[1 1 1],...
    'foregroundcolor','k',...
    'fontsize',10);
%功能性按钮生成------------------------------------------------------------
%该部分每个按钮的基础设置几乎相同,最大的区别就是不同的按钮有不同的回调函数
GUI.savecolorbutton=...                    %颜色储存按钮
    uicontrol('parent',GUI.fig,...
    'style','pushbutton',...
    'string','储存颜色',...
    'position',[460 290 100 30],...
    'backgroundcolor',[0.85 0.89 0.85],...
    'foregroundcolor','k',...
    'fontsize',15,...
    'callback',@save_color);               

GUI.deletedatabutton=...                   %清空数据按钮
    uicontrol('parent',GUI.fig,...
    'style','pushbutton',...
    'string','清空数据',...
    'position',[460 230 100 30],...
    'backgroundcolor',[0.8 0.9 0.9],...
    'foregroundcolor','k',...
    'fontsize',15,...
    'callback',@clear_data);

GUI.deletepicbutton=...                   %删除图片按钮
    uicontrol('parent',GUI.fig,...
    'style','pushbutton',...
    'string','删除图片',...
    'position',[460 180 100 30],...
    'backgroundcolor',[0.8 0.9 0.9],...
    'foregroundcolor','k',...
    'fontsize',15,...
    'callback',@delete_pic);
GUI.getcapbutton=...                      %屏幕截图按钮
    uicontrol('parent',GUI.fig,...
    'style','pushbutton',...
    'string','屏幕截图',...
    'position',[460 130 100 30],...
    'backgroundcolor',[0.8 0.9 0.9],...
    'foregroundcolor','k',...
    'fontsize',15,...
    'callback',@get_capture);

GUI.getpicbutton=...                      %读取图片按钮
    uicontrol('parent',GUI.fig,...
    'style','pushbutton',...
    'string','读取图片',...
    'position',[460 80 100 30],...
    'backgroundcolor',[0.8 0.9 0.9],...
    'foregroundcolor','k',...
    'fontsize',15,...
    'callback',@get_image);

GUI.getcolorbutton=...                     %获取颜色按钮
    uicontrol('parent',GUI.fig,...
    'style','pushbutton',...
    'string','获取颜色',...                %该按钮的文本会在'获取颜色''继续取色'之间切换
    ...                                    %主要取决于selected的数值
    'position',[460 30 100 30],...
    'backgroundcolor',[0.8 0.9 0.9],...
    'foregroundcolor','k',...
    'fontsize',15,...
    'callback',@get_color);

GUI.inputbutton=uicontrol('parent',GUI.fig,...
    'style','pushbutton',...
    'string','清除最后一个颜色',...
    'position',[600 80 190 30],...
    'backgroundcolor',[0.85 0.89 0.85],...
    'foregroundcolor','k',...
    'fontsize',15,...
    'callback',@delete_last);
GUI.inputbutton=uicontrol('parent',GUI.fig,...
    'style','pushbutton',...
    'string','导出数据',...
    'position',[600 30 190 30],...
    'backgroundcolor',[0.85 0.89 0.85],...
    'foregroundcolor','k',...
    'fontsize',15,...
    'callback',@output_data);
%颜色储存区生成------------------------------------------------------------
for i=1:9
    GUI.colorstore(i)=...                  %颜色储存区那九个小方框
    uicontrol('parent',GUI.fig,...
    'style','text',...
    'string','',...
    'horizontalalign','left',...
    'position',[600 440-40*(i-1) 30 30],...
    'backgroundcolor',[1 1 1],...
    'foregroundcolor','k',...
    'fontsize',10);    
end

for i=1:9                                  %颜色储存区存储数据的九个长方形框
    GUI.rgbstore(i)=...
    uicontrol('parent',GUI.fig,...
    'style','text',...
    'string','',...
    'horizontalalign','center',...
    'position',[640 440-40*(i-1) 150 30],...
    'backgroundcolor',[1 1 1],...
    'foregroundcolor','k',...
    'fontsize',8);    
end
%回调函数部分==============================================================
    function get_image(~,~) %图像选择函数
        
        warning off;        %当你未选择图片直接关闭图库时,命令窗口会有报错,
                            %但是并不会影响程序运行,不妨使用warning off隐藏报错
        try
        [filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...
            '*.*','All Files' });              %获得选择图片的存储位置
        ima = imread([ pathname,filename]);    %读取该存储位置下的图片
        [x,y,~]=size(ima);                     %获取图片大小
        x_limit=x;y_limit=y;
        leng=max([x_limit,y_limit]);
        set(GUI.axes,...                       %调整图片展示框横纵轴范围
        'XLim',[0 leng],...
        'YLim',[0 leng]);
        delete(IMA);
        IMA=imshow(ima);                       %展示图片
        catch
        end
    end

    function get_capture(~,~) %截图获取函数
        %该部分源于CSDN上某篇屏幕截图文章,不做过多解释
        screensize=get(0,'screensize');
        screensize=1.5*screensize;
        robot=java.awt.Robot();
        rectangle=java.awt.Rectangle();
        rectangle.x=0;
        rectangle.y=0;
        rectangle.width=screensize(3);
        rectangle.height=screensize(4);
        image=robot.createScreenCapture(rectangle);
        data=image.getData(); 
        temp=zeros(screensize(3)*screensize(4)*3,1);
        temp=data.getPixels(0,0,screensize(3),screensize(4),temp);  
        temp=uint8(temp);
        R=temp(1:3:end); 
        G=temp(2:3:end); 
        B=temp(3:3:end);
        R=reshape(R,[screensize(3),screensize(4)]); 
        G=reshape(G,[screensize(3),screensize(4)]); 
        B=reshape(B,[screensize(3),screensize(4)]);
        R=R';
        G=G';
        B=B';
        
        x_limit=screensize(4); 
        y_limit=screensize(3);
        leng=max([x_limit,y_limit]);
        set(GUI.axes,...
        'XLim',[0 leng],...
        'YLim',[0 leng]);
        ima=cat(3,R,G,B);
        delete(IMA);
        IMA=imshow(ima);
    end

    function delete_pic(~,~) %图像删除函数
        %参考下面clear_data函数的注释
        selected=1;          
        set(GUI.axes,...
        'XLim',[0 500],...
        'YLim',[0 500],...
        'Position',[50 30 400 400],...
        'Color',[0.98 0.98 0.98]);
        delete(IMA);
    end

    function clear_data(~,~) %清除数据函数
        selected=1;          %设置当前只有按下'获取颜色'按钮才能开始取色
        set(GUI.colordisplaybox,'backgroundcolor',[1 1 1]); %设置方形颜色展示框颜色为白色
        set(GUI.rgbdisplaybox,'string','');                 %设置rgb数据展示框数据为空
        set(GUI.axes,...
        'XLim',[0 500],...
        'YLim',[0 500],...
        'Position',[50 30 400 400],...
        'Color',[0.98 0.98 0.98]);
        set(GUI.getcolorbutton,'string','获取颜色');        %将getcolorbutton按钮的文本改为'获取颜色'
        delete(IMA);                                        %取消图片展示
    end

    function get_color(~,~) %颜色获取函数
        if selected==1 
            set(GUI.colordisplaybox,'backgroundcolor',[1 1 1]);
            set(GUI.rgbdisplaybox,'string','');       
        end
        selected=0;
        %设置鼠标移动的回调函数和鼠标点击的回调函数
        set(gcf,'WindowButtonMotionFcn',@whilemovefcn)  
        set(gcf,'WindowButtonDownFcn',@whileclickfcn)
    end

    function whilemovefcn(~,~) %鼠标移动的回调函数
        xy=get(gca,'CurrentPoint'); %获取鼠标坐标
        x=xy(1,2);y=xy(1,1);
        if x<=x_limit&&y<=y_limit&&x>=0&&y>=0  
            %鼠标超出方形图像展示框外时,设置鼠标位置为图像的边缘位置
            x(x>x_limit)=x_limit;   
            y(y>y_limit)=y_limit;
            x(x<1)=1;
            y(y<1)=1;
            %由于图像是以矩阵的形式储存的,我们要将鼠标坐标转化为矩阵中的行和列需要进行取整
            x=round(x);
            y=round(y);
            if selected==0
                color=double([ima(x,y,1),ima(x,y,2),ima(x,y,3)]);
                set(GUI.colordisplaybox,'backgroundcolor',color/255);
                set(GUI.rgbdisplaybox,'string',['[',num2str(color(1)/255),'   ',num2str(color(2)/255),'   ',num2str(color(3)/255),']']);
            end
        else
            if selected==0
                set(GUI.colordisplaybox,'backgroundcolor',[1 1 1]);
                set(GUI.rgbdisplaybox,'string','');    
            end
        end
    end

    function whileclickfcn(~,~) %鼠标点击的回调函数         
            xy=get(gca,'CurrentPoint');
            x=xy(1,2);y=xy(1,1);
            if x<=x_limit&&y<=y_limit&&x>=0&&y>=0
                selected=1;
                set(GUI.colordisplaybox,'backgroundcolor',color/255);
                set(GUI.rgbdisplaybox,'string',['[',num2str(color(1)/255),'   ',num2str(color(2)/255),'   ',num2str(color(3)/255),']']);
                set(GUI.getcolorbutton,'string','继续取色');
                %disp(color/255)
            end
    end

    function save_color(~,~) %储存颜色函数
        if (~isempty(get(GUI.rgbdisplaybox,'string')))&&color_number<10  %如果rgb数据展示区不为空并且已储存颜色数量小于10 
            set(GUI.colorstore(color_number),'backgroundcolor',color/255)
            set(GUI.rgbstore(color_number),'string',['[',num2str(color(1)/255),'   ',num2str(color(2)/255),'   ',num2str(color(3)/255),']'])
            color_list(color_number,:)=color;
            color_number=color_number+1;
        end
    end

    function delete_last(~,~) %清除最后一种颜色
        if color_number>1
            set(GUI.colorstore(color_number-1),'backgroundcolor',[1 1 1])
            set(GUI.rgbstore(color_number-1),'string','')
            color_list(end,:)=[];         %将储存的颜色列表最后一行删除
            color_number=color_number-1;  %下一次添加颜色的行前移
        end
    end

    function output_data(~,~) %命令行窗口输出函数
        if color_number>1
            disp(color_list/255)
        end
    end
end

你可能感兴趣的:(matlab)