Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's quick Index  

HxColConvert.h File Reference

More...

#include "HxVec3Double.h"

Go to the source code of this file.

Functions

L_HXBASIS HxVec3Double HxColRGB2CMY (const HxVec3Double &v)
 Conversion from RGB to CMY. More...

L_HXBASIS HxVec3Double HxColCMY2RGB (const HxVec3Double &v)
 Conversion from CMY to RGB. More...

L_HXBASIS HxVec3Double HxColRGB2XYZ (const HxVec3Double &v)
 Conversion from RGB(Rec709) to XYZ (1931). More...

L_HXBASIS HxVec3Double HxColXYZ2RGB (const HxVec3Double &v)
 Conversion from XYZ (1931) to RGB(Rec709). More...

L_HXBASIS HxVec3Double HxColCMY2XYZ (const HxVec3Double &v)
 Conversion from CMY through RGB(Rec709) to XYZ (1931). More...

L_HXBASIS HxVec3Double HxColXYZ2CMY (const HxVec3Double &v)
 Conversion from XYZ (1931) through RGB(Rec709) to CMY. More...

L_HXBASIS HxVec3Double HxColLab2XYZ (const HxVec3Double &v)
 Conversion from Lab to XYZ (1931), D65 reference white point. More...

L_HXBASIS HxVec3Double HxColXYZ2Lab (const HxVec3Double &v)
 Conversion from XYZ (1931) to Lab, D65 reference white point. More...

L_HXBASIS HxVec3Double HxColLuv2XYZ (const HxVec3Double &v)
 Conversion from Luv to XYZ (1931), D65 reference white point. More...

L_HXBASIS HxVec3Double HxColXYZ2Luv (const HxVec3Double &v)
 Conversion from XYZ (1931) to Luv, D65 reference white point. More...

L_HXBASIS HxVec3Double HxColRGB2OOO (const HxVec3Double &v)
 Conversion from RGB(Rec709) to OOO (Geusebroek Thesis). More...

L_HXBASIS HxVec3Double HxColOOO2RGB (const HxVec3Double &v)
 Conversion from OOO (Geusebroek Thesis) to RGB(Rec709). More...

L_HXBASIS HxVec3Double HxColXYZ2OOO (const HxVec3Double &v)
 Conversion from XYZ(1931) to OOO (Geusebroek Thesis). More...

L_HXBASIS HxVec3Double HxColOOO2XYZ (const HxVec3Double &v)
 Conversion from OOO (Geusebroek Thesis) to XYZ(1931). More...

L_HXBASIS HxVec3Double HxColRGB2HSI (const HxVec3Double &v)
 Conversion from RGB to HSI. More...

L_HXBASIS HxVec3Double HxColHSI2RGB (const HxVec3Double &v)
 Conversion from HSI to RGB. More...

L_HXBASIS int HxColRGB2int (const HxVec3Double &v)
 Convert RGB HxVec3Double to an ARGB integer representation. More...

L_HXBASIS int HxColRGB2int (const HxVec3Int &v)
 Convert RGB HxVec3Int to an ARGB integer representation. More...


Detailed Description


Function Documentation

L_HXBASIS HxVec3Double HxColRGB2CMY const HxVec3Double   v
 

Conversion from RGB to CMY.

ColRGB2CMY.gif

00020 {
00021     return HxVec3Double(1, 1, 1) - v;
00022 }

L_HXBASIS HxVec3Double HxColCMY2RGB const HxVec3Double   v
 

Conversion from CMY to RGB.

ColCMY2RGB.gif

00026 {
00027     return HxVec3Double(1, 1, 1) - v;
00028 }

L_HXBASIS HxVec3Double HxColRGB2XYZ const HxVec3Double   v
 

Conversion from RGB(Rec709) to XYZ (1931).

ColRGB2XYZ.gif

00034 {
00035     // Using Rec709
00036     // X = 100 * (0.412452 R/255 + 0.357580 G/255 + 0.180423 B/255)
00037     // Y = 100 * (0.212671 R/255 + 0.715160 G/255 + 0.072169 B/255)
00038     // Z = 100 * (0.019334 R/255 + 0.119193 G/255 + 0.950227 B/255)
00039 
00040     double X = v.x() * 0.161746 + v.y() * 0.140227 + v.z() * 0.070754;
00041     double Y = v.x() * 0.083400 + v.y() * 0.280455 + v.z() * 0.028301;
00042     double Z = v.x() * 0.007582 + v.y() * 0.046742 + v.z() * 0.372638;
00043     
00044     return HxVec3Double(X, Y, Z);
00045 }

L_HXBASIS HxVec3Double HxColXYZ2RGB const HxVec3Double   v
 

Conversion from XYZ (1931) to RGB(Rec709).

ColXYZ2RGB.gif

00049 {
00050     // Using rec709
00051     // R = 255 * (3.240479 X/100 - 1.537150 * Y/100 - 0.498535 * Z/100)
00052     // G = 255 * (-0.969256 * X/100 + 1.875992 * Y/100 + 0.041556 * Z/100)
00053     // B = 255 * (0.055648 * Z/100 - 0.204043 * Y/100 + 1.057311 * Z/100)
00054 
00055     double R = v.x() * 8.25322145 + v.y() * -3.9197325 + v.z() * -1.27126425;
00056     double G = v.x() * -2.4716028 + v.y() * 4.7837796 + v.z() * 0.1059678;
00057     double B = v.x() * 0.1419024 + v.y() * -0.52030965 + v.z() * 2.69614305;
00058 
00059     return HxVec3Double(R, G, B);
00060 }

L_HXBASIS HxVec3Double HxColCMY2XYZ const HxVec3Double   v
 

Conversion from CMY through RGB(Rec709) to XYZ (1931).

ColCMY2XYZ.gif

00066 {
00067     // Using rec709
00068     // R = 1-C, G = 1-M, B = 1-Y
00069 
00070     double X = 95.045385
00071         - v.x() * 0.161746 - v.y() * 0.140227 - v.z() * 0.070754;
00072     double Y = 100.0
00073         - v.x() * 0.083400 - v.y() * 0.280455 - v.z() * 0.028301;
00074     double Z = 108.87531
00075         - v.x() * 0.007582 - v.y() * 0.046742 - v.z() * 0.372638;
00076 
00077     return HxVec3Double(X, Y, Z);
00078 }

L_HXBASIS HxVec3Double HxColXYZ2CMY const HxVec3Double   v
 

Conversion from XYZ (1931) through RGB(Rec709) to CMY.

ColXYZ2CMY.gif

00082 {
00083     // Using rec709
00084     // C = 1-R, M = 1-G, Y = 1-B
00085 
00086     double C = 255.0
00087         - v.x() * 8.25322145 - v.y() * -3.9197325 - v.z() * -1.27126425;
00088     double M = 255.0
00089         - v.x() * -2.4716028 - v.y() * 4.7837796 - v.z() * 0.1059678;
00090     double Y = 255.0
00091         - v.x() * 0.1419024 - v.y() * -0.52030965 - v.z() * 2.69614305;
00092 
00093     return HxVec3Double(C, M, Y);
00094 }

L_HXBASIS HxVec3Double HxColLab2XYZ const HxVec3Double   v
 

Conversion from Lab to XYZ (1931), D65 reference white point.

ColLab2XYZ.gif

00128 {
00129     double Y = L2Y(v.x());
00130 
00131     double Ltmp = (v.x() + 16.0) / 116.0; // == f(Y / Yn)
00132     double atmp = Ltmp + v.y() / 500.0;
00133     double X = Xn * fInv4ab(atmp, Ltmp);
00134     double btmp = Ltmp - v.z() / 200.0;
00135     double Z = Zn * fInv4ab(btmp, Ltmp);
00136     return HxVec3Double(X, Y, Z);
00137 }

L_HXBASIS HxVec3Double HxColXYZ2Lab const HxVec3Double   v
 

Conversion from XYZ (1931) to Lab, D65 reference white point.

ColXYZ2Lab.gif

00141 {
00142     HxVec3Double n = v / HxVec3Double(Xn, Yn, Zn);
00143 
00144     double L = Y2L(n.y());
00145 
00146     double fnX = f4ab(n.x());
00147     double fnY = f4ab(n.y());
00148     double fnZ = f4ab(n.z());
00149         
00150     double a = 500.0 * (fnX - fnY);
00151     double b = 200.0 * (fnY - fnZ);
00152     return HxVec3Double(L, a, b);
00153 }

L_HXBASIS HxVec3Double HxColLuv2XYZ const HxVec3Double   v
 

Conversion from Luv to XYZ (1931), D65 reference white point.

ColLuv2XYZ.gif

00161 {
00162     double Y = L2Y(v.x());
00163     double tmp = Xn + 15 * Yn + 3 * Zn;
00164     double unp = 4 * Xn / tmp;
00165     double vnp = 9 * Yn / tmp;
00166     double Q = v.y() / (13 * v.x()) + unp;
00167     double R = v.z() / (13 * v.x()) + vnp;
00168     double A = 3 * Y * (5 * R - 3);
00169     double Z = ((Q - 4) * A - 15 * Q * R * Y) / (12 * R);
00170     double X = -(A / R + 3 * Z);
00171     return HxVec3Double(X, Y, Z);
00172 }

L_HXBASIS HxVec3Double HxColXYZ2Luv const HxVec3Double   v
 

Conversion from XYZ (1931) to Luv, D65 reference white point.

ColXYZ2Luv.gif

00176 {
00177     double L = Y2L(v.y() / Yn);
00178     double tmp = Xn + 15 * Yn + 3 * Zn;
00179     double unp = 4 * Xn / tmp;
00180     double vnp = 9 * Yn / tmp;
00181     tmp = v.x() + 15 * v.y() + 3 * v.z();
00182     double up = 4 * v.x() / tmp;
00183     double vp = 9 * v.y() / tmp;
00184     double us = 13 * L * (up - unp);
00185     double vs = 13 * L * (vp - vnp);
00186     return HxVec3Double(L, us, vs);
00187 }

L_HXBASIS HxVec3Double HxColRGB2OOO const HxVec3Double   v
 

Conversion from RGB(Rec709) to OOO (Geusebroek Thesis).

ColRGB2OOO.gif
For transformation from RGB to XYZ, see HxColRGB2XYZ.

00275 {
00276     double E   = v.x() * 0.000233846 + v.y() * 0.00261968 + v.z() * 0.00127135;
00277     double El  = v.x() * 0.000726333 + v.y() * 0.000718106+ v.z() * -0.00121377;
00278     double Ell = v.x() * 0.000846833 + v.y() * -0.00173932+ v.z() * 0.000221515;
00279 
00280     return HxVec3Double(E, El, Ell);
00281 }

L_HXBASIS HxVec3Double HxColOOO2RGB const HxVec3Double   v
 

Conversion from OOO (Geusebroek Thesis) to RGB(Rec709).

ColOOO2RGB.gif
For transformation from XYZ to RGB, see HxColXYZ2RGB.

00287 {
00288     double R = v.x() * 328.084 + v.y() * 469.182 + v.z() * 687.853;
00289     double G = v.x() * 199.794 + v.y() * 172.242 + v.z() * -202.904;
00290     double B = v.x() * 314.533 + v.y() * -441.212 + v.z() * 291.574;
00291 
00292     return HxVec3Double(R, G, B);
00293 }

L_HXBASIS HxVec3Double HxColXYZ2OOO const HxVec3Double   v
 

Conversion from XYZ(1931) to OOO (Geusebroek Thesis).

ColXYZ2OOO.gif

00251 {
00252     double E   = v.x() *-0.004362 + v.y() * 0.010954 + v.z() * 0.003408;
00253     double El  = v.x() * 0.004055 + v.y() * 0.001220 + v.z() *-0.004120;
00254     double Ell = v.x() * 0.011328 + v.y() *-0.011755 + v.z() *-0.000664;
00255 
00256     return HxVec3Double(E, El, Ell);
00257 }

L_HXBASIS HxVec3Double HxColOOO2XYZ const HxVec3Double   v
 

Conversion from OOO (Geusebroek Thesis) to XYZ(1931).

ColOOO2XYZ.gif

00263 {
00264     double X = v.x() * 103.337 + v.y() * 68.824 + v.z() * 103.435;
00265     double Y = v.x() * 92.297  + v.y() * 74.949 + v.z() * 8.714;
00266     double Z = v.x() * 129.034 + v.y() * -152.804 + v.z() * 104.383;
00267 
00268     return HxVec3Double(X, Y, Z);
00269 }

L_HXBASIS HxVec3Double HxColRGB2HSI const HxVec3Double   v
 

Conversion from RGB to HSI.

No formula yet...

00200 {
00201     double I = v.sum().x() / 3.0;
00202     double S = (I == 0.0) ? 1.0 : 1.0 - (v.min().x() / I);
00203     double H;
00204     if (v.x() == v.y() && v.y() == v.z())
00205         H = 0.0;
00206     else {
00207         double tmp = acos((0.5*(v.x()-v.y()+v.x()-v.z())) / 
00208                 sqrt((v.x()-v.y())*(v.x()-v.y())+(v.x()-v.z())*(v.y()-v.z())));
00209         H = (v.y() > v.z()) ? tmp : TWO_PI - tmp;
00210     }
00211     return HxVec3Double(H, S, I);
00212 }

L_HXBASIS HxVec3Double HxColHSI2RGB const HxVec3Double   v
 

Conversion from HSI to RGB.

No formula yet...

00216 {
00217     double H = v.x();
00218     double S = v.y();
00219     double I = v.z();
00220     double Htmp;
00221     double R,B,G;
00222     
00223     if (H == 0.0)
00224         R = G = B = I;
00225     else if (H > 0.0 && H < TWO_PI_3 ) {
00226         Htmp = 1 / sqrt(3.0) * tan(H - PI_3);
00227         B = (1.0 - S) * I;
00228         G = (1.5 + 1.5*Htmp ) * I - ((0.5 + 1.5*Htmp) * B);
00229         R = 3.0 * I - G - B;
00230     }
00231     else if (H >= TWO_PI_3 && H < FOUR_PI_3) {
00232         Htmp = 1 / sqrt(3.0) * tan(H - PI);
00233         R = (1.0 - S) * I;
00234         B = (1.5 + 1.5*Htmp ) * I - ((0.5 + 1.5*Htmp) * R);
00235         G = 3.0 * I - B - R;
00236     }
00237     else { 
00238         Htmp = 1 / sqrt(3.0) * tan(H - FIVE_PI_3);
00239         G = (1.0 - S) * I;
00240         R = (1.5 + 1.5*Htmp ) * I - ((0.5 + 1.5*Htmp) * G);
00241         B = 3.0 * I - R - G;
00242     }
00243     return HxVec3Double(R, G, B);
00244 }

L_HXBASIS int HxColRGB2int const HxVec3Double   v
 

Convert RGB HxVec3Double to an ARGB integer representation.

L_HXBASIS int HxColRGB2int const HxVec3Int   v
 

Convert RGB HxVec3Int to an ARGB integer representation.

00327 {
00328     int x = v.x();
00329     if (x < 0)
00330         x = 0;
00331     else {
00332         if (x > 255)
00333             x = 255;
00334     }
00335     int y = v.y();
00336     if (y < 0)
00337         y = 0;
00338     else {
00339         if (y > 255)
00340             y = 255;
00341     }
00342     int z = v.z();
00343     if (z < 0)
00344         z = 0;
00345     else {
00346         if (z > 255)
00347             z = 255;
00348     }
00349     return (255 << 24) | (x << 16) | (y << 8) | z;
00350 }


Generated on Tue Feb 3 14:18:46 2004 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001