新版本链接:matlab图片RGB颜色提取第二版
https://blog.csdn.net/slandarer/article/details/103832973
写了一个程序能实现导入图片识别颜色
支持屏幕截图和从电脑倒入图片
鼠标移动到想要取色的地方点击可以获取颜色
可以将颜色暂时保存在右边
目前导出颜色数据是从命令行窗口输出
完整代码
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