实验七 遥感图像读取
一、实验目的
- 熟悉MATLAB中遥感图像读写的格式;
- 掌握多波段遥感图像的读取与存储;
- 掌握多波段遥感图像中单波段、不同波段的组合显示。
二、实验仪器及设备
计算机、Matlab图像处理软件、Landsat8遥感图像
三、实验基础
1.实验遥感图像简介
2013年2月11日Landsat8卫星成功发射,设计寿命为五年,星上携带两个主要设备,陆地成像仪和热红外传感器。陆地成像仪共11个波段,其中可见光,近红外,短波红外波段空间分辨率为30米,热红外波段空间分辨率为100米,全色波段分辨率为15米,成像宽幅185kmx185km。陆地成像仪包括ETEM+传感器的所有波段,但为了避免大气吸收特征,对波段进行了重新调整,比较大的调整是band5,排除了0.825um处水汽吸收特征,全做波段band8范围较窄,可以在全色图像上更好地区分植被和无植被特征,此外还增强了两个波段蓝色波段,主要应用于海岸带观测短波红外波段。包括水汽强吸收特征,可用于云检测,近红外和短波红外波段与modest对应的波段接近。
2.相关函数
MATLAB中用于多波段图像读写的函数包括multibandread和multibandwtite。
四、实验内容及步骤
- 遥感图像头文件读取
clc;clear;
hdrname='D:\Remote_sensing\ENVI实验数据\ENVI_shiyuan_dt\shiyan\LC81230322013276LGN00_MTL_shiyan.hdr';
fid=fopen(hdrname,'r');
info=fread(fid,'char=>char');
info=info';%转置为行向量
fprintf(info);%界面输出打印显示
fclose(fid);
>> rs_hdr
ENVI
description = {
Calibrated Radiance from LC81230322013276LGN00_MTL_MultiSpectral}
samples = 7771
lines = 7901
bands = 7
data type = 4
interleave = bil
file type = ENVI Standard
header offset = 0
byte order = 0
map info = {
UTM, 1.000, 1.000, 358485.000, 4582815.000, 3.000000e+001, 3.000000e+001, 50, North, WGS-84, units=Meters}
coordinate system string = {
PROJCS["WGS_1984_UTM_Zone_50N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",117.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]}
default bands = {
4,3,2}
band names = {
Coastal aerosol, Blue, Green, Red, Near Infrared (NIR), SWIR 1, SWIR 2}
wavelength = {
0.443000, 0.482600, 0.561300, 0.654600, 0.864600, 1.609000, 2.201000}
fwhm = {
0.016000, 0.060100, 0.057400, 0.037500, 0.028200, 0.084700, 0.186700}
wavelength units = Micrometers
data ignore value = 0.00000000e+000
sun azimuth = 156.793278
sun elevation = 43.279056
cloud cover = 6.400000
earth sun distance = 1.000646
sensor type = Landsat OLI
acquisition time = 2013-10-03T02:55:24.3050919Z
calibration scale factor = 0.100000
data units = W m^-2 sr^-1 um^-1
image quality = 9
- 遥感图像基本信息读取
%读取列数、行数、波段数、数据类型
%列数
ac=strfind(info,'samples = ');
bc=length('samples = ');
cc=strfind(info,'lines ');
samples=[];
for i=ac+bc:cc-1
samples=[samples,info(i)];
end
samples=str2num(samples);
%行数
ar=strfind(info,'lines = ');
br=length('lines = ');
cr=strfind(info,'bands ');
lines=[];
for i=ar+br:cr-1
lines=[lines,info(i)];
end
lines=str2num(lines);
%波段数
ab=strfind(info,'bands = ');
bb=length('bands = ');
cb=strfind(info,'data type ');
bands=[];
for i=ab+bb:cb-1
bands=[bands,info(i)];
end
bands=str2num(bands);
%数据类型
ab=strfind(info,'data type = ');
bb=length('data type = ');
cb=strfind(info,'interleave');
datatype=[];
for i=ab+bb:cb-1
datatype=[datatype,info(i)];
end
datatype=str2num(datatype);
precision=[];
switch datatype
case 1
precision='unit8=>unit8';
case 2
precision='int16=>int16';
case 12
precision='unit16=>unit16';
case 3
precision='int32=>int32';
case 13
precision='unit32=>unit32';
case 4
precision='float32=>float32';
case 5
precision='double=>double';
end
%数据格式
at=strfind(info,'interleave = ');
bt=length('interleave = ');
ct=strfind(info,'sensor type ');
interleave=[];
for i=at+bt:ct-1
interleave=[interleave,info(i)];
end
interleave=strtrim(interleave);
fprintf('Lines=%i\nSamples=%i\nDataType=%s\n',lines,samples,interleave);
运行结果:
Lines=589
Samples=766
DataType=bsq
- 遥感图像数据读取与显示
遥感图像大多数具有多波段,MATLAB中用于多波段图像读写的函数包括multibandread和multibandwtite。
%读取图像数据
imgfilename='F:\数字图像处理\Landsat8_image.dat';
fid=fopen(imgfilename,'r');
data=multibandread(imgfilename,[lines,samples,7],precision,0,'bsq','ieee-le');
data=double(data);
%数值转换为0-255的整型用于显示
data_unit8=data;
for k=1:bands
min_val=min(data(:,:,k));
max_val=max(data(:,:,k));
for i=1:lines
for j=1:samples
data_unit8(i,j,k)=uint8((data_unit8(i,j,k)-min_val)/(max_val-min_val)*255);
end
end
end
%单波段遥感图像显示
%数值转为0-255的整型用于显示
data_show=data;
for k=1:bands
min_val=min(data(:,:,k));
max_val=max(data(:,:,k));
for i=1:lines
for j=1:samples
data_show(i,j,k)=uint8((data_show(i,j,k)-min_val)/(max_val-min_val)*255);
end
end
end
%单波段遥感图像显示
im1=data_show(:,:,1);
im2=data_show(:,:,2);
im3=data_show(:,:,3);
im4=data_show(:,:,4);
im5=data_show(:,:,5);
im6=data_show(:,:,6);
im7=data_show(:,:,7);
im1=uint8(im1);
im2=uint8(im2);
im3=uint8(im3);
im4=uint8(im4);
im5=uint8(im5);
im6=uint8(im6);
im7=uint8(im7);
figure;imshow(im1);
figure;imshow(im2);
figure;imshow(im3);
figure;imshow(im4);
figure;imshow(im5);
figure;imshow(im6);
figure;imshow(im7);
%真彩色显示
im3=data_show(:,:,1:3);
im3=uint8(im3);
figure;imshow(im3);
%假彩色显示
im3=data_show(:,:,4:6);
im3=uint8(im3);
figure;imshow(im3);
图一 遥感图像各波段显示
4. 遥感图像存储
%按照BIL存储类型存储所有波段
multibandwrite(data,'data.bil','bil');
%以存储32bit单波段为例
numbands=1;
for band=1:numbands
multibandwrite(data(:,:,band),'banddata.bsq','bsq','machfmt','ieee-le','precision',interleave);
end
五、实验心得
1.学会了使用multibandread和multibandwtite函数处理遥感影像。
2. 对遥感影像的头文件里的内容有了更加深入的了解。