#include #include "cc.h" namespace OBJREC { template void ColorSpace::convert ( NICE::MultiChannelImageT & dst, const NICE::MultiChannelImageT & src, int dstColorSpace, int srcColorSpace, double dstM, double srcM ) { assert ( (srcColorSpace >= 0) && (srcColorSpace < NUM_COLORSPACES) ); assert ( (dstColorSpace >= 0) && (dstColorSpace < NUM_COLORSPACES) ); dst.reInitFrom ( src, true ); if ( (srcColorSpace == COLORSPACE_RGB) && (dstColorSpace == COLORSPACE_HSL) ) { assert ( dst.numChannels == 3 ); assert ( src.numChannels == 3 ); long k = 0; for ( int y = 0 ; y < src.ysize ; y++ ) for ( int x = 0 ; x < src.xsize ; x++,k++ ) { double R,G,B,H,S,L; R=(double)src.data[0][k]/srcM; G=(double)src.data[1][k]/srcM; B=(double)src.data[2][k]/srcM; ColorConversion::ccRGBtoHSL(R,G,B,&H,&S,&L); dst.data[0][k] = (DstPixelType)(H*dstM); dst.data[1][k] = (DstPixelType)(S*dstM); dst.data[2][k] = (DstPixelType)(L*dstM); } } else if ( (srcColorSpace == COLORSPACE_RGB) && (dstColorSpace == COLORSPACE_LAB) ) { long k = 0; for ( int y = 0 ; y < src.ysize ; y++ ) for ( int x = 0 ; x < src.xsize ; x++,k++ ) { double R,G,B,X,Y,Z,L,a,b; R=(double)src.data[0][k]/255.0; G=(double)src.data[1][k]/255.0; B=(double)src.data[2][k]/255.0; ColorConversion::ccRGBtoXYZ(R,G,B,&X,&Y,&Z,0); ColorConversion::ccXYZtoCIE_Lab(X,Y,Z,&L,&a,&b,0); dst.data[0][k] = (DstPixelType)(L); dst.data[1][k] = (DstPixelType)(a); dst.data[2][k] = (DstPixelType)(b); } } else if ( (srcColorSpace == COLORSPACE_LAB) && (dstColorSpace == COLORSPACE_RGB) ) { long k = 0; for ( int y = 0 ; y < src.ysize ; y++ ) for ( int x = 0 ; x < src.xsize ; x++,k++ ) { double R,G,B,X,Y,Z,L,a,b; L=(double)src.data[0][k]; a=(double)src.data[1][k]; b=(double)src.data[2][k]; ColorConversion::ccCIE_LabtoXYZ(L,a,b,&X,&Y,&Z,0); ColorConversion::ccXYZtoRGB(X,Y,Z,&R,&G,&B,0); dst.data[0][k] = (DstPixelType)(R); dst.data[1][k] = (DstPixelType)(G); dst.data[2][k] = (DstPixelType)(B); } } else if ( (srcColorSpace == COLORSPACE_RGB) && (dstColorSpace == COLORSPACE_LMS) ) { long k = 0; for ( int y = 0 ; y < src.ysize ; y++ ) for ( int x = 0 ; x < src.xsize ; x++,k++ ) { double R,G,B,X,Y,Z,L,M,S; R=(double)src.data[0][k]/srcM; G=(double)src.data[1][k]/srcM; B=(double)src.data[2][k]/srcM; ColorConversion::ccRGBtoXYZ(R,G,B,&X,&Y,&Z,0); ColorConversion::ccXYZtoLMS(X,Y,Z,&L,&M,&S); dst.data[0][k] = (DstPixelType)(L); dst.data[1][k] = (DstPixelType)(M); dst.data[2][k] = (DstPixelType)(S); } } else if ( (srcColorSpace == COLORSPACE_RGB) && (dstColorSpace == COLORSPACE_OPP) ) { long k = 0; for ( int y = 0 ; y < src.ysize ; y++ ) for ( int x = 0 ; x < src.xsize ; x++,k++ ) { double R,G,B,X,Y,Z,L,M,S,Lum,LM,SLM; R=(double)src.data[0][k]/srcM; G=(double)src.data[1][k]/srcM; B=(double)src.data[2][k]/srcM; ColorConversion::ccRGBtoXYZ(R,G,B,&X,&Y,&Z,0); ColorConversion::ccXYZtoLMS(X,Y,Z,&L,&M,&S); ColorConversion::ccLMStoOPP(L,M,S,&Lum,&LM,&SLM); dst.data[0][k] = (DstPixelType)(Lum); dst.data[1][k] = (DstPixelType)(LM); dst.data[2][k] = (DstPixelType)(SLM); #ifdef DEBUG fprintf(stderr,"R:%.4f G:%.4f B:%.4f X:%.4f Y:%.4f Z:%.4f L:%.4f M:%.4f S:%.4f Lum:%.4f LM:%.4f SLM:%.4f\n",R,G,B,X,Y,Z,L,M,S,Lum,LM,SLM); #endif } } else { fprintf (stderr, "ColorSpace::convert(): not yet implemented - SrcColorSpace %d -> DstColorSpace %d!!\n",srcColorSpace,dstColorSpace); exit(-1); } } }