彩色图像处理
一、RGB图像
一幅RGB图像是一个MN3的彩色像素数组,其中每个彩色色素是一个三值组,这三个值分别对应一个特定空间位置处RGB图像的红,绿,蓝分量。
RGB也可以视为三幅灰度图像形成的“堆叠”,当将他们分别送到彩色显示器的红,绿,蓝输入端时,会在屏幕上生成一幅彩色图像。分量图像的数据类决定了他们的取值范围。用来表示这些分量图像像素值的比特数决定了一幅图像的比特深度。图像的颜色数为;(2b)3,其中b是每幅图像的比特数。
使用cat运算符可以堆叠出RGB图像:
rgb_image=cat(3,fR,fG,fB)
该运算中,要求图像按顺序放置。cat运算符的语法为;
rgb_image=cat(dim,A1,A2,…) 沿指定的方向来连接各个数组。如果dim=1,那么这些数组垂直排列,dim=2,则这些数组水平排列,dim=3,则在第三个方向排列。
如果所有分量图像都是一样的,那么结果是一幅灰度图像。
提取彩色图像的三幅分量图像:
fR=f(:,:,1);
>> fG=f(:,:,2);
>> fB=f(:,:,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);
RGB彩色空间通常以图解的方式显示一个RGB彩色立方体,立方体的顶点是光的原色(红,绿,蓝)和二次色(青,红紫,黄)。
为从任意角度查看该彩色立方体,可以定义M函数rgbcube
function rgbcube(vx,vy,vz)
vertices_matrix=[0 0 0;0 0 1;0 1 0;0 1 1;1 0 0;1 0 1;1 1 0;1 1 1];
faces_matrix=[1 5 6 2;1 3 7 5;1 2 4 3;2 4 8 6;3 7 8 4;5 6 8 7];
colors=vertices_matrix;
patch('Vertices',vertices_matrix,'Faces',faces_matrix,'FaceVertexCData',colors,'FaceColor','interp','EdgeAlpha',0)
if nargin==0
vx=10;vy=10;vz=4;
elseif nargin~=3
error('wrong number of input')
end
axis off
view([vx,vy,vz])
axis square
实验总结:
在RGB彩色模型中表示的图像由三个分量图像组成,每种原色一幅分量图像。当送入RGB监视器时,这3幅图像在屏幕上混合生成一幅彩色图像。RGB彩色立方体是实心的,在24比特RGB图像中,它由(28)3=16 777 216种颜色组成。
二、索引图像
索引图像有两个分量:一个整数数据矩阵X和一个彩色映射矩阵map。矩阵map是一个大小为m*3的double数组,其值是区间[0,1]上的浮点数。map的长度m等于其定义的颜色数。map的每一行指定单一颜色的红,绿,蓝分量(如果map的三列相等,则彩色映射就成为灰度图)。索引图像将像素的灰度值“直接映射”到彩色值。通过将相应整数矩阵X的值作为指向map的一个索引,来确定每个像素的颜色。如果 X是double类型, 那么值 1 指向 map 的第一行,值 2 指向第二行,等等。如果 X是uint8或uint16类型,那么值 0 指向 map 的第一行。
要显示一幅索引图像,可以写出
imshow(X,map)
或者,
image(X)
colormap(map)
彩色映射使用索引图像来存储,使用imre