2013-2014学年第二学期图像通信课程设计报告设计题目:图像的各种颜色空间转换
摘要
所谓三基色原理,是指自然界常见的各种颜色光都可由红、绿、蓝三种色光按照不同比例相配而成。同样,绝大多数颜色也可以分解成红、绿、蓝三种色光。这就是色度学中的最基本的原理。
彩色模型的用途是在某些标准下用通常课接受的方式简化彩色规范。常常涉及到用几种不同的彩色空间表示图形和图像的颜色,以应对不同的场合和应用。因此,在数字图像的生成、存储、处理及显示时,对应不同的彩色空间,需要作不同的处理和转换。现在主要的彩色模型有RGB模型、CMY模型、YUV模型、YIQ 模型、YcbCr模型、HSI模型等。本设计主要使用MATLAB编程的方法,实现RGB与其余四种模型之间的互化。即使用不同的色彩模型表示同一图形或图像。通过转换实现色彩模型的变换之后,可以让同一幅图像以各种模式在全球范围内流通,所以本设计具有一定的实际意义。一般的图像原始都为RGB—加色混合色彩模型,它与剩下的几个色彩模型之间存在着函数对应关系,通过矩阵运算改变模型的参数就可以实现不同色彩模型之间的相互转换。例如CMY—减色混合色彩模型,就是利用青色、深红色、黄色这三种彩色按照一定比例来产生想要的
彩色,CMY是RGB三基色的补色,它与RGB存在如下关系:C
M
Y
=
1
1
1
-
R
G
B
,
使用MATLAB编程时,读入三个通道的数值,按照对应关系进行矩阵变换就可以转换成CMY色彩模型。其他色彩模型转换原理与此相似。
关键词:MATLAB,RGB、YUV、YIQ、YCbCr、HSI、色彩模型
一、设计任务、目的和要求
任务:实现RGB模型、CMY模型、YUV模型、YIQ模型、YcbCr模型、HSI 模型这几种不同色彩模型之间的相互转换
要求:最终结果用图像显示
二、总体方案设计
系统运行环境:WINDOWS 7操作系统
编程软件平台:MATLAB2012b
编码算法原理:将原图的三基色数值读入,根据不同色彩模型之间的相互关系,通过矩阵运算改变不同的亮度和色度等信息来实现色彩模型的转换,然后将变换后的图像导出
流程图:
三、设计实现
1、RGB模型和CMY模型的互化变换公式:
C M Y =
1
1
1
-
R
G
B
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(133),imshow(rgb1),title('CMY转RGB'); %数值分析反变换后和原图的差别
x=rgb1-Image;
disp(x);
2、RGB模型和YUV色彩模型的互化
变换公式:
Y U V =
100
.0
515
.0
615
.0
436
.0
289
.0
147
.0
114
.0
587
.0
299
.0
-
-
-
-
R
G
B
clear all;
close all;
clc;%清除内存空间信息,以便程序运行
img=imread('1.jpg'); %读取原始图形
img=im2double(img);%将图像映射到[0,1]区间;
[m,n,dim]=size(img);%获得原图像长、宽、维数的数据
subplot(131),imshow(img),title('原图');
%%图像的RGB
R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);
%%RGB2YUV
Y=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);
end
end
%使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');
%%YUV2RGB
matrix=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);
end
end
img1(:,:,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(133),imshow(img1),title('反变换');
%比较
x=img-img;
disp(x);
3、RGB模型和YIQ色彩模型的互化
变换公式:
Y
I Q =
311
.0
523
.0
212
.0
321
.0
275
.0
596
.0
114
.0
587
.0
299
.0
-
-
R
G
B
clear all;
close all;
clc;
img=imread('1.jpg');%读取矩阵
img=im2double(img);%将图像映射到[0,1]区间。[m,n,dim]=size(img);%读取图像的长宽等信息subplot(131),imshow(img),title('原图');
%%图像的RGB
R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);
%%RGB2YIQ
Y=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);
end
end
YUV = cat(3, Y, I, Q);
subplot(132),imshow(YUV),title('YUV');%显示变换后的图形
%YUV2RGB
matrix=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);
end
end
%将R、G、B三个分量赋予到img矩阵中
img(:,:,1)=R;
img(:,:,2)=G;
img(:,:,3)=B;
subplot(133),imshow(img),title('反变换');%得到反变换的图形
%将反变换图形与原始图形进行比较
x=img1-img;
disp(x);
4、RGB色彩模型和YCbCr色彩模型的互化变换公式:
Y Cb Cr =
0813
.0
4187
.0
500
.0
500
.0
3313
.0
1687
.0
114
.0
587
.0
299
.0
-
-
-
-
R
G
B
+
128
128
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= θB≤G
360-θB>G
;
其中,θ= arccos 0.5?[R?G+(R?B)]
[R?G+(R?B)(G?B)1/2]
[min(R,G,B)]
S=1-3
(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三个分量的初始矩阵,并赋为全0
R=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 色彩模型的互化
原
图RGB 转
CMY CMY 转RGB
X 矩阵为全0
3、RGB 模型和YIQ 色彩模型的互化
X 矩阵不全为0,说明有误差。
4、RGB 色彩模型和YCbCr 色彩模型的互化
原
图
YUV 反变
换
原
图
YIQ 反变换
比较自编函数和使用MATLAB 底层函数的结果,发现结果基本一致。
5、RGB 色彩模型和HSI 色彩模型的互化
得到图形,基本符合要求
五 、结论与心得
结论:通过MATLAB 编程最终实现了几种不同色彩模型之间的转换,取得了预期设计效果
心得:在编程过程中也遇到了一些问题,例如对于矩阵的变换和图形的读入以及显示等,刚开始都不知道如何进行编程,在查阅了一些资料和一些别人编的类似的程序进行参考后,明白了一些基本操作原理,通过联系课上所学知识,将主程序的思路理清了。在不断的调试中,又出现了一系列问题,通过和队友讨论都一一解决了,感觉对MATLAB 的掌握又多了一些新的认识。
在查阅资料方面,我们充分利用了图书馆资源和一些网络资源,从原理出发,
以原
图自编之rgb 到
YCBCR matlab 自带转换函
数反变
换
原始图
形rgb 转
hsi hsi 转rgb
实践收尾,最终实现了预定目标,收获颇多,尤其在查找资料方面相信在以后的学习中都将是一个很大的进步。
参考文献:
[1].王汇源.《数字图像通信原理与技术》.国防工业出版社.2000年
[2].何小海《图像通信》西安电子科技大学出版社
[3] 朱秀昌.《图像通信应用系统》.北京邮电大学出版社. 2003年