Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Color Decorrelation

Hi people. Im doing a translation from Matlab to C++. That' s code in Matlab I have to put in C++

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % Color Decorrelation
 % Input Parameters:
 %  im           - image matrix
 %  numColComp   - number of image channels
 %
 % Output value:
 %  Xdecorr  - decorrelated image, same dimensions as the original one
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 function Xdecorr=colorDecorrelation(X,numColComp)

 if numColComp>1  %color images
 mu = mean(X); %mean of each feature of the original data
 X = bsxfun(@minus, X, mu);
 A = X'*X;   %cavariance matrix
 [V,D,notused] = svd(A);

 Xdecorr=X*V;

 else % in case of a grayscale image
    Xdecorr = X;
 end

My translation in C++

 Mat colorDecorrelation(Mat img,int numColComp){

 Mat V,D,A,Xdecorr,img_tr,img_f;
 Scalar mu;
 SVD svd;

 if(numColComp>1){

    //I have to convert because of gemm function need a float
    img.convertTo(img_f,CV_32FC3);
    img_f=img_f.reshape(1,img.rows*img.cols); // 1 channel

     mu=mean(img_f); 
     subtract(img_f,mu,img_f);
    transpose(img_f,img_tr);
     A = img_tr * img_f;
    V = svd(A).u; 
    Xdecorr = img_f*V;

 }
  else 
   Xdecorr=img;

 return Xdecorr;
 }

Do you think is it ok?