Advertisement
Guest User

Untitled

a guest
Oct 4th, 2015
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. void RGB2LAB4Pix(Vec3b* dst, Vec3b* src)
  2. {
  3.     //                                RGB —> XYZ                                //
  4.     double var_R = ( (double)src->val[2] / 255 );       //R from 0 to 255
  5.     double var_G = ( (double)src->val[1] / 255 ) ;      //G from 0 to 255
  6.     double var_B = ( (double)src->val[0] / 255 ) ;      //B from 0 to 255
  7.  
  8.     if ( var_R > 0.04045 )
  9.         var_R = pow(( ( var_R + 0.055 ) / 1.055 ), 2.4);
  10.     else                  
  11.         var_R = var_R / 12.92;
  12.  
  13.     if ( var_G > 0.04045 )
  14.         var_G = pow(( ( var_G + 0.055 ) / 1.055 ), 2.4);
  15.     else                  
  16.         var_G = var_G / 12.92;
  17.  
  18.     if ( var_B > 0.04045 )
  19.         var_B = pow(( ( var_B + 0.055 ) / 1.055 ), 2.4);
  20.     else                  
  21.         var_B = var_B / 12.92;
  22.  
  23.     var_R = var_R * 100;
  24.     var_G = var_G * 100;
  25.     var_B = var_B * 100;
  26.  
  27.     //Observer. = 2°, Illuminant = D65
  28.     double X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805;
  29.     double Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722;
  30.     double Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505;
  31.  
  32.     //                             XYZ —> CIE-L*ab                             //
  33.  
  34.     double var_X = X / 95.047;          //ref_X =  95.047   Observer= 2°, Illuminant= D65
  35.     double var_Y = Y / 100.000;          //ref_Y = 100.000
  36.     double var_Z = Z / 108.883;          //ref_Z = 108.883
  37.  
  38.     if ( var_X > 0.008856 )
  39.         var_X = pow(var_X, double(0.333333));
  40.     else                    
  41.         var_X = ( 7.787 * var_X ) + ( 16 / 116 );
  42.  
  43.     if ( var_Y > 0.008856 )
  44.         var_Y = pow(var_Y, double(0.333333));
  45.     else                    
  46.         var_Y = ( 7.787 * var_Y ) + ( 16 / 116 );
  47.  
  48.     if ( var_Z > 0.008856 )
  49.         var_Z = pow(var_Z, double(0.333333));
  50.     else                    
  51.         var_Z = ( 7.787 * var_Z ) + ( 16 / 116 );
  52.  
  53.     double CIEL = ( 116 * var_Y ) - 16;
  54.     double CIEa = 500 * ( var_X - var_Y );
  55.     double CIEb = 200 * ( var_Y - var_Z );
  56.  
  57.     dst->val[2] = (uchar)CIEL;
  58.     dst->val[1] = (uchar)CIEa;
  59.     dst->val[0] = (uchar)CIEb;
  60. }
  61. void TaskG()
  62. {
  63.     Mat Image = imread("lena.jpg");
  64.     Mat ImageLab;
  65.     Mat ImageLabCV;
  66.     Image.copyTo(ImageLab);
  67.     cvtColor(Image, ImageLabCV, CV_RGB2Lab);
  68.     imwrite("LenaLabCV.jpg", ImageLabCV);
  69.  
  70.     //Попиксельно переводим RGB -> LAB
  71.     for(int y = 0; y < Image.rows; ++y)
  72.     {
  73.         for(int x = 0; x < Image.cols; ++x)
  74.         {
  75.             RGB2LAB4Pix(&ImageLab.at<Vec3b>(y, x), &Image.at<Vec3b>(y, x));
  76.         }
  77.     }
  78.  
  79.     Mat LabDifference;
  80.     LabDifference = abs(ImageLabCV - ImageLab);
  81.     imwrite("LenaLabDifference.jpg", LabDifference);
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement