简体   繁体   中英

How to convert a grayscale matrix to an RGB matrix in MATLAB?

rgbImage = grayImage / max(max(grayImage));

or

rgbImage = grayImage / 255;

Which of the above is right,and reason?

To convert a grayscale image to an RGB image , there are two issues you have to address:

  • Grayscale images are 2-D, while RGB images are 3-D, so you have to replicate the grayscale image data three times and concatenate the three copies along a third dimension.
  • Image data can be stored in many different data types , so you have to convert them accordingly. When stored as a 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]); 

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM