数字图像处理第六章 | 您所在的位置:网站首页 › 打印机打印的彩色为什么颜色不正 › 数字图像处理第六章 |
数字图像处理第六章
数字图像处理---彩色图像处理(一) 在 MATLAB 中彩色图像的表示1.1 RGB图像1.2 索引图像1.3 处理 RGB图像和索引
(二)彩色空间之间的转换2.1 NTSC彩色空间2.2 YCbCr 彩色空间2.3 HSV彩色空间2.4 CMY和 CMYK2.5 HSI彩色空间2.6 独立于设备的彩色空间2.6.1 背景2.6.2 sRGB 彩色空间2.6.3 CIE 和 sRGB 彩色空间之间的转换2.6.4 ICC彩色剖面
(三)彩色图像处理的基础知识(四)彩色变换
数字图像处理—彩色图像处理
(一) 在 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); 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(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色)');代码运行效果如下: 其中,[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]); %黄色代码运行效果如下: 编写代码: 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矩阵代码运行效果如下: 实验总结: 索引模式和灰度模式比较类似,它的每个像素点也可以有256种颜色容量,但它可以负载彩色。索引模式的图像就像是一块块由彩色的小瓷砖所拼成的,由于它最多只能有256种彩色,所以它所形成的文件相对其它彩色要小得多。索引模式的另一个好处是它所形成的每一个颜色都有其独立的索引标识。当这种图像在网上发布时,只要根据其索引标识将图像重新识别,它的颜色就完全还原了。索引模式主要用于网络上的图片传输和一些对图像像素、大小等有严格要求的地方。 1.3 处理 RGB图像和索引下表列出了在 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('索引图像');代码运行效果如下: 该函数也可将二值图像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 彩色空间转换或转换回来的函数。 2.1 NTSC彩色空间NTSC 彩色空间用于模拟电视。这种格式的主要优势是灰度信息和彩色数据是分离开来的, 所以同一信号可以用于彩色电视机和黑白电视机。在 NTSC 格式中,图像数据由三部分组成: 亮度(Y)、色调(I)和饱和度(Q)。YIQ分量都是用线性变换从一幅图像的 RGB分量得到的: 获取图像的亮度,色度,饱和度: 编写代码: 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_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 的变换是:
输入的 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空间图像');代码运行情况如下: 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图像可以是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空间图像');代码运行效果如下:
编写代码: 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 |
CopyRight 2018-2019 实验室设备网 版权所有 |