一幅 RGB图像就是 M×N×3 大小的彩色像素的数组,其中的每个彩色像素点都是在特定空间位置的彩色图像所对应的红、绿、蓝三个分量。RGB 图像也可以看做由三个灰度图像形成的“堆栈”,当发送到彩色监视器的红、绿、蓝输入端时,就在屏幕上产生彩色图像。分量图像的数据类决定了它们的取值范围。如果一幅 RGB 图像的数据类是 double,那么取值范围就是 [0,1]。类似的,对于uint8类或uint16类的 RGB图像,取值范围分别是[0,255]或[0,65535]。用来表示这些分量图像像素值的比特数决定了一幅 RGB 图像的比特深度。例如,如果每个分量图像都是 8 比特的图像,那么对应的 RGB图像的深度就是 24 比特,颜色数 ( 2 8 ) 3 \left(2^{8}\right)^{3} (28)3 = 16777216。
令 fR 、 fG 和 fB 分别表示三幅 RGB 分量图像。RGB 图像就是利用 cat(连接)操作将这些分量图像组合而成的彩色图像:
rab_image = cat(3, fR, fG , fB)通常,cat(dim,A1,A2…)沿着由dim指定的方式连接数组。如:dim=1,数组就垂直排列;dim=2,数组就水平排列;dim=3,数组就按照三维方式堆叠。 下面这些命令可以提取出三个分量图像:
fR = rgb_image(:,:,1); %提取红色 fG= rgb_image(:,:,2); %提取绿色 fB = rgb_image(:,:,3); %提取蓝色示例:
rgb_image = imread('RGB.jpg'); imshow(rgb_image),title('原图像') fR = rgb_image(:,:,1); %提取红色 fG= rgb_image(:,:,2); %提取绿色 fB = rgb_image(:,:,3); %提取蓝色 subplot(221),imshow(fR),title('r'); subplot(222),imshow(fG),title('g'); subplot(223),imshow(fB),title('b'); >> rgb_image1 = cat(3,fR,fG,fB); %将提取的红绿蓝进行组合得到的图像 >> subplot(224),imshow(rgb_image1)RGB 彩色空间常常用 RGB 彩色立方体加以显示,这个立方体的顶点是光的原色(红、绿、蓝)和二次色(青色、紫红色、黄色)。
为了从任何透视方向观测这个彩色立方体,可以创建下面的自定义函数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,'FacesColor','interp','EdgeAlpha',0) if nargin == 0 vx = 10;vy = 10;vz = 4; elseif nargin ~=3 error('Wrong number of inputs.') end axis off view([vx,vy,vz]) axis square三分量组合成RGB彩色图像
rgb_image=imread('RGB.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 彩色立方体加以显示,这个立方体的顶点是光的原色(红、绿、蓝)和二次色(青色、紫红色、黄色)。 实验总结: 自然界中任何一种色光都可由R、G、B三基色按不同的比例相加混合而成,当三基色分量都为0(最弱)时混合为黑色光;当三基色分量都为k(最强)时混合为白色光。任一颜色F都是这个立方体坐标中的一个点。可以从RGB图像中提取出红、绿、蓝三个颜色的分量图像,也可由三个分量图像自由组合成彩色图。
索引图像有整数数据矩阵X和彩色映射矩阵map。矩阵map由m×3大小、double类型及范围在[0,1]之间的浮点数构成的数组。map的长度m是定义的颜色数。map的每一行都定义有单色的红、绿、蓝分量。索引图像将像素的亮度值“直接映射”到彩色值。每个像素的颜色由对应的整数矩阵X的值作为指向map的索引决定。如X是double类型,则值1指向map的第一行,值2指向第二行;X是uint8或uint16类型,则值0指向map的第一行。
显示一幅索引图像,可用以下语法实现:
imshow(X,map); 或者 image(X) colormap(map)用较少的颜色去近似表达索引,使用函数imapprox:
[Y,newmap] = imapprox(X,map,n)示例:
RGB=imread('RGB.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色)');注:按照理解,当索引为0是应是单色图像,这里有待理解。
这个函数用newmap返回数组Y,有n种颜色,X可以选择uint8、uint16、double。如果n≤256,则输出Y是uint8;若n>256,则Y是double。当map中的行数比X中的整数值数目少时,X中的多重值将在map中赋以相同的颜色。
指定彩色映射的语法如下:
map(k,:) = [r(k) g(k) b(k)];将图像背景改变颜色(如绿色),以下三种都可以使用
whitebg('g'); whitebg('green'); whitebg([0 1 0]);MATLAB还提供了一些预定义的彩色映射,语法如下:
colormap(map_name) %预定义的彩色映射示例:
colormap([spring;summer;autumn;winter])%相当于自定义了一个256*3维的colormap ,实际上spring,summer,autumn,winter,都是64*3维的colormap x=[0 1 1 0]; y=[0 0 1 1]; %定义四个点 [0 0] [1 0] [1 1] [0 1] fill(x,y,[0 0.1 0.2 0.3]); %定义四个点的C值 ,则Cmin=0,Cmax=0.3 colorbar; map=colormap; %map为256*3矩阵通常,我们使用rgb_image表示RGB图像,用gray_image表示灰度图像,bw表示二值图像。函数dither表示用“抖动”方法从RGB图像创建索引图像,grayslice表示从灰度图像通过阈值处理创建索引图像,gray2ind表示从灰度图像创建索引图像,rgb2ind表示从RGB图像创建索引图像,等等。
语法如下:
bw = dithch(gray_image); %用抖动处理灰度图像变成二值图像 X = grayslice(gray_image,v); %用阈值处理对灰度图像以产生索引图像 [X,map] = gray2ind(gray_image,n); %灰度图像变成索引图像 gray_image = ind2gray(X,map); %索引图像变成灰度图像 [X,map] = rgb2ind(rgb_image,n,dithch_option); RGB图像变成索引图像 rgb_image = ind2rgb(X,map); %索引图像变成RGB图像 gray_image = rgb2gray(rgb_image) %RGB图像变成灰度图像示例:
f = imread('RGB.jpg'); [X1,map1] = rgb2ind(f,8,'nodither'); %rgb图像变成索引图像,不执行抖动 subplot(221),imshow(X1,map1),title('没有进行抖动且将彩色数目减少到8'); [X2,map2] = rgb2ind(f,8,'dither'); %rgb图像变换索引图像 subplot(222),imshow(X2,map2),title('进行抖动且将彩色数目减少到8'); g = rgb2gray(f); %RGB图像变成灰度图像 g1 = dither(g); %用抖动处理灰度图像 subplot(223),imshow(g),title('变成灰度图像'); subplot(224),imshow(g1),title('经抖动后的灰度图像')小结:索引模式和灰度模式比较类似,它的每个像素点也可以有256种颜色容量,但它可以负载彩色。索引模式的图像就像是一块块由彩色的小瓷砖所拼成的,由于它最多只能有256种彩色,所以它所形成的文件相对其它彩色要小得多。索引模式的另一个好处是它所形成的每一个颜色都有其独立的索引标识。当这种图像在网上发布时,只要根据其索引标识将图像重新识别,它的颜色就完全还原了。索引模式主要用于网络上的图片传输和一些对图像像素、大小等有严格要求的地方。
是由于RGB彩色模型不能适用于现实中所有的情况,各种彩色模型是对特定的情况来使用的。相比原始的RGB图像,HSI图像对颜色信息的利用率更高,更适合于图像分析和图像分割等场景。
NTSC彩色空间用于模拟电视,它的优势是灰度信息和彩色数据是分离开的,所以同一信号可以用于彩色电视机和黑白电视机。在NTSC格式中,图像数据由三部分组成:亮度(Y)、色调(I)和饱和度(Q)。亮度描述灰度信息,其他两个分量携带电视信号的彩色信息。
yiq和rgb之间的相互转换为:
yiq_image = rgb2ntsc(rgb_image); %rgb转换为yiq rgb_image = ntsc2rgb(yiq_image); %yiq转换为rgb subplot(121),imshow(yiq_image); subplot(122),imshow(rgb_image);输入RGB图像可以是uint8、uint16、double,输出为double。分量图像yiq_image(:,:,1)是亮度,yiq_image(:,:,2)是色调、yiq_image(:,:,3)是饱和度。 示例:
yiq_image=imread('RGB.jpg'); fY = yiq_image(:,:,1); fI = yiq_image(:,:,2); fQ = yiq_image(:,:,3); subplot(2, 2, 1), imshow(yiq_image);title('(a)原图像'); subplot(2, 2, 2), imshow(fY);title('(b)亮度'); subplot(2, 2, 3), imshow(fI);title('(c)色度'); subplot(2, 2, 4), imshow(fQ) ;title('(d)饱和度'); rgb_image=imread('RGB.jpg'); yiq_image = rgb2ntsc(rgb_image); imshow(yiq_image); subplot(1, 2, 1), imshow(rgb_image);title('(a)原图像'); subplot(1, 2, 2), imshow(yiq_image);title('(b)输出图像');YCbCr 彩色空间广泛用于数字视频。在这种格式中,亮度信息用单独的分量 Y来表示,彩色信息是用两个色差分量 Cb 和 Cr来存储的。分量 Cb 是蓝色分量与参考值的差,分量 Cr是红色分量与参考值的差。工具箱采用的从 RGB转换为 YcbCr 的变换是: [ Y C b C r ] = [ 16 128 128 ] + [ 65.481 128.553 24.966 − 37.797 − 74.203 112.000 112.000 − 93.786 − 18.214 ] [ R G B ] \left[\begin{array}{c}Y \\ C b \\ C r\end{array}\right]=\left[\begin{array}{c}16 \\ 128 \\ 128\end{array}\right]+\left[\begin{array}{ccc}65.481 & 128.553 & 24.966 \\ -37.797 & -74.203 & 112.000 \\ 112.000 & -93.786 & -18.214\end{array}\right]\left[\begin{array}{l}R \\ G \\ B\end{array}\right] ⎣⎡YCbCr⎦⎤=⎣⎡16128128⎦⎤+⎣⎡65.481−37.797112.000128.553−74.203−93.78624.966112.000−18.214⎦⎤⎣⎡RGB⎦⎤ 转换函数是:
ycbcr_image = rgb2ycbcr(rgb_image)输入的 RGB 图像可以是 uint8、uint16 或 double类。输出图像和输入图像的类型相同。使用类似的变换可以从 YCbCr 转换回 RGB:
rgb_image = ycbcr2rgb(ycbcr_image)示例:
rgb_image=imread('flower.jpg'); ycbcr_image = rgb2ycbcr(rgb_image) f = ycbcr2rgb(ycbcr_image) subplot(1, 3, 1), imshow(rgb_image);title('(a)输入的RGB图像'); subplot(1, 3, 2), imshow(ycbcr_image);title('(b)RGB空间图像转换为 YCbCr 图像'); subplot(1, 3, 3), imshow(f);title('(c)YCbCr 图像转换为RGB空间图像');输入的 YCbCr 图像可以是 uint8、uint16 或 double 类。输出图像和输入图像的类型相同。
HSV(色调、饱和度、值)是人们用来从颜色轮或调色板中挑选颜色(例如颜料或墨水)时使用的彩色系统之一,值得考虑的是,这个颜色系统比 RGB 系统更接近人们的经验和对彩色的感知。HSV颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1。它包含RGB模型中的R=1,G=1,B=1三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于角度0°,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180°。饱和度S取值从0到1,所以圆锥顶面的半径为1。 rgb和HSV转换公式为:
hsv_image = rgb2hsv(rgb_image); %rgb转换为hsv rgb_image = hsv2rgb(hsv_image); %hsv转换为rgb subplot(121),imshow(hsv_image); subplot(122),imshow(rgb_image);示例:
rgb_image=imread('flower.jpg'); hsv_image = rgb2hsv(rgb_image) f = hsv2rgb(hsv_image) subplot(1, 3, 1), imshow(rgb_image);title('(a)输入的RGB图像'); subplot(1, 3, 2), imshow(hsv_image);title('(b)RGB空间图像转换为HSV图像'); subplot(1, 3, 3), imshow(f);title('(c)HSV图像转换为RGB空间图像');CMY彩色空间指的是青色、紫红色、黄色,这三种也称为光的二次色或是颜料的原色。K指的是纯黑色。常用于彩色打印机和复印机。 rgb和CMY转换公式为:
cmy_image = imcomplement(rgb_image); rgb_image = imcomplement(cmy_image); subplot(121),imshow(cmy_image); subplot(122),imshow(rgb_image);HSI彩色空间是指人们在观察和描述彩色物体时,常用色调、饱和度和亮度进行描述。色调是描述纯色的颜色属性,饱和度则是纯色被白光冲淡程度的度量,而亮度是一种主观感觉,无法度量。
1、 将颜色从RGB转换为HSI
H = { Θ B ⩽ G 360 − Θ B > G H=\left\{\begin{array}{cc}\Theta & B \leqslant G \\ 360-\Theta & B>G\end{array}\right. H={Θ360−ΘB⩽GB>G
Θ = cos − 1 { 0.5 [ ( R − G ) + ( R − B ) ] [ ( R − G ) 2 + ( R − B ) ( G − B ) ] 1 / 2 } \Theta=\cos ^{-1}\left\{\frac{0.5[(R-G)+(R-B)]}{\left[(R-G)^{2}+(R-B)(G-B)\right]^{1 / 2}}\right\} Θ=cos−1{[(R−G)2+(R−B)(G−B)]1/20.5[(R−G)+(R−B)]}
饱和度由下面的式子给出:
S = 1 − 3 ( R + G + B ) [ min ( R , G , B ) ] S=1-\frac{3}{(R+G+B)}[\min (R, G, B)] S=1−(R+G+B)3[min(R,G,B)]
亮度由下面式子给出:
I = 1 3 ( R + G + B ) I=\frac{1}{3}(R+G+B) I=31(R+G+B)
rgb转换为hsi的函数为:
function hsi = rgb2hsi(rgb) rgb = im2double(rgb); r = rgb(:, :, 1); g = rgb(:, :, 2); b = rgb(:, :, 3); num = 0.5*((r - g) + (r - b)); den = sqrt((r - g).^2 + (r - b).*(g - b)); theta = acos(num./(den + eps)); H = theta; H(b > g) = 2*pi - H(b > g); H = H/(2*pi); num = min(min(r, g), b); den = r + g + b; den(den == 0) = eps; S = 1 - 3.* num./den; H(S == 0) = 0; I = (r + g + b)/3; hsi = cat(3, H, S, I);hsi转换为rgb的函数为:
function rgb = hsi2rgb(hsi) H = hsi(:, :, 1) * 2 * pi; S = hsi(:, :, 2); I = hsi(:, :, 3); R = zeros(size(hsi, 1), size(hsi, 2)); G = zeros(size(hsi, 1), size(hsi, 2)); B = zeros(size(hsi, 1), size(hsi, 2)); idx = find( (0 <= H) & (H < 2*pi/3)); B(idx) = I(idx) .* (1 - S(idx)); R(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx)) ./ ... cos(pi/3 - H(idx))); G(idx) = 3*I(idx) - (R(idx) + B(idx)); idx = find( (2*pi/3 <= H) & (H < 4*pi/3) ); R(idx) = I(idx) .* (1 - S(idx)); G(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 2*pi/3) ./ ... cos(pi - H(idx))); B(idx) = 3*I(idx) - (R(idx) + G(idx)); idx = find( (4*pi/3 <= H) & (H <= 2*pi)); G(idx) = I(idx) .* (1 - S(idx)); B(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 4*pi/3) ./ ... cos(5*pi/3 - H(idx))); R(idx) = 3*I(idx) - (G(idx) + B(idx)); rgb = cat(3, R, G, B); rgb = max(min(rgb, 1), 0);示例:
rgb_image = imread('scene.jpg'); >> hsi = rgb2hsi(rgb_image); >> subplot(121),imshow(hsi),title('rgb变成hsi') >> rgb = hsi2rgb(hsi); >> subplot(122),imshow(rgb)
彩色空间以使计算更方便的方法描述了彩色信息,或以对特殊应用更直观或更合适的方法描述彩色。迄今为止讨论的所有空间都与设备相关。下面集中讨论独立于设备的彩色空间。
1 背景
通常,在辨别不同颜色时使用的特征是亮度、色调和饱和度。亮度具体表达无色的强度的概念,色调是在光波混合中与主要波长相关的属性,色调描述了观察者感知的主要彩色,饱和度指的是相对纯度或与色调相混合的白光数量。
色调和饱和度合起来称为颜色,因此,彩色是由颜色和亮度表现的特性。为形成一种特殊颜色而需要的红、绿、蓝颜色叫做三色值,分别用 X、Y、Z 来表示。颜色是由颜色自身的三色系数来指定的,定义为: x = X X + Y + Z x=\frac{X}{X+Y+Z} x=X+Y+ZX y = Y X + Y + Z y=\frac{Y}{X+Y+Z} y=X+Y+ZY z = Z X + Y + Z = 1 − x − y z=\frac{Z}{X+Y+Z}=1-x-y z=X+Y+ZZ=1−x−y 并且: x + y + z = 1 x+y+z=1 x+y+z=1
其中,x、y 和 z 分别表示红、绿、蓝分量。在可见光谱中,光的任何波长均可产生与那个波长相对应的三色值。以 x 和 y 为参数的函数显示人能感觉到的颜色范围的图被称为色度图。在色度图中,连接任意两个点的直线段说明了所有不同的颜色变化,可以由相加的两种颜色混合得到。由任何三个固定颜色处的顶点形成的三角形不能包括图中的全部颜色区域,所以任何颜色都可从确定的三原色产生是误解。
2.sRGB 彩色空间
RGB彩色模型依赖于设备。这意味着对于给定的一组 R、 G、B 值,不存在单一、明确的彩色解释。另外,图像文件常常不包含获取图像时所用设备的彩色特性信息。就像结果那样,相同的图像文件可能(经常就是)在不同的计算机系统中看上去明显不同。
为解决这个问题,微软和惠普提出了新的默认彩色空间标准,称作 sRGB。sRGB 彩色空间被设计为与计算机的CRT监视器标准特性相一致,并且与PC机在家庭和办公室观察环境相一致。 sRGB彩色空间独立于设备。因此,sRGB颜色值很容易被改变为另一个独立于设备的彩色空间。
sRGB 标准已变成计算机界广泛接受的标准,特别是面向消费者的设备。数字摄像机、扫 描仪、计算机显示器和打印机等,都例行地被设计为假定图像的 RGB值与 sRGB的彩色空间是一致的,除非图像文件包含更多的指定设备的彩色信息。
3.CIE 和 sRGB 彩色空间之间的转换
工具箱函数 makecform 和 applycform 可用于独立于设备的彩色空间之间的转换。
以Lab彩色空间为基础创建在感觉上的一致彩色空间
构建一个彩色标尺,可用于彩色和黑色出版物,设计在40和80之间的间隔相等的估值为1024的斜坡;
代码:
L=linspace(40,80,1024); radius=70; theta=linspace(0,pi,1024); a=radius*cos(theta); b=radius*sin(theta); %我们制作一幅 L*a*b* 彩色标尺的 100×104×3 大小的图像: L=repmat(L,100,1); a=repmat(a,100,1); b=repmat(b,100,1); lab_scale=cat(3,L,a,b); cform =makecform('lab2srgb'); rgb_scale= applycform(lab_scale,cform); imshow(rgb_scale);彩色图像处理细分成 3 个主要领域:
颜色变换(也叫彩色映射)单独彩色平面的空间处理颜色向量的处理第 1 类处理每个彩色平面的像素,这类处理严格地以像素值为基础,而不是它们的空间坐标,类似于灰度变换处理。第 2 类处理涉及各个彩色平面的空间(邻域)滤波, 类似于空间滤波。第 3 类处理涉及以同时处理彩色图像的所有分量为基础的处理技术。因为全彩图像至少有三个分量,彩色像素可以用向量来处理。
令 c 代表 RGB彩色空间中的任意向量: c = [ c R c G c B ] = [ R G B ] c=\left[\begin{array}{l}c_{R} \\ c_{G} \\ c_{B}\end{array}\right]=\left[\begin{array}{l}R \\ G \\ B\end{array}\right] c=⎣⎡cRcGcB⎦⎤=⎣⎡RGB⎦⎤
这个公式指出,c 分量是一副彩色图像在某个点上的 RGB分量。考虑彩色分量是坐标的函数这样的事实,用下边的符号表示:
c ( x , y ) = [ c R ( x , y ) c G ( x , y ) c B ( x , y ) ] = [ R ( x , y ) G ( x , y ) B ( x , y ) ] c(x, y)=\left[\begin{array}{l}c_{R}(x, y) \\ c_{G}(x, y) \\ c_{B}(x, y)\end{array}\right]=\left[\begin{array}{l}R(x, y) \\ G(x, y) \\ B(x, y)\end{array}\right] c(x,y)=⎣⎡cR(x,y)cG(x,y)cB(x,y)⎦⎤=⎣⎡R(x,y)G(x,y)B(x,y)⎦⎤
对于一幅大小为 M×N 的图像,有 MN 个这样的向量 c(x,y),其中,x=0,1,2…,M–1 且 y=0,1,2…,N–1。
在某些情况下,无论彩色图像每次处理一个平面,还是作为向量处理,都会得到相等的结果。然而,不会总是这样的情况。为了使两种方法都相同, 两个条件必须满足:首先,处理必须对向量和标量都可用。其次,针对向量的每个分量的操作必须与其他分量无关。
这里描述的是单一彩色模型情况下的技术,以处理彩色图像的彩色分量或单色图像的亮度分量为基础。对于彩色图像,限定如下形式的变换:
s i = T i ( r i ) i = 1 , 2 , … , n \mathrm{si}=\mathrm{Ti}(\mathrm{ri}) \mathrm{i}=1,2, \ldots, \mathrm{n} si=Ti(ri)i=1,2,…,n
这里,ri 和 si 是输入和输出图像的彩色分量,n 是 ri是彩色空间的维数(或是彩色分量的数量),并且 Ti 是全彩色变换(或叫映射)函数。如果输入图像是单色的,公式将如下所示:
s i = T i ( r ) i = 1 , 2 , … , n \mathrm{si}=\mathrm{Ti}(\mathrm{r}) \mathrm{i}=1,2, \ldots, \mathrm{n} si=Ti(r)i=1,2,…,n
r表示灰度级的值,n 是在 Si中彩色分量的数量。这个公式描述了灰度级对任意颜色的映射,这一处理在伪彩色变换或伪彩色映射中经常提到。 注意,如果我们让 r1=r2=r3=r,第一个公式可用来处理 RGB中的单色图像。
三次样条内插用spline函数来实现:
Z = spline(x,y,xi)编写代码:
x=0:10; y=sin(x); subplot(121),plot(x,y,'*',x,y,'r');%画xy图像,并标出x和y点 xx=0:.25:10; yy=spline(x,y,xx); subplot(122),plot(x,y,'o',xx,yy,'b');%也是画xy图像,标出x和y点,但是这中间插值了隔.25的数,只是没被标出来变换函数的说明可以用图形法操作控制点的方式交互地产生,那些控制点输入到 interpiq和spline函数并实时地显示将被处理的图像的结果。语法是:
g = ice('property name', 'property value',…)最后的结果是带有句柄的图像g(通常是图形目标)。
示例:
f=imread('scene1.jpg'); g=ice('image',f);help ice — 未找到 ice。改为显示 dice 的帮助。— 因为没找到ice.m源文件,这一节实验暂缓
RGB向量的数学表示为: c ˉ ( x , y ) = [ 1 K ∑ ( s , t ) ∈ S π R ( s , t ) 1 K ∑ ( s , t ) ∈ S y G ( s , t ) 1 K ∑ ( s , t ) ∈ S π B ( s , t ) ] \bar{c}(x, y)=\left[\begin{array}{l}\frac{1}{K} \sum_{(s, t) \in S_{\pi}} R(s, t) \\ \frac{1}{K} \sum_{(s, t) \in S_{y}} G(s, t) \\ \frac{1}{K} \sum_{(s, t) \in S_{\pi}} B(s, t)\end{array}\right] cˉ(x,y)=⎣⎡K1∑(s,t)∈SπR(s,t)K1∑(s,t)∈SyG(s,t)K1∑(s,t)∈SπB(s,t)⎦⎤
从上式可以看出,需要得到的结果是由每个分量执行邻域均值获得的,因此想要平滑彩色图像,就需要用邻域平均的平滑对每个图像平面的基础上处理。
线性空间滤波的步骤为:
1、抽取3个分量图像:
fr = fc(:,:,1); fg = fc(:,:,2); fb = fc(:,:,3);2、分别过滤每个分量图像:
fR_filtered = imfilter(fR,w,'replicate'); %平滑红色分量 fG_filtered = imfilter(fG,w,'replicate'); %平滑绿色分量 fB_filtered = imfilter(fB,w,'replicate'); %平滑蓝色分量3、重建滤波过的RGB图像:
fc_filtered = cat(3,fR_filtered,fG_filtered,fB_filtered);可以将上面三个步骤合成一步:
fc_filtered = imfilter(fc,w,'replicate');示例:
fc = imread('tree.jpg'); subplot(331),imshow(fc),title('原图像'); h = rgb2hsi(fc); subplot(332),imshow(h),title('rgb转换成hsi'); H = h(:,:,1); S = h(:,:,2); I = h(:,:,3); subplot(333),imshow(H),title('H'); subplot(334),imshow(S),title('S'); subplot(335),imshow(I),title('I'); w = fspecial('average',25); subplot(336),imshow(w,[]),title('均值模板'); I_filtered = imfilter(I,w,'replicate'); subplot(337),imshow(I_filtered),title('对亮度进行滤波'); h = cat(3,H,S,I_filtered); subplot(338),imshow(h),title('对亮度进行滤波后组合起来的图像'); f = hsi2rgb(h); subplot(339),imshow(f),title('将图像进行反变换')结论:将彩色图像进行亮度滤波后的平滑处理,使得图像整体变得模糊,是因为经过平滑处理后,亮度分量的变化减少了,但色调和饱和度分量没有变化。彩色图像和灰度图像平滑处理的不同之处在于,灰度平滑处理是将尖锐的边缘变得平滑,虽然彩色图像也是这样,但彩色图像包括亮度、饱和度、色调三个方面,因此平滑处理的是将三种分别平滑再组合起来得到一幅平滑彩色图像。
仅对rgb进行滤波,实验代码如下:
fc = imread('RGB.jpg'); subplot(331),imshow(fc),title('原图像'); fr = fc(:,:,1); fg = fc(:,:,2); fb = fc(:,:,3); subplot(332),imshow(fr),title('fr'); subplot(333),imshow(fg),title('fg'); subplot(334),imshow(fb),title('fb'); w = fspecial('average',25); fR_filtered = imfilter(fr,w,'replicate'); %平滑红色分量 fG_filtered = imfilter(fg,w,'replicate'); %平滑绿色分量 fB_filtered = imfilter(fb,w,'replicate'); %平滑蓝色分量 subplot(335),imshow(fR_filtered),title('对红色进行滤波'); subplot(336),imshow(fG_filtered),title('对绿色进行滤波'); subplot(337),imshow(fB_filtered),title('对蓝色进行滤波'); h = cat(3,fR_filtered,fG_filtered,fB_filtered); subplot(338),imshow(h),title('组合起来的图像'); f = hsi2rgb(h); subplot(339),imshow(f),title('将图像进行反变换')图像锐化我们使用拉普拉斯模板,正如上面叙述那样,分别计算每个分量图像的拉普拉斯得到全彩色图像的拉普拉斯。
实验代码:
fb = imread('scene1.jpg'); subplot(121),imshow(fb),title('原始图像') lapmask = [1 1 1;1 -8 1;1 1 1]; %拉普拉斯模板 fb = tofloat(fb); %将其变成浮点型 fen = fb - imfilter(fb,lapmask,'replicate'); %锐化滤波 subplot(122),imshow(fen),title('锐化后图像')
首先,我们需要分清楚两种概念:第一,基于单独彩色平面的处理;第二,直接在RGB矢量空间中的处理。
说明:回顾灰度边缘检测,我们一般先求出图像的梯度或者二阶微分,然后根据梯度和二阶差分的大小,以及最大变化率方向来寻找可能存在的图像边缘。彩色图像的每个像素包含红绿蓝三个分量,这样每个像素可以由一个三维向量来表示。但是在进行图像边缘检测的时候,我们遇到一个问题,那就是向量并不存在梯度概念。单独对每个颜色分量进行边缘检测,其梯度不能反映图像整体彩色的差异变化。
用sobel算子进行偏微分计算,计算彩色图像的梯度语法为:
[VG,A,PPG] = colorgrad(f,T)其中,f是RGB图像,T是[0,1]范围内的阈值选项(默认值为0),VG是RGB向量梯度,A是以弧度计的角度,PPG是由单独彩色平面的2D梯度之和形成的梯度图像。
示例:
f = imread('scene.jpg'); [VG,A,PPG] = colorgrad(f) subplot(121),imshow(VG),title('在rgb空间计算梯度图像'); subplot(122),imshow(PPG),title('分别在rgb计算梯度然后相加');彩色区域分割是为了将图像中的每个RGB像素进行分类,使其在指定的范围内有或没有一种颜色。为了执行这种比较,通常采用欧几里得距离来进行度量。 D ( z , m ) = ∥ z − m ∥ = [ ( z − m ) ⊤ ( z − m ) ] 1 / 2 = [ ( z R − m R ) 2 + ( z G − m G ) 2 + ( z B − m B ) 2 ] 1 / 2 \begin{aligned} D(z, m) &=\|z-m\| \\ &=\left[(z-m)^{\top}(z-m)\right]^{1 / 2} \\ &=\left[\left(z_{R}-m_{R}\right)^{2}+\left(z_{G}-m_{G}\right)^{2}+\left(z_{B}-m_{B}\right)^{2}\right]^{1 / 2} \end{aligned} D(z,m)=∥z−m∥=[(z−m)⊤(z−m)]1/2=[(zR−mR)2+(zG−mG)2+(zB−mB)2]1/2
令z是RGB空间的任意点,如果它们之间的距离小于指定的阈值T,则z相似于m。
分割是通过函数colorseg实现的,基本语法为:
S = colorseg(method,f,T,parameters)其中,method选择有’euclidean’(欧几里得)、‘mahalanobis’(马氏距离),f是待分割的RGB彩色图像,T是阈值。若选择’euclidean’(欧几里得),则输入参数为m;若选择’mahalanobis’(马氏距离),则输入参数为m和c。参数m是均值m,c是协方差矩阵C。
示例:
f = imread('scene.jpg'); imshow(f); title('原图像'); figure,mask=roipoly(f);%roipoly为选择感兴趣的多边形 red=immultiply(mask,f(:,:,1));%immultipy函数为2幅图像对应的元素相乘 green=immultiply(mask,f(:,:,2)); blue=immultiply(mask,f(:,:,3)); g=cat(3,red,green,blue);%将对应的3个分量重新组合 figure,imshow(g);title('用函数roipoly交互式地提取感兴趣的区域'); f = imread('car.jpg'); imshow(f); title('原图像'); figure,mask=roipoly(f);%roipoly为选择感兴趣的多边形 red=immultiply(mask,f(:,:,1));%immultipy函数为2幅图像对应的元素相乘 green=immultiply(mask,f(:,:,2)); blue=immultiply(mask,f(:,:,3)); g=cat(3,red,green,blue);%将对应的3个分量重新组合 figure,imshow(g);title('用函数roipoly交互式地提取感兴趣的区域'); [M,N,K]=size(g);%这里k为3 I=reshape(g,M*N,3);%I为M*N行,3列的数组 idx=find(mask); I=double(I(idx,1:3)); [C,m]=covmatrix(I);%计算出协方差矩阵C和均值m d=diag(C);%方差 sd=sqrt(d);%标准差 E25=colorseg('euclidean',f,25,m);%使用欧式距离进行彩色分割 figure,subplot(2,2,1),imshow(E25); title('(a)使用euclidean,T=25分割效果'); E50=colorseg('euclidean',f,50,m); subplot(2,2,2),imshow(E50); title('(b)使用euclidean,T=50分割效果'); E75=colorseg('euclidean',f,75,m); subplot(2,2,3),imshow(E75); title('(c)使用euclidean,T=75分割效果'); E100=colorseg('euclidean',f,100,m); subplot(2,2,4),imshow(E100); title('(d)使用euclidean,T=100分割效果'); M25=colorseg('mahalanobis',f,25,m,C);%使用马氏距离分割 figure,subplot(2,2,1),imshow(M25); title('(e)使用mahalanobis,T=25分割效果'); M50=colorseg('mahalanobis',f,50,m,C); subplot(2,2,2),imshow(M50); title('(f)使用mahalanobis,T=50分割效果'); M75=colorseg('mahalanobis',f,75,m,C); subplot(2,2,3),imshow(M75); title('(g)使用mahalanobis,T=75分割效果'); M100=colorseg('mahalanobis',f,100,m,C); subplot(2,2,4),imshow(M100); title('(h)使用mahalanobis,T=100分割效果');colorseg函数:
function I = colorseg(varargin) %COLORSEG Performs segmentation of a color image. % S = COLORSEG('EUCLIDEAN', F, T, M) performs segmentation of color % image F using a Euclidean measure of similarity. M is a 1-by-3 % vector representing the average color used for segmentation (this % is the center of the sphere in Fig. 6.26 of DIPUM). T is the % threshold against which the distances are compared. % % S = COLORSEG('MAHALANOBIS', F, T, M, C) performs segmentation of % color image F using the Mahalanobis distance as a measure of % similarity. C is the 3-by-3 covariance matrix of the sample color % vectors of the class of interest. See function covmatrix for the % computation of C and M. % % S is the segmented image (a binary matrix) in which 0s denote the % background. % Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins % Digital Image Processing Using MATLAB, Prentice-Hall, 2004 % $Revision: 1.5 $ $Date: 2003/11/21 14:28:34 $ % Preliminaries. % Recall that varargin is a cell array. f = varargin{2}; if (ndims(f) ~= 3) | (size(f, 3) ~= 3) error('Input image must be RGB.'); end M = size(f, 1); N = size(f, 2); % Convert f to vector format using function imstack2vectors. [f, L] = imstack2vectors(f); f = double(f); % Initialize I as a column vector. It will be reshaped later % into an image. I = zeros(M*N, 1); T = varargin{3}; m = varargin{4}; m = m(:)'; % Make sure that m is a row vector. if length(varargin) == 4 method = 'euclidean'; elseif length(varargin) == 5 method = 'mahalanobis'; else error('Wrong number of inputs.'); end switch method case 'euclidean' % Compute the Euclidean distance between all rows of X and m. See % Section 12.2 of DIPUM for an explanation of the following % expression. D(i) is the Euclidean distance between vector X(i,:) % and vector m. p = length(f); D = sqrt(sum(abs(f - repmat(m, p, 1)).^2, 2)); case 'mahalanobis' C = varargin{5}; D = mahalanobis(f, C, m); otherwise error('Unknown segmentation method.') end % D is a vector of size MN-by-1 containing the distance computations % from all the color pixels to vector m. Find the distances <= T. J = find(D <= T); % Set the values of I(J) to 1. These are the segmented % color pixels. I(J) = 1; % Reshape I into an M-by-N image. I = reshape(I, M, N);