123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #include <assert.h>
- #include "cc.h"
- namespace OBJREC {
- template<class SrcPixelType,class DstPixelType>
- void ColorSpace::convert ( NICE::MultiChannelImageT<DstPixelType> & dst, const NICE::MultiChannelImageT<SrcPixelType> & 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);
- }
- }
- }
|