Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

How to perform automatic conversion of matrix dimensions of images in a way that it works for both rgb and grayscale ??

Asked by Lian Guite on 15 Feb 2013

To perform face recognition, i have a train database with some images. The images in train database need to be pre-processed before they are used for comparison with the test image, which is the input image.

This is what i have done :

    T = [];
    for i = 1 : Train_Number
    str = int2str(i);
    str = strcat('\',str,'.jpg');
    str = strcat(TrainDatabasePath,str);
    img = imread(str);
    img = rgb2gray(img);
    img = imresize(img, [200 180]);
    [irow icol] = size(img);    
    temp = reshape(img',irow*icol,1);  
    % temp = reshape(permute(double(img), [2,1,3]), irow*icol, 1);
    T = [T temp]; % 'T' grows after each turn                    
    end

This works fine when the train database contains only rgb images. But for grayscale images, it gives error related to dimensions.

How can i make it work for both rgb and grayscale ??

2 Comments

Jan Simon on 15 Feb 2013

Please do not only claim, that there is an error, but post the message and mention the line also. The less we have to guess, the more efficient is an answer. Thanks.

Lian Guite on 15 Feb 2013

Ok.. When i include a grayscale image in the database, i get an error.

This is my code :

    T = [];
    for i = 1 : Train_Number
    str = int2str(i);
    str = strcat('\',str,'.jpg');
    str = strcat(TrainDatabasePath,str);
    img = imread(str);
%   img = rgb2gray(img);
    img = imresize(img, [200 180]);
    [irow icol] = size(img);    
    temp = reshape(permute(double(img), [2,1,3]), irow*icol, 1);
    T = [T temp]; % 'T' grows after each turn   
    end

This is the error i get :

*??? Error using ==> horzcat

   CAT arguments dimensions are not consistent.

Error in ==> CreateDatabase at 50

    T = [T temp]; % 'T' grows after each turn*
Lian Guite

Products

No products are associated with this question.

1 Answer

Answer by Jan Simon on 15 Feb 2013
Edited by Jan Simon on 15 Feb 2013
Accepted answer

Some cleanup and an implicit conversion of grayscale images to pseudo-RGB:

    nCol = 200;
    nRow = 180;
    % BUG?! T    = nan(nCol * nRow, Train_Number);  % Pre-allocate!!!
    T    = nan(nCol * nRow * 3, Train_Number);  % Pre-allocate!!! [EDITED]
    for i = 1 : Train_Number
       filename = fullfile(TrainDatabasePath, sprintf('%d.jpg', i));
       img = imread(filename);
       if ndims(img) == 2                       % Gray scale image:
          img = double(cat(3, img, img, img));  % Pseudo RGB image
       end
       img = imresize(img, [nCol, nRow]);
       temp = permute(img, [2,1,3]);
       T(:, i) = temp(:);
    end

But, I do not expect that the training of a face recognition system is efficient, when you feed it with RGB and gray-scale images. I'd prefer converting the RGB to gray scale instead.

img = rgb2gray(img);

6 Comments

Jan Simon on 15 Feb 2013

@Lian: There is no chance that I can guess the size and type of "m" in your code. So please use the debugger: dbstop if error and find the sizes of the variables. Perhaps you need bsxfun, or imresize(m, 200, 180), or reshape(m, ...) also. In any way, please try to solve this by your own at first.

Lian Guite on 15 Feb 2013

Bugs are gone !!

Thanks to Image Analyst for the video tutorial.. Its exactly what i needed. And Thanks Jan Simon for all the suggestions..

This was the problem :

 InImage : unint8 36000x1
 m : double 108000x1
 Eigenfaces : double 108000x20

So i converted all of them to double 36000x1 using imresize.

Is that the right way to solve it ?? Anyway, it works fine for the bugs.

Now one last thing, the end result is not matching exactly, which means it selects the wrong image. While i was trying with only RGB images, it was identifying the exact image, and matching the test image with the train image.

Is this inaccuracy caused because of the dimension conversion ??

Jan Simon

Contact us