VC编程实现色彩空间RGB与XYZ相互转换
来源:互联网 发布:淘宝如何搜高仿手表 编辑:程序博客网 时间:2024/05/22 06:14
使 用过PhotoShop软件的朋友对色彩空间应该不会感到陌生,在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:
其中,gamma函数是r、g、b的gamma变换,gamma 2.2函数如下:
其中:
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
;
}
2.色彩空间XYZ转rgb(r:0-255,g:0-255,b:0-255)
2.1. 理论公式
其中r_gamma为R、G、B的gamma逆变换,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编程实现其它色彩空间之间的相互转换。
0 0
- VC编程实现色彩空间RGB与XYZ相互转换
- VC编程实现色彩空间RGB与XYZ相互转换
- VC编程实现色彩空间RGB与XYZ相互转换
- VC编程实现色彩空间XYZ与LAB相互转换
- VC编程实现色彩空间XYZ与LAB相互转换
- VC编程实现色彩空间XYZ与LAB相互转换-----改正版
- VC编程实现色彩空间RGB与HSB(HSV)相互转换
- VC编程实现色彩空间RGB与HSB(HSV)相互转换
- RGB与Lab色彩空间相互转换c++代码
- rgb色彩空间转换实现汇总
- Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换
- RGB与HSI空间相互转换
- PHP实现RGB,HSL,HSV色彩空间转换
- RGB和HSL色彩的相互转换
- RGB和HSL色彩的相互转换
- HSV颜色空间 与 RGB 颜色空间的相互转换
- 基于OpenCV的RGB和HSV色彩空间相互转换C++程序
- 基于OpenCV的RGB和HSV色彩空间相互转换C++程序
- 2015中国高校毕业生薪酬排行榜
- Python之《机器学习系统设计》第十章
- Java异常概述
- windows环境下php和Php扩展编译,扩展dll文件编译
- iOS消息推送机制的实现
- VC编程实现色彩空间RGB与XYZ相互转换
- 【iOS解决方案】得到每周的星期一开始和星期天结束的日期
- R语言画图中输出上或者下标的方法
- ASP.NET中 Application_Start 和 Application_End 的触发时机
- iOS著名开源项目(转)
- liunx下安装rar
- C++类对象的内存模型
- Matlab读取文件夹下的图像文件名
- JAVA类的初始化执行顺序探讨