SrSbSd
SrSbSd

Reputation: 219

problems with imshow() and rgb2gray() in MATLAB

Good afternoon,

when running the following code:

testImage = double(imread(testfile));
figure; imshow(testImage)
greyTestImage = rgb2gray(testImage);
figure; imshow(greyTestImage)

I get unclear and mostly blank Images, I was unable to fx it using the colormap. The following is teh original image and the two resulting figures:

1: original image

2: result of imshow

3: image after rgb2gray

Upvotes: 2

Views: 7147

Answers (4)

kiki
kiki

Reputation: 445

Actually, Matlab provides the function Im2double instead of double to convert images to double precison:

testImage = im2double(imread(testfile));
figure; imshow(testImage)
greyTestImage = rgb2gray(testImage);
figure; imshow(greyTestImage)

In double precision, image RGB values are between 0 and 1, for uint8 they range between 0 and 127. When you use the double function, all RGB values keep their value, but they are in double precision. This means that any RBG tiple with values >= 1 will result in a double >= 1 and thus produce a white space in your image. im2doubleactually scales the values to the range [0 1].

Upvotes: 1

user2613077
user2613077

Reputation: 78

Have you tried converting to 8 bit unsigned integers?

testImage = double(imread('PEYXW.jpg'));
figure; imshow(uint8(testImage))
greyTestImage = rgb2gray(uint8(testImage));
figure; imshow(greyTestImage) 

first image

second image

Upvotes: 2

CTZStef
CTZStef

Reputation: 1715

You have to know the format of the image you are trying to read. To make this sure, I always use the following piece of code in my programs when I want to convert user defined image from unknown format to uint8 grayscale :

    % load image
    [filename, pathname] = uigetfile({'*.*'},'image file');
    fullFilename = [pathname filename];
    % Get image info, read it accordingly
    info = imfinfo(fullFilename);
    if(strcmp('truecolor',info.ColorType))
        I = imread(fullFilename);
        Igray = uint8(rgb2gray(I));
        clear I
    elseif(strcmp('grayscale',info.ColorType))
        Igray = uint8(imread(fullFilename));
    elseif(strcmp('indexed',info.ColorType))
        [I,map] = imread(fullFilename);
        Igray = uint8(ind2gray(I,map));
        clear I map
    else
        error('statPart:FormatImage','Image format error');
    end
    clear info

Also, this : testImage = double(imread(testfile)); won't work if you assume testfile is uint8 and want to convert it to double (in double intensity shall range from 0 to 1). You have to do testImage = double(imread(testfile)) / 255;

Hope this help.

Cheers

Upvotes: 5

Smash
Smash

Reputation: 3802

This is probably an issue with the image you are loading.

The input to the rgb2gray function needs to be a 3-channel color image (MxNx3 matrix for the R,G,B channels).

If you use a built-in Matlab sample image, you can effectively do:

imdata = imread('ngc6543a.jpg');

figure; imshow(imdata)

enter image description here

Then:

test = rgb2gray(imdata);

enter image description here

Upvotes: 1

Related Questions