一幅 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彩色空间采用物理三基色表示,因而物理意义很清楚,适合彩色显像管工作。然而这一体制并不适应人的视觉特点。因而,产生了其他不同的颜色空间表示法。
索引图像有两个分量:整数数据矩阵 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])%相当于自定义了一个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矩阵
函数 | 描述 |
---|---|
spring | 由深红和黄色色调组成 |
summer | 由绿色和黄色色调组成 |
autumn | 从红色到橙色、再到黄色平缓变化 |
winter | 由蓝色和绿色色调组成 |
实验总结:
索引模式和灰度模式比较类似,它的每个像素点也可以有256种颜色容量,但它可以负载彩色。索引模式的图像就像是一块块由彩色的小瓷砖所拼成的,由于它最多只能有256种彩色,所以它所形成的文件相对其它彩色要小得多。索引模式的另一个好处是它所形成的每一个颜色都有其独立的索引标识。当这种图像在网上发布时,只要根据其索引标识将图像重新识别,它的颜色就完全还原了。索引模式主要用于网络上的图片传输和一些对图像像素、大小等有严格要求的地方。
下表列出了在 RGB图像、索引图像和灰度图像之间进行转换的工具箱函数。
函数 | 描述 |
---|---|
Dither | 采用“抖动”方法从 RGB 图像创建索引图像 |
grayslice | 从灰度图像通过阈值处理创建索引图像 |
gray2ind | 从灰度图像创建索引图像 |
ind2gray | 从索引图像创建灰度图像 |
rgb2ind | 从 RGB 图像创建索引图像 |
ind2rgb | 从索引图像创建 RGB 图像 |
rgb2gray | 从 RGB 图像创建灰度图像 |
1.函数 dither 可以用于灰度图像和彩色图像。将灰度图像转换为二值图像,将彩色图像抖动为索引图像。用于灰度图像的函数dither的语法是:
bw = dither(gray_image)
rgb_image来表示 RGB图像,用gray_image来表示灰度图像, 用 bw 来表示黑白(二值)图像。
将灰度图像抖动为二值图像
编写代码:
f=rgb2gray(imread('D:\数字图像处理\第六章学习\cat2.jpg'));
subplot(1,2,1);
imshow(f);
title('原图');
bw=dither(f);
subplot(1,2,2);
imshow(bw);
title('将灰度图像抖动为二值图像');
编写代码:
f=imread('D:\数字图像处理\第六章学习\sun.jpg');
subplot(1,2,1);
imshow(f);
title('原图');
x=dither(f,parula); %colormap中自带的颜色映射-森莺
subplot(1,2,2);
imshow(x,parula);
title('将彩色图像抖动为索引图像');
2.函数grayslice使用阈值对灰度图像进行阈值处理以产生索引图像,有如下语法:
X = grayslice(gray_image, n)
索引图像可以看做用指令 imshow(X,map)通过长度适当的映射得到的。另一种语法是:
X = grayslice(gray_image, v)
其中,v 是矢量(值的范围为[0,1]),用来给gray_image 赋阈值。函数 grayslice 是伪彩色图像处理的基本工具,伪彩色为指定的灰度区域赋予不同的颜色。输入图像的类型可以是 uint8、uint16或double。即使输入图像的类型是uint8或uint16,v的阈值也必须在 [0,1]之间。函数执行了必要的缩放操作。
编写代码:
f=rgb2gray(imread('D:\数字图像处理\第五章学习\building.jpg'));
x=grayslice(f,16);
subplot(1,2,1);
imshow(f);
title('灰度图像');
subplot(1,2,2);
imshow(x,jet(16));
title('索引图像');
代码运行效果如下:
3.函数gray2ind将灰度图像I转换为索引图像,I 为原灰度图像,n 为灰度等级,默认为64,map中对应的颜色值为颜色图gray(n)中的颜色值。采用如下语法:
[X, map] = gray2ind(I ,n)
该函数也可将二值图像BW转换为灰度图像,BW只二值图像,n 为灰度等级,默认值为2,二值图像实际上也是灰度图像,只不过灰度级为2。采用如下语法:
[X,map]=gray2ind(BW,n);
编写代码:
I=imread('D:\数字图像处理\第六章学习\face.jpg');
[Y1,map1]=rgb2ind(I,128); %提取原始图像的颜色映射表
X=rgb2gray(I); %灰度转换
[Y,map]=gray2ind(X,64); %灰度图像转化为索引图像
subplot(1,2,1);imshow(X);title('灰度图像');
subplot(1,2,2);imshow(Y,map);title('索引图像');
4.函数ind2rgb将矩阵 X 和对应的彩色映射map转换成 RGB 格式。X 可以是uint8、uint16 或double类。输出的 RGB图像是大小为 M×N×3 的double类的数组。语法为:
rgb_image = ind2rgb(X, map)
编写代码:
I=imread('D:\数字图像处理\第六章学习\flower2.jpg');
[Y1,map1]=rgb2ind(I,128); %提取原始图像的颜色映射表
X=rgb2gray(I); %灰度转换
[Y,map]=gray2ind(X,64); %灰度图像转化为索引图像
subplot(2,2,1);imshow(I);title('原图像');
subplot(2,2,2);imshow(Y,map);title('灰度图像索引图像');
RGB=ind2rgb(Y,map1); %还原转化为索引图像以后的RGB
subplot(2,2,3);imshow(RGB);title('转换后的索引转RGB图像');
RGB1=ind2rgb(X,map1); %还原转化为索引图像以后的RGB
subplot(2,2,4);imshow(RGB1);title('原灰度矩阵索引转RGB图像');
在一幅 RGB图像中,工具箱直接把颜色描述成 RGB值,或者在索引图像中间接地用 RGB格式来存储彩色映射。 然而,还有其他的彩色空间(又被称作彩色模型),它们在应用中的使用可能比 RGB更方便或更恰当。这些模型是 RGB 模型的变换,包括 NTSC、YCbCr、HSV、CMY、CMYK 和 HSI 彩色空间。工具箱提供了从 RGB 向 NTSC、YCbCr、HSV、CMY 彩色空间转换或转换回来的函数。
NTSC 彩色空间用于模拟电视。这种格式的主要优势是灰度信息和彩色数据是分离开来的, 所以同一信号可以用于彩色电视机和黑白电视机。在 NTSC 格式中,图像数据由三部分组成: 亮度(Y)、色调(I)和饱和度(Q)。YIQ分量都是用线性变换从一幅图像的 RGB分量得到的:
注意: 第一行的各元素之和为 1,而下两行元素的和为 0。这和预想的一样,因为对于一 幅灰度图像,所有的 RGB分量都是相等的;所以对于这样的图像来说,I 和 Q分量应该是 0。
获取图像的亮度,色度,饱和度:
编写代码:
yiq_image=imread('D:\数字图像处理\第六章学习\flower3.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)饱和度');
函数rgb2ntsc可执行前边的变换:
yiq_image = rgb2ntsc(rgb_image)
编写代码:
rgb_image=imread('D:\数字图像处理\第六章学习\baby.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)输出图像');
代码运行效果如下:
其中,输入的 RGB图像可以是uint8、uint16或double类。输出图像是大小为 M×N×3 的 double 类数组。类似的,RGB分量可以利用下面的线性变换从 YIQ分量得到:
工具箱函数ntsc2rgb执行这个变换,语法是:
rgb_image = ntsc2rgb(yiq_image)
编写代码:
rgb_image=imread('D:\数字图像处理\第六章学习\flower3.jpg');
rgb_image = rgb2ntsc(rgb_image);
f = ntsc2rgb(rgb_image);
imshow(yiq_image);
subplot(1, 2, 1), imshow(rgb_image);title('(a)NTSC空间图像');
subplot(1, 2, 2), imshow(f);title('(b)RGB空间图像');
YCbCr 彩色空间广泛用于数字视频。在这种格式中,亮度信息用单独的分量 Y来表示,彩色信息是用两个色差分量 Cb 和 Cr来存储的。分量 Cb 是蓝色分量与参考值的差,分量 Cr是红色分量与参考值的差。工具箱采用的从 RGB转换为 YcbCr 的变换是:
ycbcr_image = rgb2ycbcr(rgb_image)
输入的 RGB 图像可以是 uint8、uint16 或 double类。输出图像和输入图像的类型相同。使用类似的变换可以从 YCbCr 转换回 RGB:
rgb_image = ycbcr2rgb(ycbcr_image)
编写代码:
rgb_image=imread('D:\数字图像处理\第六章学习\Pig2.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 的转换:
数学公式推算:
设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSV 空间中的 (h, s, v) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是饱和度和亮度,计算为:
max=max(R,G,B)
min=min(R,G,B)
if R = max, H = (G-B)/(max-min)
if G = max, H = 2 + (B-R)/(max-min)
if B = max, H = 4 + (R-G)/(max-min)
H = H * 60
if H < 0, H = H + 360
S=(max-min)/max
V=max(R,G,B)
注意:h 的值通常规范化到位于 0 到 360°之间。而 h = 0 用于 max = min 的(就是灰色)时候而不是留下 h 未定义。
从 HSV 到 RGB 的转换
数学公式推算:
类似的,给定在 HSV 中 (h, s, v) 值定义的一个颜色,带有如上的 h,和分别表示饱和度和明度的 s 和 v 变化于 0 到 1 之间,在 RGB 空间中对应的 (r, g, b) 三原色可以计算为:
将 RGB转换为 HSV的 MATLAB函数是rgb2hsv,语法如下:
hsv_image = rgb2hsv(rgb_image)
输入的 RGB图像可以是uint8、uint16或double类,输出图像是double类。将 HSV 转换回 RGB的函数为hsv2rgb,语法如下:
rgb_image = hsv2rgb (hsv_image)
编写代码:
rgb_image=imread('D:\数字图像处理\第六章学习\flower5.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空间图像');
代码运行效果如下:
上面图片只是简单的转换,看不出来HSV图像的优势,下面进行图像颜色调整:
编写代码:
h = input('Adjust hue by: '); % 输入色度调整参数h
s = input('Adjust saturation by: '); % 输入饱和度调整参数s
v = input('Adjust intensity by: '); % 输入明度调整参数v
I = imread('D:\数字图像处理\第六章学习\flower4.jpg'); % 读取源图像并显示
figure(1);
imshow(I);title('(a)原图像');
% HSV颜色空间处理
hsv_image = rgb2hsv(I); % 将rgb颜色空间转换为hsv颜色空间
hue = hsv_image(:,:,1); % 提取色度通道
sat = hsv_image(:,:,2); % 提取饱和度通道
int = hsv_image(:,:,3); % 提取明度通道
hue = hue + 1 / 360 * h; % 对各通道进行处理
sat = sat + 0.01 * s;
int = int + 0.01 * v;
%hue(hue>1)=hue(hue>1) - 1; hue(hue<0)=1 - hue(hue<0);
hue(hue>1)=1; hue(hue<0)=0;
sat(sat>1)=1; sat(sat<0)=0;
int(int>1)=1; int(int<0)=0;
hsv_image(:,:,1) = hue; % 运算后的各通道返回原图
hsv_image(:,:,2) = sat;
hsv_image(:,:,3) = int;
% matlab 无法直接显示hsv和hsi图像,还要先转换为rgb
rgb = hsv2rgb(hsv_image); % 将hsv颜色空间转换为rgb颜色空间,并显示
figure(2);
imshow(rgb);title('(b)HSV颜色空间处理后的图像');
代码运行效果如下:
实验总结:
HSV(Hue Saturation Value)颜色模型是面向用户的。在图像处理中,通常情况下不会直接对RGB图像做处理,这主要是因为RGB与人类的视觉感知相差较远,而HSV就是常用的色彩空间。比如,某些由于光照不同造成的视觉感知不同的场景下,通常用Value这个通道进行计算,通过计算梯度,可以较好的提取物体边缘。再比如某些场景下,前景饱和度较高,背景采用饱和度较低的颜色来衬托前景,这时Saturation这个通道的信息就非常有用了。再比如,在某些室内场景下,风格较为单一,一般一个物体只有一种颜色,这时候Hue这个通道就显得尤为重要了。总之,HSV色彩空间在图像处理领域应用非常广泛,一般通过采用合适的通道就能完成大多数图像预处理工作。从上图(西湖荷花)也可以看出进行了色度,明度,饱和度的调整,图像变得更加鲜艳,接近物体本来的色彩,更符合人的视觉。
CMY(青,深红,黄)通过颜色相减来产生其他颜色的。大多数将颜料堆积于纸上的设备,比如彩色打印机和复印机,都需要 CMY 数据输入,或在内部将 RGB转换为 CMY,近似的转换可用下面的公式实现:
其中,假想所有的颜色值都已经归一化在[0,1]之间。这个公式证明从涂满纯青色的表面反射的光不包含红色(公式中的 C = 1–R )。同样,纯净的紫红色不反射绿色,纯净的黄色不反射蓝色。上述公式还证明,从 1 减去个别的 CMY 值,可以从一组 CMY 值很容易地获得 RGB值。
imcomplement函数可近似地把 RGB模型转换为 CMY模型:
cmy_image = imcompliment(rgb_image)
也可以用这个函数将 CMY图像转换为 RGB图像:
rgb_image = imcompliment(cmy_image)
rgb_image=imread('D:\数字图像处理\第六章学习\flower5.jpg');
hsi_image = imcomplement(rgb_image);
j=imcomplement(hsi_image);
subplot(1, 3, 1), imshow(rgb_image);title('(a)输入的RGB图像');
subplot(1, 3, 2), imshow(hsi_image);title('(b)RGB空间图像转换为CMY图像');
subplot(1, 3, 3), imshow(j);title('(c)CMY图像转换为RGB空间图像');
在理论上,等量的颜料原色,将青色、紫红色和黄色混合会产生黑色。在实践中,将这些颜色混合印刷会生成模糊不清的黑色。所以,为了生成纯正的黑色(打印中主要的颜色),第 4 种颜色——黑色便添加进来了,从而给出提升的 CMYK彩色模型。这种模式的文件大,占用的磁盘和内存大,一般在印刷时使用。
HSI(色彩、饱和度、强度),该模型将强度分量与从一幅彩色图像中承载的彩色信息分开。正如结果那样,HSI 模型是开发基于彩色描述的图像处理算法的理想工具。
1.将颜色从 RGB 转换为 HSI
每个 RGB像素的 H分量可用下面的公式得到:
其中:
饱和度由下面的式子给出:
最后,亮度由下面的式子给出:
将从 H 的公式中得出的所有结果除以 360°,即可将色调归一化在[0,1]之间。 如果给出的 RGB值在[0,1]之间,那么其他的两个 HSI 分量就已经在[0,1]之间了。
下面是惯用的函数:
hsi = rgb2hsi(rgb)
编写代码:
rgb_image=imread('D:\数字图像处理\第六章学习\sun.jpg');
hsi_image = rgb2hsi(rgb_image)
subplot(1, 2, 1), imshow(rgb_image);title('(a)输入的RGB图像');
subplot(1, 2, 2), imshow(hsi_image);title('(b)RGB空间图像转换为HIS图像');
2.将颜色从HSI 转换为RGB
有三个感兴趣的部分,正如早些时候提到的那样,分别对应原色之间相隔 120° 的范围。用 360°乘以 H,这样就将色调的值还原成了原来的范围——[ 0 0 0^0 00,36 0 0 0^0 00]。
RG区域( 0 0 0^0 00≤H≤36 0 0 0^0 00)如果 H在这个区域内,那么 RGB分量由下式给出:
和
GB区域 (12 0 0 0^0 00≤H<24 0 0 0^0 00)如果给出的H值在这个区域内,我们就先从中减去120°:
那么,这时 RGB分量是:
并且
BR 区域(240°≤H≤360°) 最后,如果 H在这个区域内,我们就从中减去 240°:
RGB分量分别是:
其中:
和
编写代码:
rgb_image=imread('D:\数字图像处理\第六章学习\building.jpg');
hsi_image = rgb2hsi(rgb_image);
j = hsi2rgb(hsi_image);
subplot(1, 3, 1), imshow(rgb_image);title('(a)输入的RGB图像');
subplot(1, 3, 2), imshow(hsi_image);title('(b)RGB空间图像转换为HIS图像');
subplot(1, 3, 3), imshow(j);title('(c)HIS图像转换为RGB空间图像');
代码运行效果如下:
上面图片只是简单转换,看不出来HSI图像的优势,下面进行图像颜色调整:
编写代码:
h = input('Adjust hue by: '); % 输入色度调整参数h
s = input('Adjust saturation by: '); % 输入饱和度调整参数s
i = input('Adjust intensity by: '); % 输入强度调整参数i
I = imread('D:\数字图像处理\第六章学习\flower4.jpg'); % 读取源图像并显示
figure(1);
imshow(I);title('(a)原图像');
% HSI颜色空间处理
hsi_image = rgb2hsi(I); % 将rgb颜色空间转换为hsi颜色空间
hue = hsi_image(:,:,1); % 提取色度通道
sat = hsi_image(:,:,2); % 提取饱和度通道
int = hsi_image(:,:,3); % 提取明度通道
hue = hue + 1 / 360 * h; % 对各通道进行处理
sat = sat + 0.01 * s;
int = int + 0.01 * i;
%hue(hue>1)=hue(hue>1) - 1; hue(hue<0)=1 - hue(hue<0);
hue(hue>1)=1; hue(hue<0)=0;
sat(sat>1)=1; sat(sat<0)=0;
int(int>1)=1; int(int<0)=0;
hsi_image(:,:,1) = hue; % 运算后的各通道返回原图
hsi_image(:,:,2) = sat;
hsi_image(:,:,3) = int;
rgb = hsi2rgb(hsi_image); % 将hsi颜色空间转换为rgb颜色空间,并显示
figure(3);
imshow(rgb);title('(b)hsi颜色空间转换后的图像');
实验总结:
由图可以明显看出HSI模型相对于RGB模型更适宜用于彩色图像的增强,完全反映了人感知颜色的基本属性,与人感知颜色的结果一一对应,因此,HSI模型被广泛应用于人的视觉系统感知演的的图像表示和处理系统中。并且在处理彩色图像时,可仅对I分量进行处理,结果不改变原图像中的彩色种类,所以HSI 模型是开发基于彩色描述的图像处理算法的理想工具。
彩色空间以使计算更方便的方法描述了彩色信息,或以对特殊应用更直观或更合适的方法描述彩色。迄今为止讨论的所有空间都与设备相关。下面集中讨论独立于设备的彩色空间。
通常,在辨别不同颜色时使用的特征是亮度、色调和饱和度。亮度具体表达无色的强度的概念,色调是在光波混合中与主要波长相关的属性,色调描述了观察者感知的主要彩色,饱和度指的是相对纯度或与色调相混合的白光数量。
色调和饱和度合起来称为颜色,因此,彩色是由颜色和亮度表现的特性。为形成一种特殊颜色而需要的红、绿、蓝颜色叫做三色值,分别用 X、Y、Z 来表示。颜色是由颜色自身的三色系数来指定的,定义为:
并且:
其中,x、y 和 z 分别表示红、绿、蓝分量。在可见光谱中,光的任何波长均可产生与那个波长相对应的三色值。以 x 和 y 为参数的函数显示人能感觉到的颜色范围的图被称为色度图。在色度图中,连接任意两个点的直线段说明了所有不同的颜色变化,可以由相加的两种颜色混合得到。由任何三个固定颜色处的顶点形成的三角形不能包括图中的全部颜色区域,所以任何颜色都可从确定的三原色产生是误解。
RGB彩色模型依赖于设备。这意味着对于给定的一组 R、 G、B 值,不存在单一、明确的彩色解释。另外,图像文件常常不包含获取图像时所用设备的彩色特性信息。就像结果那样,相同的图像文件可能(经常就是)在不同的计算机系统中看上去明显不同。
为解决这个问题,微软和惠普提出了新的默认彩色空间标准,称作 sRGB。sRGB 彩色空间被设计为与计算机的CRT监视器标准特性相一致,并且与PC机在家庭和办公室观察环境相一致。 sRGB彩色空间独立于设备。因此,sRGB颜色值很容易被改变为另一个独立于设备的彩色空间。
sRGB 标准已变成计算机界广泛接受的标准,特别是面向消费者的设备。数字摄像机、扫 描仪、计算机显示器和打印机等,都例行地被设计为假定图像的 RGB值与 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);
代码运行效果如下:
图为 基于 Lab*彩色空间的在感觉上一致的标尺 。
每一个设备正好有两个与之关联的变换,而不管在系统中可能存在的其他设备的数量。其中的一个变换把设备彩色转换为标准,独立于设备的彩色空间叫做剖面连接空间(Profile Connection Space, PCS)。另一个变换是第一个变换的反变换,用来把 PCS彩色转换回设备彩色(PCS不是 XYZ, 就是 Lab*)。这两个变换合起来构成设备的 ICC 彩色剖面。
ICC 的主要目的之一是创建标准化的、维护和提升 ICC彩色剖面的标准。图像处理工具箱 函数iccread读取剖面文件,语法是:
p = iccread(filename)
输出p是包含文件头信息和数字参数,以及计算设备和PCS间彩色空间转换所必需的表格。 使用 ICC 剖面转换彩色是通过使用makecform和applycform实现的。 makecform的语法是:
cform = makecform('icc', src_profile, dest_profile)
其中,src_profile是源设备剖面的文件名,dest_profile是目的设备剖面的文件名。
ICC 彩色剖面的软实验
编写代码:
f=imread('D:\数字图像处理\第六章学习\girl.png');
fp = padarray(f, [40 40], 255, 'both');
fp = padarray(fp, [4 4], 230, 'both');
p_srgb = iccread('E:\Code\sRGB.icm'); %描述sRGB彩色空间的剖面
p_snap = iccread('E:\Code\SNAP2007.icc'); %新闻纸剖面
cform1 = makecform('icc', p_srgb, p_snap);
fp_newsprint = applycform(fp, cform1);
cform2 = makecform('icc', p_snap, p_srgb, 'SourceRenderingIntent', 'AbsoluteColorimetric', 'DestRenderingIntent', 'AbsoluteColorimetric');
fp_proof = applycform(fp_newsprint, cform2); %指定渲染意图
subplot(1, 2, 1), imshow(fp);title('(a)具有白边的原始图像');
subplot(1, 2, 2), imshow(fp_proof);title('(b)当在新闻纸上打印时对图像外观的模拟 ');
实验总结:
实验中首先用环绕图像的拥有粗白边和细灰边的边界对图像做预处理。这些边界将使得更容易观察对新闻用纸“白”度的模拟,图(a)显示了填充的图像,然后读进两个剖面并用它们把虹膜图像从 sRGB转换为新闻纸颜色,最后用绝对色度的渲染意图创建cform结构,以便为了显示而将之转换回 sRGB,图 (b)显示了结果。这幅图像本身仅是在计算机监视器上看到的实际结果的近似,因为印刷书籍的彩色全域与监视器的彩色全域不同。
彩色图像处理细分成 3 个主要领域:
第 1 类处理每个彩色平面的像素,这类处理严格地以像素值为基础,而不是它们的空间坐标,类似于灰度变换处理。第 2 类处理涉及各个彩色平面的空间(邻域)滤波, 类似于空间滤波。第 3 类处理涉及以同时处理彩色图像的所有分量为基础的处理技术。因为全彩图像至少有三个分量,彩色像素可以用向量来处理。
令 c 代表 RGB彩色空间中的任意向量:
这个公式指出,c 分量是一副彩色图像在某个点上的 RGB分量。考虑彩色分量是坐标的函数这样的事实,用下边的符号表示:
对于一幅大小为 M×N 的图像,有 MN 个这样的向量 c(x,y),其中,x=0,1,2…,M–1 且 y=0,1,2…,N–1。
在某些情况下,无论彩色图像每次处理一个平面,还是作为向量处理,都会得到相等的结果。然而,不会总是这样的情况。为了使两种方法都相同, 两个条件必须满足:首先,处理必须对向量和标量都可用。其次,针对向量的每个分量的操作必须与其他分量无关。
这里描述的是单一彩色模型情况下的技术,以处理彩色图像的彩色分量或单色图像的亮度分量为基础。对于彩色图像,限定如下形式的变换:
si = Ti(ri) i = 1,2,…,n
这里,ri 和 si 是输入和输出图像的彩色分量,n 是 ri是彩色空间的维数(或是彩色分量的数量),并且 Ti 是全彩色变换(或叫映射)函数。如果输入图像是单色的,公式将如下所示:
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('D:\数字图像处理\第六章学习\cat5.jpg');
g=ice('image',f);
编写代码:
f=imread('D:\数字图像处理\第六章学习\cat5.jpg');
g=ice('image',f,'space','CMY');%修改CMY彩色空间
编写代码:
f=imread('D:\数字图像处理\第六章学习\cat5.jpg');
g=ice('image',f,'space','hsi');
代码运行效果如下:
‘space’是被修改的分量彩色空间。可能的值是’rgb’、‘cmy’、‘hsi’、‘hsv’、‘ntsc’(或’yiq’)和’ycbcr’,默认值是’rgb’ 。