ColorSpace.tcc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include <assert.h>
  2. #include "cc.h"
  3. namespace OBJREC {
  4. template<class SrcPixelType,class DstPixelType>
  5. void ColorSpace::convert ( NICE::MultiChannelImageT<DstPixelType> & dst, const NICE::MultiChannelImageT<SrcPixelType> & src,
  6. int dstColorSpace, int srcColorSpace, double dstM, double srcM )
  7. {
  8. assert ( (srcColorSpace >= 0) && (srcColorSpace < NUM_COLORSPACES) );
  9. assert ( (dstColorSpace >= 0) && (dstColorSpace < NUM_COLORSPACES) );
  10. dst.reInitFrom ( src, true );
  11. if ( (srcColorSpace == COLORSPACE_RGB) && (dstColorSpace == COLORSPACE_HSL) )
  12. {
  13. assert ( dst.numChannels == 3 );
  14. assert ( src.numChannels == 3 );
  15. long k = 0;
  16. for ( int y = 0 ; y < src.ysize ; y++ )
  17. for ( int x = 0 ; x < src.xsize ; x++,k++ )
  18. {
  19. double R,G,B,H,S,L;
  20. R=(double)src.data[0][k]/srcM;
  21. G=(double)src.data[1][k]/srcM;
  22. B=(double)src.data[2][k]/srcM;
  23. ColorConversion::ccRGBtoHSL(R,G,B,&H,&S,&L);
  24. dst.data[0][k] = (DstPixelType)(H*dstM);
  25. dst.data[1][k] = (DstPixelType)(S*dstM);
  26. dst.data[2][k] = (DstPixelType)(L*dstM);
  27. }
  28. }
  29. else if ( (srcColorSpace == COLORSPACE_RGB) && (dstColorSpace == COLORSPACE_LAB) )
  30. {
  31. long k = 0;
  32. for ( int y = 0 ; y < src.ysize ; y++ )
  33. for ( int x = 0 ; x < src.xsize ; x++,k++ )
  34. {
  35. double R,G,B,X,Y,Z,L,a,b;
  36. R=(double)src.data[0][k]/255.0;
  37. G=(double)src.data[1][k]/255.0;
  38. B=(double)src.data[2][k]/255.0;
  39. ColorConversion::ccRGBtoXYZ(R,G,B,&X,&Y,&Z,0);
  40. ColorConversion::ccXYZtoCIE_Lab(X,Y,Z,&L,&a,&b,0);
  41. dst.data[0][k] = (DstPixelType)(L);
  42. dst.data[1][k] = (DstPixelType)(a);
  43. dst.data[2][k] = (DstPixelType)(b);
  44. }
  45. }
  46. else if ( (srcColorSpace == COLORSPACE_LAB) && (dstColorSpace == COLORSPACE_RGB) )
  47. {
  48. long k = 0;
  49. for ( int y = 0 ; y < src.ysize ; y++ )
  50. for ( int x = 0 ; x < src.xsize ; x++,k++ )
  51. {
  52. double R,G,B,X,Y,Z,L,a,b;
  53. L=(double)src.data[0][k];
  54. a=(double)src.data[1][k];
  55. b=(double)src.data[2][k];
  56. ColorConversion::ccCIE_LabtoXYZ(L,a,b,&X,&Y,&Z,0);
  57. ColorConversion::ccXYZtoRGB(X,Y,Z,&R,&G,&B,0);
  58. dst.data[0][k] = (DstPixelType)(R);
  59. dst.data[1][k] = (DstPixelType)(G);
  60. dst.data[2][k] = (DstPixelType)(B);
  61. }
  62. }
  63. else if ( (srcColorSpace == COLORSPACE_RGB) && (dstColorSpace == COLORSPACE_LMS) )
  64. {
  65. long k = 0;
  66. for ( int y = 0 ; y < src.ysize ; y++ )
  67. for ( int x = 0 ; x < src.xsize ; x++,k++ )
  68. {
  69. double R,G,B,X,Y,Z,L,M,S;
  70. R=(double)src.data[0][k]/srcM;
  71. G=(double)src.data[1][k]/srcM;
  72. B=(double)src.data[2][k]/srcM;
  73. ColorConversion::ccRGBtoXYZ(R,G,B,&X,&Y,&Z,0);
  74. ColorConversion::ccXYZtoLMS(X,Y,Z,&L,&M,&S);
  75. dst.data[0][k] = (DstPixelType)(L);
  76. dst.data[1][k] = (DstPixelType)(M);
  77. dst.data[2][k] = (DstPixelType)(S);
  78. }
  79. }
  80. else if ( (srcColorSpace == COLORSPACE_RGB) && (dstColorSpace == COLORSPACE_OPP) )
  81. {
  82. long k = 0;
  83. for ( int y = 0 ; y < src.ysize ; y++ )
  84. for ( int x = 0 ; x < src.xsize ; x++,k++ )
  85. {
  86. double R,G,B,X,Y,Z,L,M,S,Lum,LM,SLM;
  87. R=(double)src.data[0][k]/srcM;
  88. G=(double)src.data[1][k]/srcM;
  89. B=(double)src.data[2][k]/srcM;
  90. ColorConversion::ccRGBtoXYZ(R,G,B,&X,&Y,&Z,0);
  91. ColorConversion::ccXYZtoLMS(X,Y,Z,&L,&M,&S);
  92. ColorConversion::ccLMStoOPP(L,M,S,&Lum,&LM,&SLM);
  93. dst.data[0][k] = (DstPixelType)(Lum);
  94. dst.data[1][k] = (DstPixelType)(LM);
  95. dst.data[2][k] = (DstPixelType)(SLM);
  96. #ifdef DEBUG
  97. 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);
  98. #endif
  99. }
  100. }
  101. else {
  102. fprintf (stderr, "ColorSpace::convert(): not yet implemented - SrcColorSpace %d -> DstColorSpace %d!!\n",srcColorSpace,dstColorSpace);
  103. exit(-1);
  104. }
  105. }
  106. }