RGB转XYZ色彩空间开发及matlab实验笔记整理


在PhotoShop中经常使用有RGB(红色、绿色、蓝色)、CMYK(青色、洋红、黄 色、黑色)、HSB(色相、饱和度、亮度)和Lab4中色彩空间。本文将介绍其具体的算法,并通过VC编程实现,本系列程序均在Win7+VS2008测试通过,并且和PS3的结果一致。

由于公式比较繁琐,代码比较复杂,所以关于VC编程实现色彩空间的转换将分成多篇文章介绍。RGB色彩空间与LAB色彩空间之间的转换通常需要XYZ色彩空间过渡完成,本文主要介绍RGB与XYZ色彩空间之间的相互转换原理和具体实现,首先介绍rgb色彩空间转换成XYZ色彩空间的理论计算公式和VC源代码,然后介绍XYZ转换成rgb色彩空间的计算公式和源代码。

1.色彩空间rgb转XYZ(r:0-255,g:0-255,b:0-255)

1.1. 理论公式

首先将rgb转换成RGB:

RGB转XYZ转换公式

其中,gamma函数是r、g、b的gamma变换,gamma 2.2函数如下:

RGB转XYZ使用的gamma变换函数

RGB转XYZ的变换矩阵

其中:

RGB转XYZ的变换矩阵

1.2. VC实例代码:

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
static double M[]={    0.436052025,    0.385081593,    0.143087414,
                     0.222491598,    0.716886060,    0.060621486,
                     0.013929122,    0.097097002,    0.714185470};
static CMatrix matrixM(3,3,M);
// M矩阵的逆矩阵
static CMatrix inv_matrixM=matrixM.inv();
// gamma 2.2
// Gamma校正函数
double CColorUtility::gamma( double x){
     if (x>0.04045)
         x= pow ((x+0.055)/1.055,2.4);
     else
         x=x/12.92;
     return x;
}
// CIE RGB转XYZ
bool CColorUtility::_cie_rgb2xyz( const int rgb[3], double (&xyz)[3]){
     double RGB[]={rgb[0]/255.0,rgb[1]/255.0,rgb[2]/255.0};
 
     RGB[0]=gamma(RGB[0]);
     RGB[1]=gamma(RGB[1]);
     RGB[2]=gamma(RGB[2]);
 
     xyz[0]=100.0*(matrixM[1][1]*RGB[0]+matrixM[1][2]*RGB[1]+matrixM[1][3]*RGB[2]);
     xyz[1]=100.0*(matrixM[2][1]*RGB[0]+matrixM[2][2]*RGB[1]+matrixM[2][3]*RGB[2]);
     xyz[2]=100.0*(matrixM[3][1]*RGB[0]+matrixM[3][2]*RGB[1]+matrixM[3][3]*RGB[2]);
 
     return true ;
}
到此,便使用VC编程实现了色彩空间RGB到XYZ的转换,下面我们来看看其逆变换,即XYZ转RGB的具体理论和实现:

2.色彩空间XYZ转rgb(r:0-255,g:0-255,b:0-255)

2.1. 理论公式

XYZ转rgb公式

XYZ转rgb公式

RGB转rgb公式

其中r_gamma为R、G、B的gamma逆变换,gamma 2.2的逆变换函数如下:

RGB转rgb的gamma 2.2逆变换

2.2. VC实例源码

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// gamma 2.2
// Gamma校正函数的反函数
double CColorUtility::r_gamma( double x){
     if (x> pow ((0.04045+0.055)/1.055,2.4))
         x=1.055* pow (x,1.0/2.4)-0.055;
     else
         x=12.92*x;    
     return x;
}
//XYZ转lab
bool CColorUtility::_cie_xyz2rgb( const double xyz[3], int (&rgb)[3]){
     double XYZ[]={0.0,0.0,0.0};
 
     XYZ[0]=(inv_matrixM[1][1]*xyz[0]+inv_matrixM[1][2]*xyz[1]+inv_matrixM[1][3]*xyz[2])/100.0;
     XYZ[1]=(inv_matrixM[2][1]*xyz[0]+inv_matrixM[2][2]*xyz[1]+inv_matrixM[2][3]*xyz[2])/100.0;
     XYZ[2]=(inv_matrixM[3][1]*xyz[0]+inv_matrixM[3][2]*xyz[1]+inv_matrixM[3][3]*xyz[2])/100.0;
 
     XYZ[0]=r_gamma(XYZ[0])>0?r_gamma(XYZ[0])*255:0;
     XYZ[1]=r_gamma(XYZ[1])>0?r_gamma(XYZ[1])*255:0;
     XYZ[2]=r_gamma(XYZ[2])>0?r_gamma(XYZ[2])*255:0;
 
     rgb[0]=XYZ[0]<255? int (XYZ[0]+0.5):255;
     rgb[1]=XYZ[1]<255? int (XYZ[1]+0.5):255;
     rgb[2]=XYZ[2]<255? int (XYZ[2]+0.5):255;
 
     return true ;
}

其中,inv_matrixM为M矩阵的逆矩阵。到此,便使用VC编程实现了色彩空间XYZ到rgb的转换,本文介绍了XYZ色彩空间与rgb色彩空间的正变换和逆变换,为方便读者理解,给出了具体的计算公式和实际源码。VC图形图像处理编程博大精深,有任何建议欢迎留言讨论,后续文章我们将继续介绍VC编程实现其它色彩空间之间的相互转换。


RGB彩色工业标准到CIEXYZ空间转换示例:

[html]   view plain  copy
  1. clc;  
  2. close all;  
  3. clear all;  
  4. rgb = imread('lena.bmp');  
  5. subplot(2,3,1),imshow(rgb,'InitialMagnification','fit');title('原图像');  
  6. rgb =double(rgb);%双精度化(0-255)  
  7. x = 0.607*rgb(:,:,1)+0.174*rgb(:,:,2)+0.201*rgb(:,:,3);  
  8. x = mat2gray(x);%把矩阵转化为灰度图像  
  9. y = 0.299*rgb(:,:,1)+0.587*rgb(:,:,2)+0.114*rgb(:,:,3);  
  10. y = mat2gray(y);  
  11. z = 0.066*rgb(:,:,2)+0.117*rgb(:,:,3);  
  12. z = mat2gray(z);  
  13. xyz = cat(3,x,y,z);%把x,y,z连在一起  
  14. subplot(2,3,3),imshow(xyz);title('XYZ图像');  
  15. subplot(2,3,4),imshow(x);title('X图像');  
  16. subplot(2,3,5),imshow(y);title('Y图像');  
  17. subplot(2,3,6),imshow(z);title('Z图像');  
运行结果:


注:Matlab中没有lena.bmp文件,可以从网上下载,此外imshow(rgb,'notruesize')在Matlab2012中不在支持应改为 imshow(rgb,'InitialMagnification','fit')。








  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值