# Revision history [back]

### Image processing project with an error I can not solve

Hi people. I hope you can help me to solve this problem I can not solve from long time. I have to finish a project about image processing and I saw an error in the initial step. I have a code in Matlab I have to obtain it in C++ with OpenCV. I did not study Matlab and C++ neither too (just C) , so I don t know how continue my work. Please help.

As in this picture : C:\fakepath\imag.png

the initial target is :

Initial decorrelation on RGB color components of each image/frame to have an efficient codification (without duplication)of the input data through analysis of the principal components(PCA),adapted to local image statistics (rgbDecorr in Matlab's code). We obtain so 3 components Z1,Z2,Z3 in the image attached in the block figure Whitening color. This operation is performed by colorDecorrelaion function().

Matlab' s code :

 //initial stuff
numColComp = compc; % 3 in case of color images, 1 in grayscale images
inComp = reshape(im, r*c, numColComp);

Decorr=colorDecorrelation(inComp,numColComp);

rgbDecorr= reshape(Decorr, r, c, numColComp); //HERE

clear Decorr;

% Fourier transform of the achromatic component

//more stuff

conspic2 = zeros(r,c);

for i_c_comp=2:numColComp

% FILTERING CHROMATIC COMPONENT rgbDecorr(:,:,2) and  rgbDecorr(:,:,2)


I don t understand in Matlab where is obtained the 3 components. I supposed where I commented HERE and I suppose but I m not sure that is created a 3dimensional array where in a dimension is located the 3 components. Am I right? How to do it and how to obtain this stuff? I don t understan where it obtain this 3 images of the image attached by the input image:

Howewer here the colorDecorrelation function MAtlab's code:

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;
[V,D,notused] = svd(A);

Xdecorr=X*V;

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


So In C++ what I did is:

//initial statements and Image control if empty or not

inCompImg = img.reshape(numColComp,(img.rows)*(img.cols));
imgDecorr = colorDecorrelation(inCompImg,img.channels());

// TO RETURN INITIAL VALUES BEACUSE I HAD TO CHANGE IT IN COLORDECORRELATION FUNCTION
imgDecorr.convertTo(rgbDecorrImg,CV_8UC3);

//HERE ERROR FOR SURE
rgbDecorrImg = rgbDecorrImg.reshape(numColComp,imgDecorr.rows);

...
...

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); //media degli elementi della matrice
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;
}