常见色彩模型的相互转换基于某MATLAB.doc
word图像通信课程设计报告设计题目:图像的各种颜色空间转换摘 要所谓三基色原理,是指自然界常见的各种颜色光都可由红、绿、蓝三种色光按照不同比例相配而成。同样,绝大多数颜色也可以分解成红、绿、蓝三种色光。这就是色度学中的最根本的原理。彩色模型的用途是在某些标准下用通常课承受的方式简化彩色规。常常涉与到用几种不同的彩色空间表示图形和图像的颜色,以应对不同的场合和应用。因此,在数字图像的生成、存储、处理与显示时,对应不同的彩色空间,需要作不同的处理和转换。现在主要的彩色模型有RGB模型、CMY模型、YUV模型、YIQ模型、YcbCr模型、HSI模型等。本设计主要使用MATLAB编程的方法,实现RGB与其余四种模型之间的互化。即使用不同的色彩模型表示同一图形或图像。通过转换实现色彩模型的变换之后,可以让同一幅图像以各种模式在全球围流通,所以本设计具有一定的实际意义。一般的图像原始都为RGB加色混合色彩模型,它与剩下的几个色彩模型之间存在着函数对应关系,通过矩阵运算改变模型的参数就可以实现不同色彩模型之间的相互转换。例如CMY减色混合色彩模型,就是利用青色、深红色、黄色这三种彩色按照一定比例来产生想要的彩色,CMY是RGB三基色的补色,它与RGB存在如下关系:=-,使用MATLAB编程时,读入三个通道的数值,按照对应关系进展矩阵变换就可以转换成CMY色彩模型。其他色彩模型转换原理与此相似。关键词:MATLAB,RGB、YUV、YIQ、YCbCr、HSI、色彩模型14 / 14一、设计任务、目的和要求任务:实现RGB模型、CMY模型、YUV模型、YIQ模型、YcbCr模型、HSI模型这几种不同色彩模型之间的相互转换要求:最终结果用图像显示二、总体方案设计系统运行环境:WINDOWS 7操作系统编程软件平台:MATLAB2012b编码算法原理:将原图的三基色数值读入,根据不同色彩模型之间的相互关系,通过矩阵运算改变不同的亮度和色度等信息来实现色彩模型的转换,然后将变换后的图像导出流程图:开始获取R、G、B三通道分量进展矩阵变换得到图形进展反变换得到反变换图形将所得图形与原始图形比拟完毕三、设计实现1、RGB模型和CMY模型的互化变换公式:=-clc;clear;close;X=imread('1.jpg');%读取原始图形Image = im2double(X); %归一化处理subplot(131),imshow(Image),title('原图');%读取图像的RGB分量r = Image(:, :, 1); g = Image(:, :, 2); b = Image(:, :, 3);%进展RGB到CMY的变换C=1-r;M=1-g;Y=1-b;CMY = cat(3, C, M, Y); subplot(132),imshow(CMY),title('RGB转CMY');%进展CMY到RGB的反变换r1=1-C;g1=1-M;b1=1-Y;rgb1 = cat(3, r1, g1, b1); subplot(),imshow(rgb1),title('CMY转RGB');%数值分析反变换后和原图的差异x=rgb1-Image;disp(x);2、RGB模型和YUV色彩模型的互化变换公式:=clear all;close all;clc;%去除存空间信息,以便程序运行img=imread('1.jpg');%读取原始图形img=im2double(img);%将图像映射到0,1区间;m,n,dim=size(img);%获得原图像长、宽、维数的数据subplot(131),imshow(img),title('原图');%图像的RGBR=img(:,:,1);G=img(:,:,2);B=img(:,:,3);%RGB2YUVY=zeros(m,n); %亮度I=zeros(m,n); %彩度V=zeros(m,n); %浓度%定义乘法矩阵matrix=0.299 0.587 0.114; -0.147 -0.298 0.436; 0.615 -0.515 -0.100; %用for循环实现图像中每一个点的矩阵变换,即实现模型变换 for i=1:m for j=1:n tmp=matrix*R(i,j) G(i,j) B(i,j)' Y(i,j)=tmp(1); U(i,j)=tmp(2); V(i,j)=tmp(3); endend%使Y、U、V分量全部在0,255区间Y(Y > 255) = 255;Y(Y < 0) = 0;UU > 255) = 255;U (U < 0) = 0;V(V > 255) = 255;V (V < 0) = 0;YUV = cat(3, Y, U, V);subplot(132),imshow(YUV),title('YUV');%YUV2RGBmatrix=inv(matrix);%使用inv函数,求反变换矩阵for i=1:m for j=1:n tmp=matrix*Y(i,j) U(i,j) V(i,j)' R(i,j)=tmp(1); G(i,j)=tmp(2); B(i,j)=tmp(3); endendimg1(:,:,1)=R;img1(:,:,2)=G;img1(:,:,3)=B;%将R、G、B分量全部化为0,255区间R(R > 255) = 255;R(R < 0) = 0;G(G > 255) = 255;G(G < 0) = 0;B(B > 255) = 255;B(B < 0) = 0;subplot(),imshow(img1),title('反变换');%比拟x=img-img;disp(x);3、RGB模型和YIQ色彩模型的互化变换公式:=clear all;close all;clc;img=imread('1.jpg');%读取矩阵img=im2double(img);%将图像映射到0,1区间。m,n,dim=size(img);%读取图像的长宽等信息subplot(131),imshow(img),title('原图');%图像的RGBR=img(:,:,1);G=img(:,:,2);B=img(:,:,3);%RGB2YIQY=zeros(m,n); %亮度I=zeros(m,n); %彩度Q=zeros(m,n); %浓度matrix=0.299 0.587 0.114; 0.596 -0.275 -0.321; 0.212 -0.523 0.311; %用for循环实现图像中每一个点的矩阵变换,即实现模型变换 for i=1:m for j=1:n tmp=matrix*R(i,j) G(i,j) B(i,j)' Y(i,j)=tmp(1); I(i,j)=tmp(2); Q(i,j)=tmp(3); endendYUV = cat(3, Y, I, Q);subplot(132),imshow(YUV),title('YUV');%显示变换后的图形%YUV2RGBmatrix=inv(matrix);for i=1:m for j=1:n tmp=matrix*Y(i,j) I(i,j) Q(i,j)' R(i,j)=tmp(1); G(i,j)=tmp(2); B(i,j)=tmp(3); endend%将R、G、B三个分量赋予到img矩阵中img(:,:,1)=R;img(:,:,2)=G;img(:,:,3)=B;subplot(),imshow(img),title('反变换');%得到反变换的图形%将反变换图形与原始图形进展比拟x=img1-img;disp(x);4、RGB色彩模型和YCbCr色彩模型的互化变换公式:=+clc;clear;close;src=imread('1.jpg');subplot(141),imshow(src),title('原图');%得到以double形式存在的R、G、B分量r = double(src(:,:,1);g = double(src(:,:,2);b = double(src(:,:,3);% convert.y = floor(0.299*r + 0.587*g + 0.114*b+0); %floor(pi)=3; floor(3.5)=3; floor(-3.2)=-4;向负方向舍入Cb = floor(-0.1687*r - 0.3313*g + 0.5*b+128);Cr = floor(0.5*r - 0.4187*g - 0.0813*b+128);%对所得的各个分量进展调整,使之介于0,255区间y(y > 255) = 255;y(y < 0) = 0;Cb(Cb > 255) = 255;Cb(Cb < 0) = 0;Cr(Cr > 255) = 255;Cr(Cr < 0) = 0;%将Y、Cb、Cr分量化为8位无符号整数并存放在dst矩阵中dst(:,:,1) = uint8(y);dst(:,:,2) = uint8(Cb);dst(:,:,3) = uint8(Cr);subplot(142),imshow(dst),title('自编之rgb到YCBCR');YCBCR = rgb2ycbcr(src);subplot(143),imshow(YCBCR),title('matlab自带转换函数');%查找资料,得到反变换矩阵,并借此进展反变换r1=1.0*y + 0 +1.402*(Cr-128); g1=1.0*y - 0.34413*(Cb-128)-0.71414*(Cr-128); b1=1.0*y + 1.772*(Cb-128)+0;%对所得的各个分量进展调整,使之介于0,255区间r1(r1 > 255) = 255;r1(r1 < 0) = 0;g1(g1 > 255) = 255;g1(g1 < 0) = 0;b1(b1 > 255) = 255;b1(b1 < 0) = 0;%将r1、g1、b1分量化为8位无符号整数并存放在dst2矩阵中dst2(:,:,1) = uint8(r1);dst2(:,:,2) = uint8(g1);dst2(:,:,3) = uint8(b1);subplot(144),imshow(dst2),title('反变换');%显示反变换图形5、RGB色彩模型和HSI色彩模型的互化变换公式:H= BG 360- B>G其中,=arccos ;S=1-min(R,G,B)I=1/3*(R+G+B);clear;clc;close;x=imread('1.jpg');rgb=im2double(x);r=rgb(:,:,1);g=rgb(:,:,2);b=rgb(:,:,3);%提取彩色图像R、G、B三个色彩通道的分量。%构建rgb到his模型的转换公式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);%将色调H(Hue)、饱和度S(Saturation)、强度I(Intensity)分量合并成hsi色彩空间矩阵subplot(121),imshow(hsi),title('rgb转hsi');%显示结果图像H=hsi(:,:,1)*2*pi;S=hsi(:,:,2);I=hsi(:,:,3);%得到R、G、B三个分量的初始矩阵,并赋为全0R=zeros(size(hsi,1),size(hsi,2);G=zeros(size(hsi,1),size(hsi,2);B=zeros(size(hsi,1),size(hsi,2);%当H分量在0到2/3pi之间时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);%当H分量在2/3pi到4/3pi之间时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);%当H分量在4/3pi到2pi之间时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);rgb1=cat(3,R,G,B);%合并矩阵得到结果subplot(122),imshow(rgb1),title('hsi转rgb');四、测试和调试 1、RGB模型和CMY模型的互化x=rgb1-Image;,矩阵不为全0,所以有一定误差出现。2、RGB模型和YUV色彩模型的互化X矩阵为全03、RGB模型和YIQ色彩模型的互化X矩阵不全为0,说明有误差。4、RGB色彩模型和YCbCr色彩模型的互化比拟自编函数和使用MATLAB底层函数的结果,发现结果根本一致。5、RGB色彩模型和HSI色彩模型的互化得到图形,根本符合要求五、结论与心得结论:通过MATLAB编程最终实现了几种不同色彩模型之间的转换,取得了预期设计效果心得:在编程过程中也遇到了一些问题,例如对于矩阵的变换和图形的读入以与显示等,刚开始都不知道如何进展编程,在查阅了一些资料和一些别人编的类似的程序进展参考后,明白了一些根本操作原理,通过联系课上所学知识,将主程序的思路理清了。在不断的调试中,又出现了一系列问题,通过和队友讨论都一一解决了,感觉对MATLAB的掌握又多了一些新的认识。在查阅资料方面,我们充分利用了图书馆资源和一些网络资源,从原理出发,以实践收尾,最终实现了预定目标,收获颇多,尤其在查找资料方面相信在以后的学习中都将是一个很大的进步。参考文献:1.2.何小海图像通信电子科技大学 3 朱秀昌.图像通信应用系统.邮电大学. 2003年