# How can I combine three hyperspectral bands into an "RGB" image?

44 views (last 30 days)
Max1000000 on 22 May 2015
I've used a toolbox to import files from ENVI and I have verified that they imported correctly. I can easily isolate the individual bands I want (if A is the image matrix then R = A(:,:,1) gets the 2D image for the first band) and they prove to be exactly what ENVI shows for individual bands, but when I combine them with cat (cat(3,R,G,B)) they seem to change drastically and lose all their detail (just a weird pixelly image of 1 or 2 colors).
Example code:
% Indicate what bands are Red, Green, and Blue % Red = 1; Green = 2; Blue = 3;
% Combines Red, Green and Blue channels to form an image
R = A(:,:,Red);
G = A(:,:,Green);
B = A(:,:,Blue);
% simply shows the separate R, G B images
figure(1);
subplot(1,3,1); imshow(R,[]); title('Red')
subplot(1,3,2); imshow(G,[]); title('Green')
subplot(1,3,3); imshow(B,[]); title('Blue')
RGBimage = cat(3, R, G, B);
figure(2); imshow(RGBimage,[]); title('RGB Image')

Image Analyst on 22 May 2015
The ranges of the individual R, G, and B may be way different. You might want to use mat2gray() to equalize them. Or else scale them all to one min and max. Attach a .mat file with A in it if you want more help.
Max1000000 on 27 May 2015
I actually ended up figuring it out using the File Exchange submission and rgb2gray to allow for colormaps.
Thanks for the help!

Walter Roberson on 26 May 2015
If you use cat(3) to combine bands into an RGB matrix and display that, then the result is a TrueColor image and colormap does not apply to TrueColor data. If you want to be able to manipulate the three images by changing colormap without redrawing the image object, then you will need to use multiple graphic objects. However in such a case how the pixels interact to form display color would be a significant consideration.
Possibly what would work for you is if you took the cat(3) result and you used rgb2ind() on it, producing both an indexed image and a colormap. Then you could manipulate the active colormap. If you did this then the triple would be mapped into an index once and those locations would change together with the colormap changes. If you need the three layers to have their colormaps individually alterable, that is potentially possible but the visual combination would be dubious. Perhaps you are looking for transparency, AlphaData, and manipulating that to show or hide the layers?

Image Analyst on 8 Mar 2017
See this paper, which goes into great detail on the hyperspectral to RGB conversion process: http://my.ece.msstate.edu/faculty/du/JSTARS-VIS.pdf

Subhadeep Koley on 31 Mar 2021
You can use the hypercube(__) function to read your ENVI file (.dat and .hdr file pair), and also the colorize(__) method will help you to estimate the RGB color image automatically.
% Read the ENVI format image (specify your image file name here)
hCube = hypercube('paviaU.hdr');
% Estimate the RGB image
rgbImg = colorize(hCube, 'method', 'rgb', 'ContrastStretching', true);
% Visualize the RGB image
figure
imshow(rgbImg)
title('RGB image')
NOTE: The above mentioned fetures come under Image Processing Toolbox's Hyperspectral Imaging Library support package, and can be downloaded from here. For more information on Hyperspectral Imaging Library see the documentation.