grayscale to RGB in matlab
35 views (last 30 days)
DGM on 24 Apr 2021
Edited: DGM on 27 May 2022
It depends what you mean when you say you want an RGB image. Consider the following image:
You can make a single-channel gray image into a multichannel gray image:
% this is a 256x256x1 grayscale image
inpict = imread('cameraman.tif');
% this is a 256x256x3 grayscale image
gray3pict = repmat(inpict,[1 1 3]);
The same can also be done using MIMT gray2rgb(), with the benefit of also handling images with alpha content.
% this is a 256x256x2 (IA) grayscale image
[ipict,~,alpha] = imread('cameramanwithalpha.png');
iapict = joinalpha(ipict,alpha);
% this is a 256x256x4 (RGBA) grayscale image
rgbapict = gray2rgb(iapict);
You can also do simple colorization by filling/zeroing channels in a similar fashion:
% it's possible to make simple primary or secondary color copies like so
zeropict = zeros(size(inpict),class(inpict));
redpict = cat(3,inpict,zeropict,zeropict);
magentapict = cat(3,inpict,zeropict,inpict);
% it's also possible to fill channels with constant values other than zero
onespict = ones(size(inpict),class(inpict));
redbluepict = cat(3,inpict,zeropict,onespict*100);
% similarly, colors other than primary/secondary colors
% can be obtained by adjusting the weights of the channels
aquapict = cat(3,0.2*inpict,0.7*inpict,inpict);
Adjusting the hue is another simple way to do the same thing.
% it's also possible to just adjust the color continously using some color model
adjustedpict = imtweak(redpict,'hsl',[-0.08,1,1]);
There are other ways to colorize that may do a better job of retaining contrast. MIMT has a very basic HSL colorization tool.
% it's possible to colorize the image using a simple purpose-built tool
gcolorized = gcolorize(repmat(inpict,[1 1 3]),[-80 100 0]);
Very similar things can be done using simple image blending techniques.
% or the same can be done using image blending
cpict = colorpict([imsize(inpict,2) 3],[150 50 255],'uint8');
blendcolorized = imblend(inpict,cpict,1,'lightness');
If you want the color to vary over the image, you can create a colored overlay (or underlay) and combine them using image blending techniques as well.
% it's also possible to colorize using some form of image blending
gradpict = lingrad([256 256 3],[0 1; 1 0],[0 0 1; 1 0 0]*255,'cosine','uint8');
blendpict = imblend(gradpict,inpict,1,'overlay');
You could also simply treat the grayscale values as indices into any arbitrary colormap.
% basic colormapping
colormapped1 = ind2rgb(inpict,parula(256));
colormapped2 = ind2rgb(inpict,hot(256));
There are several built-in colormaps, and there are many more on the File Exchange.
The functions joinalpha(), gray2rgb(), imtweak(), lingrad(), colorpict(), gcolorize(), imsize() and imblend() are part of the MIMT: