RGB图像中特定颜色的提取

一、理论基础

       在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2...直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。如同2000年到2010年共是11年一样。

按照计算,256级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。通常也被简称为1600万色或千万色。也称为24位色(2的24次方)。

在led领域利用三合一点阵全彩技术,即在一个发光单元里由RGB三色晶片组成全彩像素。随着这一技术的不断成熟,led显示技术会给人们带来更加丰富真实的色彩感受。


二、MATLAB的实现提取R\G\B分量

     在MATLAB中一幅RGB图像可表示为一个M*N*3的三维矩阵。其中每一个彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝3个分量。分量图像的数据类型决定了他们的取值范围。若一幅RGB图像的数据类型是uint8,则每个分量图像的取值范围是[0,255]。

分量的提取:

PR=RGB_image(:,:,1);提取红色分量

PG=RGB_image(:,:,2);提取绿色分量

PB=RGB_image(:,:,3);提取蓝色分量


三、颜色直方图

   直方图中的数值都是统计而来,描述了该图像中关于颜色的数量特征,可以反映图像颜色的统计分布和基本色调;直方图只包含了该图像中某一颜色值出现的频数,而丢失了某象素所在的空间位置信息;任一幅图像都能唯  一的给出一幅与它对应的直方图,但不同的图像可能有相同的颜色分布,从而就具有相同的直方图,因此直方图与图像是一对多的关系;如将图像划分为若干个子区域,所有子区域的直方图之和等于全图直方图;一般情况下,由于图像上的背景和前景物体颜色分布明显不同,从而在直方图上会出现双峰特性,但背景和前景颜色较为接近的图像不具有这个特性。

四、阈值分割     

       阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。

       图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。

       基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。

       常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。

五、参数设置

   RGB三个颜色分量取值[0,255],通过设置各分量的阈值,来提取感兴趣的颜色分量。所以问题的关键就是设置合适得阈值。

六、MATLAB实现  


1、读取图像,并令其转为uint8数据类型,计算图像像素。

 a=imread('G:\u=3339291454,635252588&fm=90&gp=0.jpg');

 a=uint8(a);

 b=a;

 [m,n,d]=size(a);    %计算图像像素

 figure(1);

 imshow(a);

2、读取原图像的各颜色分量直方图,选出适当阈值进行分割。

 %读取RGB各分量的直方图

 figure(2);

 subplot(1,3,1);imhist(a(:,:,1));title('红色分量');

 subplot(1,3,2);imhist(a(:,:,2));title('绿色分量');

 subplot(1,3,3);imhist(a(:,:,3));title('蓝色分量');

3、设置红色分量的阈值。

 通过设置RGB不同的阈值,来提取出需要的颜色信息 

 %提取红色分量

 for i=1:m

     for j=1:n

            if a(i,j,1)>255 ? %设置红色分量的提取阈值

               b(i,j,1)=a(i,j,1);

            else b(i,j,1)=0;                  

            end

        end

 end

 figure(3);

 subplot(1,3,1);

 imhist(b(:,:,1));title('提取后红色分量');


4、同理可以提取绿色、蓝色



5、留下感兴趣的颜色、删去其他颜色

%提取红分量,不满足阈值的变为白色

for i=1:m

    for j=1:n

        if((a(i,j,1)-a(i,j,2)>level)&&(a(i,j,1)-a(i,j,3)>level))

           b(i,j,1)=a(i,j,1);

           b(i,j,2)=a(i,j,2);

           b(i,j,3)=a(i,j,3);

        else b(i,j,1)=255;

            b(i,j,2)=255;

            b(i,j,3)=255;

        end

    end

end

subplot(2,2,2);imshow(b);title('提取红分量后');%显示提取红分量后的图像            

程序

1、提取RGB颜色

 clc,clear;

%原图像

a=imread('G:\u=3339291454,635252588&fm=90&gp=0.jpg');

a=uint8(a);

b=a;

[m,n,d]=size(a);

figure(1);

imshow(a);

%读取RGB各分量的直方图

figure(2);

subplot(131);imhist(a(:,:,1));title('红色分量');

subplot(132);imhist(a(:,:,2));title('绿色分量');

subplot(133);imhist(a(:,:,3));title('蓝色分量');

%提取各色分量

%提取红色分量

for i=1:m

    for j=1:n

        ifa(i,j,1)>255   %设置红色分量的提取阈值

           b(i,j,1)=a(i,j,1);

        elseb(i,j,1)=0;                  

        end

    end

end

figure(3);

subplot(1,3,1);imhist(b(:,:,1));title('提取后红色分量');

%提取绿色分量

for i=1:m

    for j=1:n

        ifa(i,j,2)>255     %设置绿色分量的提取阈值

          b(i,j,2)=a(i,j,2);

        else b(i,j,2)=0;                  

        end

    end

end

subplot(1,3,2);imhist(b(:,:,2));title('提取后绿色分量');

%提取蓝色分量

for i=1:m

    for j=1:n

        ifa(i,j,3)>0   %设置蓝色分量的提取阈值

          b(i,j,3)=a(i,j,3);

        elseb(i,j,3)=0;                  

        end

    end

end

subplot(1,3,3);imhist(b(:,:,3));title('提取后蓝色分量');

2、提取RGB颜色,并使不满足的颜色删除

%各色分量提取后的图片

figure(4);

imshow(b);

clc,clear;

a=imread('5.jpg');%读取彩图

[m,n,d]=size(a);

b=uint8(a);%转为uint8数据类型,计算图像像素

level=15;%设置阈值

figure(1);

subplot(2,2,1);imshow(a);title('原图');%显示原图

%提取红分量,不满足阈值的变为白色

for i=1:m

    for j=1:n

        if((a(i,j,1)-a(i,j,2)>level)&&(a(i,j,1)-a(i,j,3)>level))

           b(i,j,1)=a(i,j,1);

           b(i,j,2)=a(i,j,2);

           b(i,j,3)=a(i,j,3);

        else b(i,j,1)=255;

            b(i,j,2)=255;

            b(i,j,3)=255;

        end

    end

end

subplot(2,2,2);imshow(b);title('提取红分量后');%显示提取红分量后的图

%提取绿分量,不满足阈值的变为白色

for i=1:m

    for j=1:n

        if((a(i,j,2)-a(i,j,1)>level)&&(a(i,j,2)-a(i,j,3)>level))

           b(i,j,1)=a(i,j,1);

           b(i,j,2)=a(i,j,2);

           b(i,j,3)=a(i,j,3);

        else b(i,j,1)=255;

            b(i,j,2)=255;

            b(i,j,3)=255;

        end

    end

end  

subplot(2,2,3);imshow(b);title('提取绿分量后');%显示提取绿分量后的图

%提取蓝分量,不满足阈值的变为白色

for i=1:m

    for j=1:n

        if((a(i,j,3)-a(i,j,1)>level)&&(a(i,j,3)-a(i,j,2)>level))

           b(i,j,1)=a(i,j,1);

           b(i,j,2)=a(i,j,2);

           b(i,j,3)=a(i,j,3);

        else b(i,j,1)=255;

            b(i,j,2)=255;

            b(i,j,3)=255;

        end

    end

end  

subplot(2,2,4);imshow(b);title('提取蓝分量后');%显示提取蓝分量后的图



   未完待更。。。。


  • 41
    点赞
  • 296
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值