1. // RGB转换为YUV  
  2. void RGB2YUV(double R, double G, double B, double &Y, double &U, double &V)  
  3. {      
  4.     Y = static_cast<double>(0.257*R + 0.504*G + 0.098*B + 16); // y  
  5.     U = static_cast<double>(-0.148*R - 0.291*G+ 0.439*B + 128); // u  
  6.     V = static_cast<double>(0.439*R - 0.368*G - 0.071*B + 128); // v  
  7. }  
  8.  
  9. // YUV转换为RGB  
  10. void YUV2RGB(double Y,double U,double V, double &R, double &G, double &B)  
  11. {  
  12.     R = static_cast<double>(1.0*Y + 8 + 1.402*(V-128)); // r  
  13.     G = static_cast<double>(1.0*Y - 0.34413*(U-128) - 0.71414*(V-128));   
  14.      B = static_cast<double>(1.0*Y + 1.772*(U-128) + 0);   
  15. }  
  16. // RGB转换为XYZ  
  17. void RGB2XYZ(double r, double g, double b double &x, double &y, double &z)  
  18. {  
  19.  
  20.     double var_R,var_G,var_B;             
  21.     var_R = (r / 255.0f);  
  22.     var_G = (g / 255.0f);  
  23.     var_B = (b / 255.0f);  
  24.  
  25.     if (var_R > 0.04045)  
  26.     {  
  27.         var_R = pow((var_R + 0.055)/1.055, 2.4);  
  28.           
  29.     }  
  30.     else   
  31.     {  
  32.         var_R = var_R / 12.92;  
  33.     }  
  34.     if (var_G > 0.04045)  
  35.     {  
  36.         var_G = pow((var_G + 0.055)/1.055, 2.4);  
  37.     }  
  38.     else   
  39.     {  
  40.         var_G = var_G / 12.92;  
  41.     }  
  42.     if (var_B > 0.04045)  
  43.     {  
  44.         var_B = pow((var_B + 0.055)/1.055, 2.4);  
  45.     }  
  46.     else 
  47.     {  
  48.         var_B = var_B / 12.92;  
  49.     }  
  50.            
  51.     var_R = var_R * 100.0f;     
  52.     var_G = var_G * 100.0f;    
  53.     var_B = var_B * 100.0f;    
  54.  
  55.     //Observer.   =   2°,   Illuminant   =   D65     
  56.     x = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805;  
  57.     y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722;  
  58.     z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505;    
  59. }  
  60.  
  61. // XYZ转换为LAB  
  62. void XYZ2LAB(double x, double y, double z, double &L, double &A ,double &B)  
  63. {  
  64.     double var_X,var_Y,var_Z;  
  65.     var_X = x / 95.047f;          
  66.     var_Y = y / 100.000f;            
  67.     var_Z = z / 108.883f;            
  68.  
  69.     if ( var_X > 0.008856 )   
  70.     {  
  71.         var_X = pow((float)var_X,1.0f/3.0f);  
  72.     }  
  73.     else    
  74.     {  
  75.         var_X = ( 7.787 * var_X ) + ( 16 / 116 );  
  76.     }  
  77.     if (var_Y > 0.008856)  
  78.     {  
  79.         var_Y = pow((float)var_Y,1.0f/3.0f);  
  80.     }  
  81.     else   
  82.     {  
  83.         var_Y = ( 7.787 * var_Y ) + ( 16 / 116 );  
  84.     }  
  85.     if ( var_Z > 0.008856 )  
  86.     {  
  87.         var_Z = pow((float)var_Z,1.0f/3.0f);  
  88.     }  
  89.     else 
  90.     {  
  91.         var_Z = ( 7.787 * var_Z ) + ( 16 / 116 );  
  92.     }  
  93.  
  94.     L = ( 116 * var_Y ) - 16;  
  95.     A = 500 * ( var_X - var_Y );  
  96.     B = 200 * ( var_Y - var_Z );  
  97. }  
  98.  
  99. // RGB转换为LAB  
  100. void RGB2LAB(double r, double g,double b, double &L, double &A, double &B)  
  101. {  
  102.     double x,y,z;  
  103.     RGB2XYZ(r,g,b,x,y,z);  
  104.     XYZ2LAB(x,y,z,L,A,B);  
  105. }  
  106. // LAB转换为RGB  
  107. void LAB2RGB(double L, double A, double B, double &R, double &G, double &B)  
  108. {  
  109.     double x,y,z[3];  
  110.     this->LAB2XYZ(L,A,B,x,y,z);  
  111.     this->XYZ2RGB(x,y,z,R,G,B);  
  112. }  
  113. // LAB转换为XYZ  
  114. void LAB2XYZ(double lab_L, double lab_A, double lab_B, double &X, double &Y, double &Z)  
  115. {      
  116.     double var_X,var_Y, var_Z;  
  117.       
  118.     var_Y = ( lab_L + 16 ) / 116;  
  119.     var_X = lab_A / 500 + var_Y;  
  120.     var_Z = var_Y - lab_B / 200;  
  121.  
  122.     if ( pow((double)var_Y,3) > 0.008856 )   
  123.         var_Y = pow((double)var_Y,3);  
  124.     else                        
  125.         var_Y = ( var_Y - 16 / 116 ) / 7.787;  
  126.     if ( pow((double)var_X,3) > 0.008856 )   
  127.         var_X = pow((double)var_X,3);  
  128.     else           
  129.         var_X = ( var_X - 16 / 116 ) / 7.787;  
  130.     if ( pow((double)var_Z,3) > 0.008856 )   
  131.         var_Z = pow((double)var_Z,3);  
  132.     else                        
  133.         var_Z = ( var_Z - 16 / 116 ) / 7.787;  
  134.  
  135.     X = 95.047 * var_X;       
  136.     Y = 100.000 * var_Y;      
  137.     Z = 108.883 * var_Z;      
  138. }  
  139.  
  140. // XYZ转换为RGB  
  141. void XYZ2RGB(double x, double y, double z, double &R, double &G, double &B)  
  142. {  
  143.     double var_X,var_Y,var_Z,var_R,var_G,var_B;  
  144.     double x,y,z;  
  145.  
  146.     var_X = x / 100.0f;        //X from 0 to  95.047      (Observer = 2°, Illuminant = D65)  
  147.     var_Y = y / 100.0f;        //Y from 0 to 100.000  
  148.     var_Z = z / 100.0f;        //Z from 0 to 108.883  
  149.  
  150.     var_R = var_X *  3.2406 + var_Y * -1.5372 + var_Z * -0.4986;  
  151.     var_G = var_X * -0.9689 + var_Y *  1.8758 + var_Z *  0.0415;  
  152.     var_B = var_X *  0.0557 + var_Y * -0.2040 + var_Z *  1.0570;  
  153.  
  154.     if ( var_R > 0.0031308 )   
  155.         var_R = 1.055 * ( pow(var_R,( 1 / 2.4 ) )) - 0.055;  
  156.     else                       
  157.         var_R = 12.92 * var_R;  
  158.     if ( var_G > 0.0031308 )  
  159.         var_G = 1.055 * ( pow(var_G, ( 1 / 2.4 )) ) - 0.055;  
  160.     else                       
  161.         var_G = 12.92 * var_G;  
  162.     if ( var_B > 0.0031308 )   
  163.         var_B = 1.055 * ( pow(var_B, ( 1 / 2.4 )) ) - 0.055;  
  164.     else                      
  165.         var_B = 12.92 * var_B;  
  166.     R = var_R * 255.0f;  
  167.     G = var_G * 255.0f;  
  168.     b = var_B * 255.0f;  
  169. }  
  170.  
  171. // RGB转换为HSV  
  172. void RGB2HSV(double R, double G, double B, double &H, double &S, double V)  
  173. {  
  174.     double var_R,var_G,var_B;  
  175.  
  176.     var_R = ( R / 255 );                    //RGB from 0 to 255  
  177.     var_G = ( G / 255 );  
  178.     var_B = ( B / 255 );  
  179.  
  180.     double var_Min,var_Max,del_Max;  
  181.     var_Min = min(min(var_R,var_G),var_B);  
  182.     var_Max = max(max(var_R,var_G),var_B);  
  183.     del_Max = var_Max - var_Min;            //Delta RGB value   
  184.  
  185.     double H,S,V;  
  186.     V = var_Max;  
  187.  
  188.     if ( del_Max == 0 )                     //This is a gray, no chroma  
  189.     {  
  190.         H = 0;                               //HSV results from 0 to 1  
  191.         S = 0;  
  192.     }  
  193.     else                                    //Chromatic data  
  194.     {  
  195.         S = del_Max / var_Max;  
  196.           
  197.         double del_R,del_G,del_B;  
  198.         del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max;  
  199.         del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max;  
  200.         del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max;  
  201.  
  202.         if ( var_R == var_Max )   
  203.             H = del_B - del_G;  
  204.         else if ( var_G == var_Max )  
  205.             H = ( 1 / 3 ) + del_R - del_B;  
  206.         else if ( var_B == var_Max )   
  207.             H = ( 2 / 3 ) + del_G - del_R;  
  208.  
  209.         if ( H < 0 )   
  210.             H += 1;  
  211.         if ( H > 1 )   
  212.             H -= 1;  
  213.     }  
  214. }  
  215.  
  216. // HSV转换为RGB  
  217. void HSV2RGB(double H, double S, double V, double &R, double &G, double &B)  
  218. {  
  219.     double R,G,B;  
  220.     if ( S == 0 )                       //HSV from 0 to 1  
  221.     {  
  222.         R = V * 255.0f;  
  223.         G = V * 255.0f;  
  224.         B = V * 255.0f;  
  225.     }  
  226.     else 
  227.     {  
  228.         double var_h,var_i,var_1,var_2,var_3;  
  229.         var_h = H * 6.0f;  
  230.         if ( var_h == 6 )   
  231.             var_h = 0;     //H must be < 1  
  232.         var_i = int( var_h );            //Or  var_i = floor( var_h )  
  233.         var_1 = V * ( 1 - S );  
  234.         var_2 = V * ( 1 - S * ( var_h - var_i ) );  
  235.         var_3 = V * ( 1 - S * ( 1 - ( var_h - var_i ) ) );  
  236.  
  237.         double var_r,var_g,var_b;  
  238.         if ( var_i == 0 )   
  239.         {  
  240.             var_r = V;   
  241.             var_g = var_3 ;  
  242.             var_b = var_1;  
  243.         }  
  244.         else if ( var_i == 1 )   
  245.         {   
  246.             var_r = var_2 ;  
  247.             var_g = V;  
  248.             var_b = var_1;  
  249.         }      
  250.         else if ( var_i == 2 )   
  251.         {  
  252.             var_r = var_1 ;  
  253.             var_g = V;   
  254.             var_b = var_3;  
  255.         }  
  256.         else if ( var_i == 3 )   
  257.         {   
  258.             var_r = var_1 ;   
  259.             var_g = var_2 ;  
  260.             var_b = V;  
  261.         }  
  262.         else if ( var_i == 4 )   
  263.         {   
  264.             var_r = var_3 ;  
  265.             var_g = var_1 ;   
  266.             var_b = V;  
  267.         }  
  268.         else      
  269.         {   
  270.             var_r = V;   
  271.             var_g = var_1 ;   
  272.             var_b = var_2;  
  273.         }  
  274.  
  275.         R = var_r * 255.0f;                 //RGB results from 0 to 255  
  276.         G = var_g * 255.0f;  
  277.         B = var_b * 255.0f;  
  278.     }  
  279. }  
  280. // YUV转换为XYZ  
  281. void YUV2XYZ(double L, double U, double V, double &X, double &Y, double &Z)  
  282. {  
  283.     double var_Y,ref_X,ref_Y,ref_Z,ref_U,ref_V,var_U,var_V;  
  284.     var_Y = ( L + 16 ) / 116;  
  285.     if ( pow(var_Y,3) > 0.008856 )   
  286.         var_Y = pow(var_Y,3);  
  287.     else                        
  288.         var_Y = ( var_Y - 16 / 116 ) / 7.787;  
  289.  
  290.     ref_X =  95.047;      //Observer= 2°, Illuminant= D65  
  291.     ref_Y = 100.000;  
  292.     ref_Z = 108.883;  
  293.  
  294.     ref_U = ( 4 * ref_X ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) );  
  295.     ref_V = ( 9 * ref_Y ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) );  
  296.  
  297.     var_U = U / ( 13 * L ) + ref_U;  
  298.     var_V = V / ( 13 * L) + ref_V;  
  299.  
  300.     Y = var_Y * 100;  
  301.     X =  - ( 9 * Y * var_U ) / ( ( var_U - 4 ) * var_V  - var_U * var_V );  
  302.     Z = ( 9 * Y - ( 15 * var_V * Y ) - ( var_V * X ) ) / ( 3 * var_V );  
  303.  
  304. }  
  305. // LAB转换为HSV  
  306. void LAB2HSV(double L, double A, double B, double &H, double &S, double &V)  
  307. {  
  308.     double X,Y,Z;  
  309.     this->LAB2XYZ(L,A,B,X,Y,Z);  
  310.     this->XYZ2HSV(X,Y,Z,H,S,V);  
  311. }  
  312. // XYZ转换为HSV  
  313. void XYZ2HSV(double X, double Y, double Z,double &H, double &S, double &V)  
  314. {  
  315.     double R,G,B;  
  316.     this->XYZ2RGB(X,Y,Z,R,G,B);  
  317.     this->RGB2HSV(R,G,B,H,S,V);  
  318. }  
  319. // RGB转换为CMY  
  320. void RGB2CMY(double R, double G, double B, double &C, double &M, double Y)  
  321. {  
  322.     C = 1.0 - ( R / 255.0f );  
  323.     M = 1.0 - ( G / 255.0f );  
  324.     Y = 1.0 - ( B / 255.0f );  
  325. }  
  326. //CMY转换为RGB  
  327. void CMY2RGB(double C, double M, double Y, double &R, double &G, double &B)  
  328. {  
  329.     R = ( 1.0f - C ) * 255.0f;  
  330.     G = ( 1.0f - M ) * 255.0f;  
  331.     B = ( 1.0f - Y ) * 255.0f;  
  332. }  
  333. //RGB转换为CMYK  
  334. void RGB2CMYK(double R, double G, double B, double &C, double &M, double Y, double &K)  
  335. {  
  336.     double bufCMY[3];  
  337.     //RGB2CMY  
  338.     this->RGB2CMY(R,G,B,C,M,Y);  
  339.     //CMYK and CMY values from 0 to 1  
  340.     double var_K;  
  341.  
  342.     var_K = 1;  
  343.  
  344.     if ( C < var_K )    
  345.         var_K = C;  
  346.     if ( M < var_K )     
  347.         var_K = M;  
  348.     if ( Y < var_K )    
  349.         var_K = Y;  
  350.     if ( var_K == 1 )  
  351.     { //Black  
  352.         C = 0;  
  353.         M = 0;  
  354.         Y = 0;  
  355.     }  
  356.     else   
  357.     {  
  358.         C = ( C - var_K ) / ( 1 - var_K );  
  359.         M = ( M - var_K ) / ( 1 - var_K );  
  360.         Y = ( Y - var_K ) / ( 1 - var_K );  
  361.     }  
  362.     K = var_K;  
  363.  
  364. }  
  365. //CMYK转换为CMY  
  366. void CMYK2CMY(double C1, double M1, double Y1, double K1, double &C2, double &M2, double Y2)  
  367. {  
  368.     C2 = ( C1 * ( 1 - K1 ) + K1 );  
  369.     M2 = ( M1 * ( 1 - K1 ) + K1 );  
  370.     Y2 = ( Y1 * ( 1 - K1 ) + K1 );