数字图像处理第六章——彩色图像处理(上)

数字图像处理—彩色图像处理

(一) 在 MATLAB 中彩色图像的表示

1.1 RGB图像

一幅 RGB图像就是 M×N×3 大小的彩色像素的数组,其中的每个彩色像素点都是在特定空间位置的彩色图像所对应的红、绿、蓝三个分量。RGB 图像也可以看做由三个灰度图像形成的“堆栈”,当发送到彩色监视器的红、绿、蓝输入端时,就在屏幕上产生彩色图像。 按照惯例,形成一幅 RGB 彩色图像的三幅图像通常被称作红、绿、蓝分量图像

分量图像的数据类决定了它们的取值范围。如果一幅 RGB 图像的数据类是 double,那么取值范围就是 [0,1]。类似的,对于uint8类uint16类的 RGB图像,取值范围分别是[0,255]或[0,65535]。

用来表示这些分量图像像素值的比特数决定了一幅 RGB 图像的比特深度。例如,如果每个分量图像都是 8 比特的图像,那么对应的 RGB图像的深度就是 24 比特。通常,所有分量图像的比特数都是相同的。在这种情况下,一幅 RGB图像可能有的色彩数就是( 2 b 2^b 2b)的三次方,其中的 b 就是每个分量图像的比特数。对于 8 比特图像,颜色数为 16 777 216。

令 fR 、 fG 和 fB 分别表示三幅 RGB 分量图像。RGB 图像就是利用 cat(连接)操作将这些分量图像组合而成的彩色图像:

rab_image = cat(3, fR,  fG , fB) 

在运算中,图像按顺序放置。通常,cat(dim,A1,A2…)沿着由dim指定的方式连接数组 (它们必须是相同尺寸)。例如,如果dim=1,数组就垂直安排;如果dim=2,数组就水平安排; 如果dim=3,数组就按照三维方式堆叠

如果所有的分量图像都是一样的,那么结果是一幅灰度图像

令rgb_image表示一幅RGB图像,下面这些命令可以提取出三个分量图像:

fR = rgb_image(: , : , 1); 
fG = rgb_image(: , : , 2); 
FB = rgb_image(: , : , 3); 

在这里插入图片描述
编写代码:

rgb_image=imread('D:\数字图像处理\第六章学习\food2.jpg');
fR = rgb_image(:, :, 1);
fG = rgb_image(:, :, 2);
fB = rgb_image(:, :, 3);
subplot(2, 2, 1), imshow(rgb_image);title('(a)原图像');
subplot(2, 2, 2), imshow(fR);title('(b)红色分量图');
subplot(2, 2, 3), imshow(fG);title('(c)绿色分量图');
subplot(2, 2, 4), imshow(fB) ;title('(d)蓝色分量图');  

代码运行效果如下:

编写代码:


rgb_image=imread('D:\数字图像处理\第六章学习\food2.jpg');
fR = rgb_image(:, :, 1);
fG = rgb_image(:, :, 2);
fB = rgb_image(:, :, 3);
rgb_red=cat(3,fR,zeros(size(fR)),zeros(size(fR)));
rgb_green=cat(3,zeros(size(fR)),fG,zeros(size(fR)));
rgb_blue=cat(3,zeros(size(fR)),zeros(size(fR)),fB);
subplot(2, 2, 1), imshow(rgb_image);title('(a)原图像');
subplot(2, 2, 2), imshow(rgb_red);title('(b)红色分量');
subplot(2, 2, 3), imshow(rgb_green);title('(c)绿色分量');
subplot(2, 2, 4), imshow(rgb_blue) ;title('(d)蓝色分量'); 

代码运行效果如下:

三分量组合成RGB彩色图像

编写代码:

rgb_image=imread('D:\数字图像处理\第六章学习\food2.jpg');
fR = rgb_image(:, :, 1);
fG = rgb_image(:, :, 2);
fB = rgb_image(:, :, 3);
rgb_1=cat(3,fR,fB,fB);
rgb_2=cat(3,fR,fR,fG);
rgb_3=cat(3,fB,fG,fG);
subplot(2, 2, 1), imshow(rgb_image);title('(a)原图像');
subplot(2, 2, 2), imshow(rgb_1);title('(b)红绿绿分量组成的彩色图');
subplot(2, 2, 3), imshow(rgb_2);title('(c)红红绿分量组成的彩色图');
subplot(2, 2, 4), imshow(rgb_3);title('(d)绿蓝蓝分量组成的彩色图');  

代码运行效果如下:

RGB 彩色空间常常用 RGB 彩色立方体加以显示,这个立方体的顶点是光的原色(红、绿、蓝)和二次色(青色、紫红色、黄色)。

在这里插入图片描述
为了能从任何透视方向观测这个彩色立方体,可使用自定义函数rgbcube

rgbcube(vx,vy,vz) 

编写代码:

rgbcube(0,0,10);       %3个参数表示观看图像视角的点坐标
%rgbcube(10,10,10);    %3个参数表示观看图像视角的点坐标
axis on;grid on;
title('RGB立方体1');

代码运行效果如下:

实验总结

自然界中任何一种色光都可由R、G、B三基色按不同的比例相加混合而成,当三基色分量都为0(最弱)时混合为黑色光;当三基色分量都为k(最强)时混合为白色光。任一颜色F是这个立方体坐标中的一点,调整三色系数r、g、b中的任一系数都会改变F的坐标值,也即改变了F的色值。可以从RGB图像中提取出红、绿、蓝三个颜色的分量图像,也可由三个分量图像自由组合成彩色图,如果所有的分量图像都是一样的,那么组合结果是一幅灰度图像。从不同透视方向观测RGB彩色立方体,看到的图像是不一样的,RGB彩色空间采用物理三基色表示,因而物理意义很清楚,适合彩色显像管工作。然而这一体制并不适应人的视觉特点。因而,产生了其他不同的颜色空间表示法。

1.2 索引图像

索引图像有两个分量:整数数据矩阵 X 和彩色映射矩阵 map。矩阵 map 是 m×3 大小、由 double 类型且范围在[0,1]之间的浮点数构成的数组。map 的长度 m 等于定义的颜色数。map 的每一行都定义有单色的红、绿、蓝分量。索引图像将像素的亮度值“直接映射”到彩色值。 每个像素的颜色由对应的整数矩阵 X的值作为指向 map的索引决定。如果 X是double类型, 那么值 1 指向 map 的第一行,值 2 指向第二行,等等。如果 X是uint8或uint16类型,那么值 0 指向 map 的第一行。

有时候,用较少的颜色去近似表达索引图像是有必要的。为此,使用函数imapprox, 语法如下:

[Y, newmap] = imapprox (X, map,n) 

这个函数利用彩色映射newmap来返回数组Y,最多有n种颜色。输入数组X的类型可以 是uint8、uint16或double。如果n小于等于256,那么输出Y是uint8类;如果n大于 256,那么Y是double类。

编写代码:

RGB=imread('D:\数字图像处理\第六章学习\flower3.jpg');
[X map]=rgb2ind(RGB,256);
subplot(3, 3, 1),imshow(X,map);           %max(X(:))=255;
title('原始索引彩色图像(256色)');
[Y,newmap]=imapprox(X,map,128);%用较少的128颜色来近似一幅索引图像
subplot(3, 3, 2),imshow(Y,newmap);
title('索引图像(128色)');
[Y,newmap]=imapprox(X,map,64);%用较少的64颜色来近似一幅索引图像
subplot(3, 3, 3),imshow(Y,newmap);
title('索引图像(64色)');
[Y,newmap]=imapprox(X,map,32);%用较少的32颜色来近似一幅索引图像
subplot(3, 3, 4),imshow(Y,newmap);
title('索引图像(32色)');
[Y,newmap]=imapprox(X,map,16);%用较少的16颜色来近似一幅索引图像
subplot(3, 3, 5),imshow(Y,newmap);
title('索引图像(16色)');
[Y,newmap]=imapprox(X,map,8);%用较少的8颜色来近似一幅索引图像
subplot(3, 3, 6),imshow(Y,newmap);
title('索引图像(8色)');
[Y,newmap]=imapprox(X,map,4);%用较少的4颜色来近似一幅索引图像
subplot(3, 3, 7),imshow(Y,newmap);
title('索引图像(4色)');
[Y,newmap]=imapprox(X,map,2);%用较少的2颜色来近似一幅索引图像
subplot(3, 3, 8),imshow(Y,newmap);
title('索引图像(2色)');
[Y,newmap]=imapprox(X,map,0);%用较少的0颜色来近似一幅索引图像
subplot(3, 3, 9),imshow(Y,newmap);
title('索引图像(0色)');

代码运行效果如下:
在这里插入图片描述
在这里插入图片描述
指定彩色映射的办法有很多,一种方法就是利用如下语句:

map(k, :) = [r(k) g(k) b(k)];

其中,[r(k) g(k) b(k)]是RGB值,指定彩色映射的一行。变化的k值可将map填满。

用下面语句中的任何一条都可以把图像的背景色改成想要的颜色:

whitebg('c');   %蓝色
whitebg('y');   %黄色
whitebg('Cyan'); 
whitebg('yellow'); 
whitebg([0 1 1]);  %蓝色
whitebg([1 1 0]); %黄色

代码运行效果如下:


MATLAB提供了一些预定义的彩色映射,可用下面的指令来访问:

colormap(map_name)    %将彩色映射设定为矩阵map_name

编写代码:

colormap([spring;summer;autumn;winter])%相当于
  • 39
    点赞
  • 239
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值