找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9523|回复: 0
打印 上一主题 下一主题
收起左侧

RGB图像颜色分离的MATLAB实现

[复制链接]
跳转到指定楼层
楼主
ID:252607 发表于 2017-11-23 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1.理论分析
1.1程序设计的初衷
自己的专业方向会可能用到图像处理的知识,作为数字图像处理的初学者,此程序完全是为实现自己兴趣并结合我们所学的MATLAB课程及GUI知识而编写的,可以实现对图中感兴趣物体颜色的提取,从而突出事物。设计的知识背景或许浅,课下希望能向研究Matlab数字图像处理的老师,同学们多多请教,交流。
1.2程序实现的理论分析
若想实现对RGB图像颜色提取,最为关键的也最为核心的是对R/G/B等颜色严格界定的判别规则。而对于非目标颜色则会通过掩膜覆盖,从而突出显示所要提取到的颜色。
此程序中提到的判别规则是更具R/G/B中某一颜色分量明显不小于其它分量时,即判别某像素点为某种颜色,并通过设置判别阈值,来控制判别条件的颜色与否。
1.2.RGB图像背景知识介绍
所谓的RGB图像,RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
    RGB图像原理如下图1~图2:
   
图1 RGB图像原理               图2 RGB图像RGB三色矩阵
所以RGB图像的颜色分布区间如图3:
图3  RGB图像的颜色分布图
因此可得到六种颜色的判别规则如下:
利用以上判别准则来作为程序设计的核心,通过设计判断语句,对图像的不同色域进行分离,从而实现颜色分离。
3.程序设计
3.1设计流程图
以下是整体程序的设计流程如图4:
图4 程序实现流程图
通过此流程图,可以把握全局思想来完成图像颜色提取的框架结构,这样可以有益于对整体的把握。
3.2.主要程序段分析
(1)读入图像部分的程序段分析:
%打开图像
[FileName, FilePath]=uigetfile('*.jpg;*.png;*.tif;*.img;*.gif;','请选择图像数据');
if  isequal(FilePath,0)        %如果未选择图像则返回,防止报错
    return;
end
str=[FilePath FileName];     %文件的路径,文件名称
Image=imread(str);
imshow(Image)            %读入图形,显示图形
%%掩膜处理方式预设置
Gray=rgb2gray(Image);      %灰度处理
Blackk=zeros(size(Gray));     %黑色掩膜处理
Whitee=255*ones(size(Gray)); %白色掩膜处理
R=Image(:,:,1);             %分别分出R分量
G=Image(:,:,2);             %分别分出G分量
B=Image(:,:,3);              %分别分出B分量
aa=0;                     %不做任何处理的原图标志位
此段程序实现图片的读入并实现对掩膜方式的的初始化实现,通过对三种掩膜方式设置,后面可以直接选择。
(2)掩膜方式选择及判别条件确定主要程序段分析(以红色提取为例):
function Redbutton_Callback(hObject, eventdata, handles)
global  Image  R  G  B  diff_R   Gray   Blackk Whitee aa
%掩膜方式的选择:从下拉菜单中选择掩膜方式
str1=get(handles.popupmenu1,'String');
val=get(handles.popupmenu1,'Value');
switch  str1{val}
case '灰度掩膜'
current_data=Gray;
case '黑色掩膜'
current_data=Blackk;
case '白色掩膜'
current_data=Whitee;
end
%从GUI编辑界面上获取当前所选颜色的  阈值
diffr=get(handles.edit1,'String');
diff_R =str2num(diffr);
Image_R=Image;
RP_R=Image(:,:,1);
RP_G=Image(:,:,2);
RP_B=Image(:,:,3);
XYR=~((R-G)>diff_R&(R-B)>diff_R);   % 提取红色条件是R分量与G、B分量差值大于设定
Mask=current_data(XYR);  % 掩膜方式
RP_R(XYR)=Mask;
RP_G(XYR)=Mask;
RP_B(XYR)=Mask;                % 使得非红色区域变为选择的颜色
Image_R(:,:,1)=RP_R;
Image_R(:,:,2)=RP_G;
Image_R(:,:,3)=RP_B;
imshow(Image_R)
title(strcat(['R分量阈值为',diffr,'时的图像']));
aa=1;                          %进行红色处理的标志位
其他颜色(绿色,蓝色,黄色,洋红色,青色)提取主要程序段与之类似。
(3)保存图片部分的主要程序段分析:
function pushbutton6_Callback(hObject, eventdata, handles)
global aa rrnum ggnum bbnum yynum mmnum ccnum
switch aa
    case 0                            %%%%%0,代表着所摁下按钮的代号,即原图
        picname='原图.jpg';  
        case 1                        %%%%%1,代表着所摁下按钮的代号,即红色
        rrname=int2str(rrnum);          %%%%此数据代表着当前是第几次保存红色
        rrrname=get(handles.edit1,'string');%%%%此数据代表着当前保存时的阈值
        picname=strcat(['Red',rrname,'-',rrrname,'.jpg']);%%保存的路径及名字
        rrnum=rrnum+1;                    %%%% 每按下按钮一次,次数加1
    case 2                            %%%%%2,代表着所摁下按钮的代号,即绿色
        ggname=int2str(ggnum);
        gggname=get(handles.edit4,'string');
        picname=strcat(['Green',ggname,'-',gggname,'.jpg']);
        ggnum=ggnum+1;                   %%%% 每按下按钮一次,次数加1
    case 3                            %%%%%3,代表着所摁下按钮的代号,即蓝色
        bbname=int2str(bbnum);
        bbbname=get(handles.edit5,'string');
        picname=strcat(['Blue',bbname,'-',bbbname,'.jpg']);
        bbnum=bbnum+1;                   %%%% 每按下按钮一次,次数加1
    case 4                            %%%%%4,代表着所摁下按钮的代号,即洋色
        yyname=int2str(yynum);
        yyyname=get(handles.edit7,'string');
        picname=strcat(['Yellow',yyname,'-',yyyname,'.jpg']);
        yynum=yynum+1;                     %%%% 每按下按钮一次,次数加1
    case 5                             %%%%5,代表着所摁下按钮的代号,即黄色
        mmname=int2str(mmnum);
        mmmname=get(handles.edit8,'string');
        picname=strcat(['Mag',mmname,'-',mmmname,'.jpg']);
        mmnum=mmnum+1;                %%%% 每按下按钮一次,次数加1
    case 6                            %%%%%6,代表着所摁下按钮的代号,即青色
        ccname=int2str(ccnum);
        cccname=get(handles.edit10,'string');
        picname=strcat(['Cyan',ccname,'-',cccname,'.jpg']);
        ccnum=ccnum+1;                    %%%% 每按下按钮一次,次数加1
end
pix=getframe(handles.axes1);             %%%%获取当前的坐标轴图像
%%%%%%生成图片到设定路径
imwrite(pix.cdata,strcat(['C:\Users\Administrator\Desktop\',picname]));
%%%%%%保存成功时通知框提示
msgbox(strcat(['已成功保存当前图片为',picname,'到默认路径']))
通过此程序,可以实现对选取提取颜色的图像进行保存处理,并将适应度,颜色序号等信息以文件名等保存。
4. GUI界面设计及程序仿真效果演示
4.1.GUI简介及使用优点
图形用户接口(Graphical  User Interface,简称GUI),其是有窗口,菜单和对话框等各种图形元素组成的用户界面。在这种用户界面中,可以使操作形象生动,方便灵活。
对于图形颜色分离,由于对不同的图片,其对颜色的阈值要求不同,即对非指定颜色掩膜要求不同,有时不可能一次调整参数就能达到满意结果,而是需要对其选择不同的参数,因此可以做出GUI界面,对修改参数方面,且具有实时预览功能,使交互性更方便,极大满足用户体验。
如下图即为GUI界面的功能区按键如下图5:
图5 GUI界面功能
4.2. 程序仿真效果演示
图片提取效果仿真过程效果如下图所示演示,图6:
图6 GUI界面读入要处理的图片
如下图为掩膜方式分别选择为:灰度掩膜,黑色掩膜,白色掩膜等三种方式来实现六种颜色的处理,其中红色,绿色使用灰度掩膜方式,蓝色,洋红色使用黑色掩膜,黄色,青色采用白色掩膜,其效果图如图7~图12:
      
图7 使用灰度掩膜的红色提取           图8 使用灰度掩膜的红色提取
      
图9 使用黑色掩膜的蓝色提取         图10 使用黑色掩膜的品红色提取
     
图10 使用白色掩膜的青色提取       图11 使用白色掩膜的青色提取
五.课程总结
缺点:只能暂时对六种基本颜色分离出来,相对来说仍是比较单一,对于过渡地带颜色无法准确利用判别规则提取。
展望:作为图像处理初学者,自己所研究的方向可能会用到这方面知识,所涉及的知识背景尚浅,希望对同学们起到抛砖引玉的作用,一起探讨,共同努力!
RGB
图像颜色分离的
MATLAB
实现
1.理论分析
1.1程序设计的初衷
自己的专业方向会可能用到图像处理的知识,作为数字图像处理的初学者,此程序完全是为实现自己兴趣并结合我们所学的MATLAB课程及GUI知识而编写的,可以实现对图中感兴趣物体颜色的提取,从而突出事物。设计的知识背景或许浅,课下希望能向研究Matlab数字图像处理的老师,同学们多多请教,交流。
1.2程序实现的理论分析
若想实现对RGB图像颜色提取,最为关键的也最为核心的是对R/G/B等颜色严格界定的判别规则。而对于非目标颜色则会通过掩膜覆盖,从而突出显示所要提取到的颜色。
此程序中提到的判别规则是更具R/G/B中某一颜色分量明显不小于其它分量时,即判别某像素点为某种颜色,并通过设置判别阈值,来控制判别条件的颜色与否。
1.2.RGB图像背景知识介绍
所谓的RGB图像,RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
    RGB图像原理如下图1~图2:
   
图1 RGB图像原理               图2 RGB图像RGB三色矩阵
所以RGB图像的颜色分布区间如图3:
图3  RGB图像的颜色分布图
因此可得到六种颜色的判别规则如下:
利用以上判别准则来作为程序设计的核心,通过设计判断语句,对图像的不同色域进行分离,从而实现颜色分离。
3.程序设计
3.1设计流程图
以下是整体程序的设计流程如图4:
图4 程序实现流程图
通过此流程图,可以把握全局思想来完成图像颜色提取的框架结构,这样可以有益于对整体的把握。
3.2.主要程序段分析
(1)读入图像部分的程序段分析:
%打开图像
[FileName, FilePath]=uigetfile('*.jpg;*.png;*.tif;*.img;*.gif;','请选择图像数据');
if  isequal(FilePath,0)        %如果未选择图像则返回,防止报错
    return;
end
str=[FilePath FileName];     %文件的路径,文件名称
Image=imread(str);
imshow(Image)            %读入图形,显示图形
%%掩膜处理方式预设置
Gray=rgb2gray(Image);      %灰度处理
Blackk=zeros(size(Gray));     %黑色掩膜处理
Whitee=255*ones(size(Gray)); %白色掩膜处理
R=Image(:,:,1);             %分别分出R分量
G=Image(:,:,2);             %分别分出G分量
B=Image(:,:,3);              %分别分出B分量
aa=0;                     %不做任何处理的原图标志位
此段程序实现图片的读入并实现对掩膜方式的的初始化实现,通过对三种掩膜方式设置,后面可以直接选择。
(2)掩膜方式选择及判别条件确定主要程序段分析(以红色提取为例):
function Redbutton_Callback(hObject, eventdata, handles)
global  Image  R  G  B  diff_R   Gray   Blackk Whitee aa
%掩膜方式的选择:从下拉菜单中选择掩膜方式
str1=get(handles.popupmenu1,'String');
val=get(handles.popupmenu1,'Value');
switch  str1{val}
case '灰度掩膜'
current_data=Gray;
case '黑色掩膜'
current_data=Blackk;
case '白色掩膜'
current_data=Whitee;
end
%从GUI编辑界面上获取当前所选颜色的  阈值
diffr=get(handles.edit1,'String');
diff_R =str2num(diffr);
Image_R=Image;
RP_R=Image(:,:,1);
RP_G=Image(:,:,2);
RP_B=Image(:,:,3);
XYR=~((R-G)>diff_R&(R-B)>diff_R);   % 提取红色条件是R分量与G、B分量差值大于设定
Mask=current_data(XYR);  % 掩膜方式
RP_R(XYR)=Mask;
RP_G(XYR)=Mask;
RP_B(XYR)=Mask;                % 使得非红色区域变为选择的颜色
Image_R(:,:,1)=RP_R;
Image_R(:,:,2)=RP_G;
Image_R(:,:,3)=RP_B;
imshow(Image_R)
title(strcat(['R分量阈值为',diffr,'时的图像']));
aa=1;                          %进行红色处理的标志位
其他颜色(绿色,蓝色,黄色,洋红色,青色)提取主要程序段与之类似。
(3)保存图片部分的主要程序段分析:
function pushbutton6_Callback(hObject, eventdata, handles)
global aa rrnum ggnum bbnum yynum mmnum ccnum
switch aa
    case 0                            %%%%%0,代表着所摁下按钮的代号,即原图
        picname='原图.jpg';  
        case 1                        %%%%%1,代表着所摁下按钮的代号,即红色
        rrname=int2str(rrnum);          %%%%此数据代表着当前是第几次保存红色
        rrrname=get(handles.edit1,'string');%%%%此数据代表着当前保存时的阈值
        picname=strcat(['Red',rrname,'-',rrrname,'.jpg']);%%保存的路径及名字
        rrnum=rrnum+1;                    %%%% 每按下按钮一次,次数加1
    case 2                            %%%%%2,代表着所摁下按钮的代号,即绿色
        ggname=int2str(ggnum);
        gggname=get(handles.edit4,'string');
        picname=strcat(['Green',ggname,'-',gggname,'.jpg']);
        ggnum=ggnum+1;                   %%%% 每按下按钮一次,次数加1
    case 3                            %%%%%3,代表着所摁下按钮的代号,即蓝色
        bbname=int2str(bbnum);
        bbbname=get(handles.edit5,'string');
        picname=strcat(['Blue',bbname,'-',bbbname,'.jpg']);
        bbnum=bbnum+1;                   %%%% 每按下按钮一次,次数加1
    case 4                            %%%%%4,代表着所摁下按钮的代号,即洋色
        yyname=int2str(yynum);
        yyyname=get(handles.edit7,'string');
        picname=strcat(['Yellow',yyname,'-',yyyname,'.jpg']);
        yynum=yynum+1;                     %%%% 每按下按钮一次,次数加1
    case 5                             %%%%5,代表着所摁下按钮的代号,即黄色
        mmname=int2str(mmnum);
        mmmname=get(handles.edit8,'string');
        picname=strcat(['Mag',mmname,'-',mmmname,'.jpg']);
        mmnum=mmnum+1;                %%%% 每按下按钮一次,次数加1
    case 6                            %%%%%6,代表着所摁下按钮的代号,即青色
        ccname=int2str(ccnum);
        cccname=get(handles.edit10,'string');
        picname=strcat(['Cyan',ccname,'-',cccname,'.jpg']);
        ccnum=ccnum+1;                    %%%% 每按下按钮一次,次数加1
end
pix=getframe(handles.axes1);             %%%%获取当前的坐标轴图像
%%%%%%生成图片到设定路径
imwrite(pix.cdata,strcat(['C:\Users\Administrator\Desktop\',picname]));
%%%%%%保存成功时通知框提示
msgbox(strcat(['已成功保存当前图片为',picname,'到默认路径']))
通过此程序,可以实现对选取提取颜色的图像进行保存处理,并将适应度,颜色序号等信息以文件名等保存。
4. GUI界面设计及程序仿真效果演示
4.1.GUI简介及使用优点
图形用户接口(Graphical  User Interface,简称GUI),其是有窗口,菜单和对话框等各种图形元素组成的用户界面。在这种用户界面中,可以使操作形象生动,方便灵活。
对于图形颜色分离,由于对不同的图片,其对颜色的阈值要求不同,即对非指定颜色掩膜要求不同,有时不可能一次调整参数就能达到满意结果,而是需要对其选择不同的参数,因此可以做出GUI界面,对修改参数方面,且具有实时预览功能,使交互性更方便,极大满足用户体验。
如下图即为GUI界面的功能区按键如下图5:
图5 GUI界面功能
4.2. 程序仿真效果演示
图片提取效果仿真过程效果如下图所示演示,图6:
图6 GUI界面读入要处理的图片
如下图为掩膜方式分别选择为:灰度掩膜,黑色掩膜,白色掩膜等三种方式来实现六种颜色的处理,其中红色,绿色使用灰度掩膜方式,蓝色,洋红色使用黑色掩膜,黄色,青色采用白色掩膜,其效果图如图7~图12:
      
图7 使用灰度掩膜的红色提取           图8 使用灰度掩膜的红色提取
      
图9 使用黑色掩膜的蓝色提取         图10 使用黑色掩膜的品红色提取
     
图10 使用白色掩膜的青色提取       图11 使用白色掩膜的青色提取
五.课程总结
缺点:只能暂时对六种基本颜色分离出来,相对来说仍是比较单一,对于过渡地带颜色无法准确利用判别规则提取。
展望:作为图像处理初学者,自己所研究的方向可能会用到这方面知识,所涉及的知识背景尚浅,希望对同学们起到抛砖引玉的作用,一起探讨,共同努力!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表