利用 MATLAB 彩色显示高光谱图像(伪彩色,真彩色)
- 前言
- 一、使用imshow函数彩色显示高光谱图像
- 注意事项:
欢迎学习交流!
邮箱: z…@1…6.com
网站: https://zephyrhours.github.io/
前言
我们平时所看到的自然图像包含RGB三个通道,区别于传统图像,由高光谱传感器获取的数据包含了很多波段,在ENVI中可以通过赋予RGB通道不同波长的波段来实现高光谱的真彩色和假彩色显示。很多从事高光谱图像处理的朋友们,基本上都是采用MATLAB进行编程,在利用MATLAB进行图像处理中,有时候会经常需要查看高光谱的真彩色和假彩色图像,因此如何利用MATLAB实现该功能也成为很多朋友们面对的一个问题,下面笔者分享自己的一些代码,希望对您的科研和工作有所帮助。
一、使用imshow函数彩色显示高光谱图像
function [rgb] = func_hyperImshow( hsi, RGBbands )
%% Hyperspectral Image color display
% Author: Zephyr Hou
% Time: 2019-12-02
% Function Usage
% Input:
% hsi—the 3D hyperspectral dataset with the size of rows x cols x bands
% RGBbands— the RGB bands to be displayed, with the format [R G B]
% Output:
% rgb- the finual result with the RGB bands with the size of (rows x cols x 3)
%% Main Functionhsi=double(hsi);
[rows, cols, bands] = size(hsi);minVal =min(hsi(:));
maxVal=max(hsi(:));
normalizedData=hsi-minVal;if(maxVal==minVal)normalizedData=zeros(size(hsi));
elsenormalizedData=normalizedData./(maxVal-minVal);
endhsi=normalizedData;[rows, cols, bands] = size(hsi);if (nargin == 1)RGBbands = [bands round(bands/2) 1];
endif (bands ==1)red = hsi(:,:);green = hsi(:,:);blue = hsi(:,:);
elsered = hsi(:,:,RGBbands(1));green = hsi(:,:,RGBbands(2));blue = hsi(:,:,RGBbands(3));
endrgb = zeros(size(hsi, 1), size(hsi, 2), 3);
rgb(:,:,1) = adapthisteq(red); % Adaptive histogram equalization
rgb(:,:,2) = adapthisteq(green);
rgb(:,:,3) = adapthisteq(blue);
imshow(rgb); axis image; % 保持图像的显示比例,其中axis为坐标轴的控制函数。
end
使用方法如下:
load('Viareggio.mat') % 导入需要显示的影像
[rgb] = func_hyperImshow(hsi,[219,144,66]); % func_hyperImshow(3D高光谱图像,[R,G,B])
如下图所示,左边为在envi中以真彩色格式显示的图像,右侧为使用该函数显示的具体效果图像。
可以看到通过matlab显示的彩色图像与ENVI中彩色显示图像基本上色彩相同,不同之处在于ENVI的的图像相对亮点,这是由于在ENVI进行图像显示时,软件对图像进行了自动2% 的线性拉伸,因此ENVI显示图像会稍微显得亮点。
这样通过不同的波段选择即可实现不同高光谱图像的真彩色和假彩色显示。
注意事项:
- 该代码基于matlab 2018a编写,如果不能显示,请排查输入数据格式,函数是否正确使用,matlab版本(如果版本太低,可能有些函数不支持,需要修改);
- 该函数已经在很多组高光谱数据上进行了测试,没有问题,indian_pines等绝大多数据没有问题;