色彩空间转换公式汇编

原创 2004年07月14日 14:05:00

来源:http://www.easyrgb.com/math.html

//************************************************************************
XYZ —> RGB

ref_X =  95.047        //Observer = 2°, Illuminant = D65
ref_Y = 100.000
ref_Z = 108.883

var_X = X / 100        //X = From 0 to ref_X
var_Y = Y / 100        //Y = From 0 to ref_Y
var_Z = Z / 100        //Z = From 0 to ref_Y

var_R = var_X *  3.2406 + var_Y * -1.5372 + var_Z * -0.4986
var_G = var_X * -0.9689 + var_Y *  1.8758 + var_Z *  0.0415
var_B = var_X *  0.0557 + var_Y * -0.2040 + var_Z *  1.0570

if ( var_R > 0.0031308 ) var_R = 1.055 * ( var_R ^ ( 1 / 2.4 ) ) - 0.055
else                     var_R = 12.92 * var_R
if ( var_G > 0.0031308 ) var_G = 1.055 * ( var_G ^ ( 1 / 2.4 ) ) - 0.055
else                     var_G = 12.92 * var_G
if ( var_B > 0.0031308 ) var_B = 1.055 * ( var_B ^ ( 1 / 2.4 ) ) - 0.055
else                     var_B = 12.92 * var_B

R = var_R * 255
G = var_G * 255
B = var_B * 255
//************************************************************************
RGB —> XYZ

var_R = ( R / 255 )        //R = From 0 to 255
var_G = ( G / 255 )        //G = From 0 to 255
var_B = ( B / 255 )        //B = From 0 to 255

if ( var_R > 0.04045 ) var_R = ( ( var_R + 0.055 ) / 1.055 ) ^ 2.4
else                   var_R = var_R / 12.92
if ( var_G > 0.04045 ) var_G = ( ( var_G + 0.055 ) / 1.055 ) ^ 2.4
else                   var_G = var_G / 12.92
if ( var_B > 0.04045 ) var_B = ( ( var_B + 0.055 ) / 1.055 ) ^ 2.4
else                   var_B = var_B / 12.92

var_R = var_R * 100
var_G = var_G * 100
var_B = var_B * 100

//Observer. = 2°, Illuminant = D65
X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805
Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722
Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505
//************************************************************************
XYZ —> Yxy

//X = From 0 to  95.047       Observer. = 2°, Illuminant = D65
//Y = From 0 to 100.000
//Z = From 0 to 108.883

Y = Y
x = X / ( X + Y + Z )
y = Y / ( X + Y + Z )

//************************************************************************
Yxy —> XYZ

//Y = From 0 to 100
//x = From 0 to 1
//y = From 0 to 1

X = x * ( Y / y )
Y = Y
Z = ( 1 - x - y ) * ( Y / y )
//************************************************************************
XYZ —> Hunter-Lab

(H)L = 10 * sqrt( Y )
(H)a = 17.5 * ( ( ( 1.02 * X ) - Y ) / sqrt( Y ) )
(H)b = 7 * ( ( Y - ( 0.847 * Z ) ) / sqrt( Y ) )
//************************************************************************
Hunter-Lab —> XYZ

var_Y = (H)L / 10
var_X = (H)a / 17.5 * (H)L / 10
var_Z = (H)b / 7 * (H)L / 10

Y = var_Y ^ 2
X = ( var_X + out_Y ) / 1.02
Z = -( var_Z - out_Y ) / 0.847
//************************************************************************
XYZ —> CIE-L*ab

var_X = X /  95.047          //Observer = 2°, Illuminant = D65
var_Y = Y / 100.000
var_Z = Z / 108.883

if ( var_X > 0.008856 ) var_X = var_X ^ ( 1/3 )
else                    var_X = ( 7.787 * var_X ) + ( 16 / 116 )
if ( var_Y > 0.008856 ) var_Y = var_Y ^ ( 1/3 )
else                    var_Y = ( 7.787 * var_Y ) + ( 16 / 116 )
if ( var_Z > 0.008856 ) var_Z = var_Z ^ ( 1/3 )
else                    var_Z = ( 7.787 * var_Z ) + ( 16 / 116 )

CIE-L* = ( 116 * var_Y ) - 16
CIE-a* = 500 * ( var_X - var_Y )
CIE-b* = 200 * ( var_Y - var_Z )
//************************************************************************
CIE-L*ab —> XYZ

var_Y = ( CIE-L* + 16 ) / 116
var_X = CIE-a* / 500 + var_Y
var_Z = var_Y - CIE-b* / 200

if ( var_Y^3 > 0.008856 ) var_Y = var_Y^3
else                      var_Y = ( var_Y - 16 / 116 ) / 7.787
if ( var_X^3 > 0.008856 ) var_X = var_X^3
else                      var_X = ( var_X - 16 / 116 ) / 7.787
if ( var_Z^3 > 0.008856 ) var_Z = var_Z^3
else                      var_Z = ( var_Z - 16 / 116 ) / 7.787

X = ref_X * var_X     //ref_X =  95.047  Observer= 2°, Illuminant= D65
Y = ref_Y * var_Y     //ref_Y = 100.000
Z = ref_Z * var_Z     //ref_Z = 108.883
//************************************************************************
CIE-L*ab —> CIE-L*CH°
var_H = arc_tangent( CIE-b*, CIE-a* )  //Quadrant by signs

if ( var_H > 0 ) var_H = ( var_H / PI ) * 180
else             var_H = 360 - ( abs( var_H ) / PI ) * 180

CIE-L* = CIE-L*
CIE-C* = sqrt( CIE-a* ^ 2 + CIE-b* ^ 2 )
CIE-H°= var_H
//************************************************************************
XYZ —> CIE-L*uv
 
var_U = ( 4 * X ) / ( X + ( 15 * Y ) + ( 3 * Z ) )
var_V = ( 9 * Y ) / ( X + ( 15 * Y ) + ( 3 * Z ) )

var_Y = Y / 100
if ( var_Y > 0.008856 ) var_Y = var_Y ^ ( 1/3 )
else                    var_Y = ( 7.787 * var_Y ) + ( 16 / 116 )

ref_X =  95.047        //Observer= 2°, Illuminant= D65
ref_Y = 100.000
ref_Z = 108.883

ref_U = ( 4 * ref_X ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) )
ref_V = ( 9 * ref_Y ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) )

CIE-L* = ( 116 * var_Y ) - 16
CIE-u* = 13 * CIE-L* * ( var_U - ref_U )
CIE-v* = 13 * CIE-L* * ( var_V - ref_V )
//************************************************************************
CIE-L*uv —> XYZ

var_Y = ( CIE-L* + 16 ) / 116
if ( var_Y^3 > 0.008856 ) var_Y = var_Y^3
else                      var_Y = ( var_Y - 16 / 116 ) / 7.787

ref_X =  95.047      //Observer= 2°, Illuminant= D65
ref_Y = 100.000
ref_Z = 108.883

ref_U = ( 4 * ref_X ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) )
ref_V = ( 9 * ref_Y ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) )

var_U = CIE-u* / ( 13 * CIE-L* ) + ref_U
var_V = CIE-v* / ( 13 * CIE-L* ) + ref_V

Y = var_Y * 100
X =  - ( 9 * Y * var_U ) / ( ( var_U - 4 ) * var_V  - var_U * var_V )
Z = ( 9 * Y - ( 15 * var_V * Y ) - ( var_V * X ) ) / ( 3 * var_V )
//************************************************************************
RGB —> HSL

var_R = ( R / 255 )                     //RGB values = From 0 to 255
var_G = ( G / 255 )
var_B = ( B / 255 )

var_Min = min( var_R, var_G, var_B )    //Min. value of RGB
var_Max = max( var_R, var_G, var_B )    //Max. value of RGB
del_Max = var_Max - var_Min             //Delta RGB value

L = ( var_Max + var_Min ) / 2

if ( del_Max == 0 )                     //This is a gray, no chroma...
{
   H = 0                                //HSL results = From 0 to 1
   S = 0
}
else                                    //Chromatic data...
{
   if ( L < 0.5 ) S = del_Max / ( var_Max + var_Min )
   else           S = del_Max / ( 2 - var_Max - var_Min )

   del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
   del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
   del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max

   if      ( var_R == var_Max ) H = del_B - del_G
   else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
   else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R

   if ( H < 0 ) ; H += 1
   if ( H > 1 ) ; H -= 1
}
//************************************************************************
HSL —> RGB
 
if ( S == 0 )                       //HSL values = From 0 to 1
{
   R = L * 255                      //RGB results = From 0 to 255
   G = L * 255
   B = L * 255
}
else
{
   if ( L < 0.5 ) var_2 = L * ( 1 + S )
   else           var_2 = ( L + S ) - ( S * L )

   var_1 = 2 * L - var_2

   R = 255 * Hue_2_RGB( var_1, var_2, H + ( 1 / 3 ) )
   G = 255 * Hue_2_RGB( var_1, var_2, H )
   B = 255 * Hue_2_RGB( var_1, var_2, H - ( 1 / 3 ) )
}


--------------------------------------------------------------------------------

Hue_2_RGB( v1, v2, vH )             //Function Hue_2_RGB
{
   if ( vH < 0 ) vH += 1
   if ( vH > 1 ) vH -= 1
   if ( ( 6 * vH ) < 1 ) return ( v1 + ( v2 - v1 ) * 6 * vH )
   if ( ( 2 * vH ) < 1 ) return ( v2 )
   if ( ( 3 * vH ) < 2 ) return ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH ) * 6 )
   return ( v1 )
}
//************************************************************************
RGB —> HSV
 
var_R = ( R / 255 )                     //RGB values = From 0 to 255
var_G = ( G / 255 )
var_B = ( B / 255 )

var_Min = min( var_R, var_G, var_B )    //Min. value of RGB
var_Max = max( var_R, var_G, var_B )    //Max. value of RGB
del_Max = var_Max - var_Min             //Delta RGB value

V = var_Max

if ( del_Max == 0 )                     //This is a gray, no chroma...
{
   H = 0                                //HSV results = From 0 to 1
   S = 0
}
else                                    //Chromatic data...
{
   S = del_Max / var_Max

   del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
   del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
   del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max

   if      ( var_R == var_Max ) H = del_B - del_G
   else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
   else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R

   if ( H < 0 ) ; H += 1
   if ( H > 1 ) ; H -= 1
}
//************************************************************************
HSV —> RGB
 
 
if ( S == 0 )                       //HSV values = From 0 to 1
{
   R = V * 255                      //RGB results = From 0 to 255
   G = V * 255
   B = V * 255
}
else
{
   var_h = H * 6
   var_i = int( var_h )             //Or ... var_i = floor( var_h )
   var_1 = V * ( 1 - S )
   var_2 = V * ( 1 - S * ( var_h - var_i ) )
   var_3 = V * ( 1 - S * ( 1 - ( var_h - var_i ) ) )

   if      ( var_i == 0 ) { var_r = V     ; var_g = var_3 ; var_b = var_1 }
   else if ( var_i == 1 ) { var_r = var_2 ; var_g = V     ; var_b = var_1 }
   else if ( var_i == 2 ) { var_r = var_1 ; var_g = V     ; var_b = var_3 }
   else if ( var_i == 3 ) { var_r = var_1 ; var_g = var_2 ; var_b = V     }
   else if ( var_i == 4 ) { var_r = var_3 ; var_g = var_1 ; var_b = V     }
   else                   { var_r = V     ; var_g = var_1 ; var_b = var_2 }

   R = var_r * 255                  //RGB results = From 0 to 255
   G = var_g * 255
   B = var_b * 255
   }
}
//************************************************************************
Range of HSL, HSB and HSV in popular applications
 
Applications    Space  H Range   S Range    L/V/B Range
 
Paint Shop Pro   HSL   0 - 255   0 - 255   L     0 - 255
Gimp             HSV   0 - 360° 0 - 100   V     0 - 100
Photoshop        HSV   0 - 360° 0 - 100%  B     0 - 100%
Windows          HSL   0 - 240   0 - 240   L     0 - 240
Linux / KDE      HSV   0 - 360° 0 - 255   V     0 - 255
GTK              HSV   0 - 360° 0 - 1.0   V     0 - 1.0
Java (awt.Color) HSV   0 - 1.0   0 - 1.0   B     0 - 1.0
Apple            HSV   0 - 360° 0 - 100%  L     0 - 100%
//************************************************************************
RGB —> CMY
 
//RGB values = From 0 to 255

C = 1 - ( R / 255 )
M = 1 - ( G / 255 )
Y = 1 - ( B / 255 )

//************************************************************************
CMY —> RGB
 
//CMY values = From 0 to 1

R = ( 1 - C ) * 255
G = ( 1 - M ) * 255
B = ( 1 - Y ) * 255
//************************************************************************
CMY —> CMYK
 
//CMY values = From 0 to 1

var_K = 1

if ( C < var_K )   var_K = C
if ( M < var_K )   var_K = M
if ( Y < var_K )   var_K = Y

C = ( C - var_K ) / ( 1 - var_K )
M = ( M - var_K ) / ( 1 - var_K )
Y = ( Y - var_K ) / ( 1 - var_K )
K = var_K
//************************************************************************
CMYK —> CMY
 
//CMYK values = From 0 to 1

C = ( C * ( 1 - K ) + K )
M = ( M * ( 1 - K ) + K )
Y = ( Y * ( 1 - K ) + K )
//************************************************************************
XYZ (Tristimulus) Reference values of a perfect reflecting diffuser

Observer             2° (CIE 1931)          10° (CIE 1964)
Illuminant           X2      Y2     Z2       X10    Y10    Z10
A (Incandescent)   109.850  100   35.585   111.144  100   35.200
C                   98.074  100  118.232    97.285  100  116.145
D50                 96.422  100   82.521    96.720  100   81.427
D55                 95.682  100   92.149    95.799  100   90.926
D65 (Daylight)      95.047  100  108.883    94.811  100  107.304
D75                 94.972  100  122.638    94.416  100  120.641
F2 (Fluorescent)    99.187  100   67.395   103.280  100   69.026
F7                  95.044  100  108.755    95.792  100  107.687
F11                100.966  100   64.370   103.866  100   65.627
//************************************************************************

颜色迁移之一——基础知识(色彩空间及其转换)

因为我的本科毕业论文题目跟颜色迁移有关,我以后我会慢慢总结颜色迁移方面的算法与技术~~~~首先介绍下什么事颜色迁移。        颜色迁移是计算机视觉领域的一个很有趣的问题,它实际上要我们解决这么一...
  • lyh03601
  • lyh03601
  • 2014年03月27日 22:17
  • 7824

数字图像处理 颜色空间RGB、HSI、CMYK、YUV的相互转换

颜色空间也称彩色模型(又称彩色空间或彩色系统)它的用途是在某些标准下用通常可接受的方式对彩色加以说明。 本文讲解RGB与HSI、CMYK、YUV的基本概念及转换算法。...
  • aoshilang2249
  • aoshilang2249
  • 2014年07月23日 21:07
  • 7027

关于PC播放器色彩空间转换等一些说明

http://realdafeng.blog.163.com/blog/static/31119627201082385332217/ 写的非常浅显易懂。谢谢。 PC看片ABC  ...
  • xuxinhua
  • xuxinhua
  • 2013年02月03日 15:42
  • 2378

几种颜色模型的转换公式

from: 几种颜色模型的转换公式 在做图像处理时,我们一般采用的是RGB空间,但是在某些特殊情况下,我们也会用到其他的颜色空间。本文主要介绍一些常见的颜色空间的概念和转换公式。 颜色...
  • Real_Myth
  • Real_Myth
  • 2017年02月20日 14:24
  • 741

matlab--颜色空间的转换

color
  • wxcdzhangping
  • wxcdzhangping
  • 2014年11月12日 09:53
  • 1376

VC编程实现色彩空间XYZ与LAB相互转换

文章VC编程实现色彩空间RGB与XYZ相互转换已经介绍了RGB与XYZ色彩空间的转换算法以及实际的VC源代码,在上一篇文章已经提到,在PhotoShop中经常使用有RGB(红色、绿色、蓝色)、CMYK...
  • tian_110
  • tian_110
  • 2015年05月08日 09:55
  • 1121

【Matlab】【Color】matlab中一个“全能”颜色空间转换的程序

matlab中一个“全能”颜色空间转换的程序 转载之:http://www.bfcat.com/ "Colorspace Transformations"是一个matlab程序,可以完成多种...
  • erlingmusan
  • erlingmusan
  • 2014年03月17日 16:10
  • 2030

RGB颜色空间到HSV和YUV的转换关系(含VC代码)

RGB颜色空间到HSV和YUV的转换关系 RGB颜色空间           计算机色彩显示器显示色彩的原理与彩色电视机一样,都是采用R、G、B相加混色的原理,通过发射出三种不同强度的电子束,使屏幕内...
  • zhengtu009
  • zhengtu009
  • 2013年12月23日 12:53
  • 1547

OpenCV学习笔记(八)--颜色空间及转换

颜色空间要用三种或更多的特征来指定一种颜色,有许多的方法被称为颜色空间或者颜色模型。 如何选取其中一种方法来表示一副图像要依赖于执行的运算。 不同的颜色空间的转换,Opencv提供方法void...
  • taoyanqi8932
  • taoyanqi8932
  • 2016年09月25日 21:43
  • 4039

RGB与HSI颜色空间互换函数(matlab)

RGB与HSI颜色空间互换函数(matlab) 2011-09-13 16:14:14 标签:RGB HSI 颜色空间 互换 休闲 近看了一本数字图像处理的原版书。其中提供了RG...
  • phoenixtree7
  • phoenixtree7
  • 2014年09月23日 16:58
  • 1308
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:色彩空间转换公式汇编
举报原因:
原因补充:

(最多只允许输入30个字)