rgbImage = grayImage / max(max(grayImage));
or
rgbImage = grayImage / 255;
Which of the above is right,and reason?
rgbImage = grayImage / max(max(grayImage));
or
rgbImage = grayImage / 255;
Which of the above is right,and reason?
By definition, an RGB image has 3 channels, which implies you need a three-dimensional matrix to represent the image. So, the right answer is:
rgbImage = repmat(255*grayImage/max(grayImage(:)),[1 1 3]);
Be careful when normalizing grayImage
. If grayImage
is uint8
then you will lose some precision in the 255*grayImage/max(grayImage(:))
operation.
Also, normalizing grayImage
depends on the data. In your question, you used two methods:
rgbImage = grayImage / max(max(grayImage));
which normalizes the grayscale image such that the maximum value in the image is 1
and
rgbImage = grayImage / 255;
which only makes sense if the values in grayImage
lie in the 0-255
range.
So it really depends on what you want to do. But, if you want an RGB image you need to convert your single-channel matrix to a 3-channel matrix.
To convert a grayscale image to an RGB image, there are two issues you have to address:
double
data type, the image pixel values should be floating point numbers in the range of 0 to 1. When stored as a uint8
data type, the image pixel values should be integers in the range of 0 to 255. You can check the data type of an image matrix using the function CLASS.Here are 3 typical conditions you might encounter:
To convert a uint8
or double
grayscale image to an RGB image of the same data type, you can use the functions REPMAT or CAT:
rgbImage = repmat(grayImage,[1 1 3]);
rgbImage = cat(3,grayImage,grayImage,grayImage);
To convert a uint8
grayscale image to a double
RGB image, you should convert to double
first, then scale by 255:
rgbImage = repmat(double(grayImage)./255,[1 1 3]);
To convert a double
grayscale image to a uint8
RGB image, you should scale by 255 first, then convert to uint8
:
rgbImage = repmat(uint8(255.*grayImage),[1 1 3]);