Matlab读取高光谱遥感数据.Mat 和 .tif(2020.12.27)


1、高光谱遥感数据简介

        遥感影像具有四种分辨率:时间分辨率、空间分辨率、辐射分辨率和光谱分辨率。其中,对于光谱分辨率而言,按照成像传感器波谱通道划分数目的多少,分为多光谱高光谱超光谱。通常认为,多光谱波段数目在100以下,高光谱波段数目在100~10000之间,超光谱波段数目在10000以上

2、两个开源的高光谱遥感数据集

        Hyperspectral Remote Sensing Scenes:包含Indian Pines、Salinas、Pavia Centre and University、Cuprite、 Kennedy Space Center、Botswana、anomaly detection(7个地区),在每个地区都会有介绍类型数量、波段数,可直接下载。
在这里插入图片描述

        Hyperspectral Images:Portion of Southern Tippecanoe County, Indiana、Northwest Tippecanoe County, Indiana、Washington DC Mall。
在这里插入图片描述
        这里,我只下载了Washington DC Mall Image的数据,如下图所示:
在这里插入图片描述

3、高光谱遥感数据常用格式

3.1 .Mat

在这里插入图片描述

3.2 .Tif

在这里插入图片描述

4、Matlab读取高光谱遥感数据

4.1 Matlab读取.Mat格式的高光谱遥感数据

        这里以Salinas.mat为例,首先打开Matlab软件,进入下载的高光谱遥感数据目录,作为工作空间;然后修改输入文件名后运行以下代码。
在这里插入图片描述

4.1.1 Matlab代码读取.mat

load('Salinas.mat')
InputMatImg=salinas;
b = size(InputMatImg);
fprintf('输入图像宽度为 %d\n',b(1));
fprintf('输入图像高度为 %d\n',b(2));
fprintf('输入图像波段数为 %d\n',b(3));
i=120;j=180;k=220;%自选三个波段
InputImg_r= InputMatImg(:,:,i);%获取第i个波段
InputImg_g= InputMatImg(:,:,j);%获取第j个波段
InputImg_b= InputMatImg(:,:,k);%获取第k个波段
InputImg_r= uint8(InputImg_r);%将i波段的灰度值转为0~255
InputImg_g= uint8(InputImg_g);%将j波段的灰度值转为0~255
InputImg_b= uint8(InputImg_b);%将k波段的灰度值转为0~255
RGBImg=cat(3,InputImg_r,InputImg_g,InputImg_b);%将i、j、k三个波段进行合成
figure;
subplot(221);imshow(InputImg_r);title('红色波段');
subplot(222);imshow(InputImg_g);title('绿色波段');
subplot(223);imshow(InputImg_b);title('蓝色波段');
subplot(224);imshow(RGBImg);title('合成波段');
imwrite(InputImg_r,['MATBand',num2str(i),'.jpg']);
imwrite(InputImg_g,['MATBand',num2str(j),'.jpg']);
imwrite(InputImg_b,['MATBand',num2str(k),'.jpg']);
imwrite(RGBImg,'compositeMATRGBimg.jpg');

4.1.2 运行结果(整合后):

第120波段
第180波段
第220波段
三波段组合
Salinas_gt

4.2 Matlab读取.tif格式的高光谱遥感数据

        这里以dc.tif(Washington DC Mall)为例,首先进入文件所在目录:
在这里插入图片描述
        Matlab代码功能:获取第i、j、k三个波段,然后合成三个波段.

4.2.1 Matlab代码读取.tif

InputTIFImage = importdata('dc.tif');
Info=imfinfo('dc.tif')
i=130;j=160;k=190;%自选三个波段
InputImage_r= InputTIFImage(:,:,i);%获取第i个波段
InputImage_g= InputTIFImage(:,:,j);%获取第j个波段
InputImage_b= InputTIFImage(:,:,k);%获取第k个波段
Image_r= uint8(InputImage_r);%将i波段的灰度值转为0~255
Image_g= uint8(InputImage_g);%将j波段的灰度值转为0~255
Image_b= uint8(InputImage_b);%将k波段的灰度值转为0~255
RGBImg=cat(3,Image_r,Image_g,Image_b);%将i、j、k三个波段进行合成
figure;
subplot(221);imshow(Image_r);title('红色波段');
subplot(222);imshow(Image_g);title('绿色波段');
subplot(223);imshow(Image_b);title('蓝色波段');
subplot(224);imshow(RGBImg);title('合成波段');
imwrite(Image_r,['TIFBand',num2str(i),'.jpg']);
imwrite(Image_g,['TIFBand',num2str(j),'.jpg']);
imwrite(Image_b,['TIFBand',num2str(k),'.jpg']);
imwrite(RGBImg,'compositeRGBTIFimg.jpg');

4.2.2 运行结果(整合后):

第130波段
第160波段
第190波段
三波段组合

5 Mat转Tif函数(MATLAB)

Mat2Tif.m函数脚本文件

%InputMatFileName如D:/360极速浏览器下载/Pavia.mat
%OutputTifFilename如D:/360极速浏览器下载/PaviaTIF.tif
% Mat2Tif('D:/360极速浏览器下载/Pavia.mat','D:/360极速浏览器下载/TifPavia.tif');
function Mat2Tif(InputMatFileName,OutputTifFilename)
    load(InputMatFileName);
    InputMatImg=pavia;
    t = Tiff(OutputTifFilename,'w');
    if size(InputMatImg,3) == 3
        t.setTag('Photometric',Tiff.Photometric.RGB);
    else
        t.setTag('Photometric',Tiff.Photometric.MinIsBlack);%颜色空间解释方式
    end
    t.setTag('Compression',Tiff.Compression.None);%无压缩
    t.setTag('BitsPerSample',64);% 由于输入.mat为double类型,所以选择了64位
    t.setTag('SamplesPerPixel',size(InputMatImg,3));% 每个像素的波段数目
    t.setTag('SampleFormat',Tiff.SampleFormat.IEEEFP);% 配合BitsPerSample64位double类型,选择IEEEFP来对应
    t.setTag('ImageLength',size(InputMatImg,1));% 影像宽度
    t.setTag('ImageWidth',size(InputMatImg,2));% 影像高度
    t.setTag('PlanarConfiguration',Tiff.PlanarConfiguration.Chunky);%平面配置选择集中式
    t.write(InputMatImg);% 准备好了头文件,开始写影像数据
    t.close();% 关闭影像
%下面的代码仅为了测试显示结果
%tdc = Tiff('D:/360极速浏览器下载/TifPavia.tif','r');
%TifPavia = read(tdc);
%close(tdc);
% i=12;j=55;k=89;%自选三个波段
% InputImg_r= TifPavia(:,:,i);%获取第i个波段
% InputImg_g= TifPavia(:,:,j);%获取第j个波段
% InputImg_b= TifPavia(:,:,k);%获取第k个波段
% InputImg_r= uint8(InputImg_r);%将i波段的灰度值转为0~255
% InputImg_g= uint8(InputImg_g);%将j波段的灰度值转为0~255
% InputImg_b= uint8(InputImg_b);%将k波段的灰度值转为0~255
% RGBImg=cat(3,InputImg_r,InputImg_g,InputImg_b);%将i、j、k三个波段进行合成
% figure;
% subplot(221);imshow(InputImg_r);title('红色波段');
% subplot(222);imshow(InputImg_g);title('绿色波段');
% subplot(223);imshow(InputImg_b);title('蓝色波段');
% subplot(224);imshow(RGBImg);title('合成波段');

        转换前Mat三波段与转换后Tif三波段显示效果对比如下图所示。
在这里插入图片描述

原始Mat的三个波段影像展示

在这里插入图片描述

原始Mat转换为Tif后的三个波段影像展示

猜你喜欢

转载自blog.csdn.net/jing_zhong/article/details/111770040
今日推荐