一、遥感图像的读写
相关函数:multibandread
与multibandwrite
1.遥感图像头文件读取
fid=fopen('OLI2017_sub.hdr','r');
info=fread(fid,'char=>char');%字符型或字符型
info=info';
display(info);%%fprintf(info);
fclose(fid);
2.读取列数、行数、波段数、数据类型
- 列数
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);
- 数据类型同理,其中的data type
%case=1 对应ENVI中的数据类型为Byte,对应MATLAB中的数据类型为unit8
%case=2 对应ENVI中的数据类型为Integer,对应MATLAB中的数据类型为unit16
%case=12 对应ENVI中的数据类型为Unsigned Int,对应MATLAB中的数据类型为unit16
%case=3 对应ENVI中的数据类型为Long Integer,对应MATLAB中的数据类型为unit32
%case=13 对应ENVI中的数据类型为Unsigned Long,对应MATLAB中的数据类型为unit32
%case=4 对应ENVI中的数据类型为Floating Point,对应MATLAB中的数据类型为float32
%case=5 对应ENVI中的数据类型为Double Precision,对应MATLAB中的数据类型为double
%otherwise 除以上几种常见的数据类型之外的数据类型视为无效的数据类型
- 数据格式同上
3.遥感图像数据读取与显示
%读取图像
data=multibandread('OLI2017_sub.dat',[lines,samples,bands],'double',0,'bil','ieee-le');%有问题啊。。。把[lines,samples,bands]参数值调小点就可以了
% % 错误使用 multibandread (line 118)
% % 文件太小,无法包含指定的数据。请检查大小、偏移和精度参数
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)=unit8((data_unit8(i,j,k)-min_val)/(max_val-min_val)*255;
end
end
end
%单波段遥感图像显示
im1=data_unit8(:,:,k);
figure;imshow(im1);
%真彩色显示
im3=data_unit8(:,:,6:8);
figure;imshow(im3);
%假彩色显示
i3m=data_unit8(:,:,5:7);
figure;inshow(i3m);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%另一种方法,用ENVI将影像转化为.tif的格式,然后
I=imread('sub_01.tif');
im1=I(:,:,3);
imshow(im1);
二、遥感图像增强
- 直方图均衡化
- 指数变换
- 对数变换
- 线性拉伸
- 直方图均衡化
I=imread('sub_01.tif');
im1=I(:,:,1);
[r, c, b]=size(im1);
%转化为8bit图像,以1波段为例
min_val=min(min(im1));
max_val=max(max(im1));
for i=1:r
for j=1:c
im1(i,j)=255*(im1(i,j)-min_val)/(max_val-min_val);
end
end
im1=uint8(im1);
figure(1);
subplot(2,2,1),imshow(im1),title('原图');
subplot(2,2,2),imhist(im1),title('原图直方图');
eq=histeq(im1);
subplot(2,2,3),imshow(eq),title('直方图均衡化');
subplot(2,2,4),imhist(eq),title('直方图均衡化后的');
- 指数变换
I=imread('sub_01.tif');
im1=I(:,:,1);
im0=im1;
[r, c, b]=size(im1);
Gamma=0.4;
C=1;
im1=C*(double(im1).^Gamma); %double类型运算
%归一化
min_val=min(min(im1));
max_val=max(max(im1));
for i=1:r
for j=1:c
im1(i,j)=255*(im1(i,j)-min_val)/(max_val-min_val);
end
end
im1=uint8(im1);
figure(1);
subplot(2,2,1),imshow(im0),title('原图');
subplot(2,2,2),imhist(im0),title('原图直方图');
subplot(2,2,3),imshow(im1),xlabel('\gamma=0.4');
subplot(2,2,4),imhist(im1),title('直方图均衡化后的');
- 对数变换
I=imread('sub_01.tif');
im1=double(I(:,:,1));
[r, c, b]=size(im1);
C=1.0;
v1=10;v2=100;v3=200;
f1=C*log2(1+v1*im1)/log2(v1+1); %double类型运算
f2=C*log2(1+v2*im1)/log2(v2+1);
f3=C*log2(1+v3*im1)/log2(v3+1);
%归一化
min_val1=min(min(f1));
max_val1=max(max(f1));
min_val2=min(min(f2));
max_val2=max(max(f2));
min_val3=min(min(f3));
max_val3=max(max(f3));
for i=1:r
for j=1:c
f1(i,j)=255*(f1(i,j)-min_val1)/(max_val1-min_val1);
f2(i,j)=255*(f2(i,j)-min_val2)/(max_val2-min_val2);
f3(i,j)=255*(f3(i,j)-min_val3)/(max_val3-min_val3);
end
end
f1=uint8(f1);
f2=uint8(f2);
f3=uint8(f3);
figure(1);
subplot(2,2,1),imshow(I(:,:,1)),title('原图');
subplot(2,2,2),imshow(f1),title('v=10');
subplot(2,2,3),imshow(f2),xlabel('v=100');
subplot(2,2,4),imshow(f3),title('v=200');
- 线性拉伸
I=imread('sub_01.tif');
im1=I(:,:,1);
[r, c, b]=size(im1);
%遥感图像读入的是uint16的需要转化为uint8然后再显示
imshow(im1);title('原图像');
mid=mean(mean(im1));
%横轴
fa=20;fb=120;
%纵轴
ga=100;gb=255;
dst_img=uint8(zeros(r,c));
im1=double(im1);
%三段斜率
k1=ga/fa;
k2=(gb-ga)/(fb-fa);
k3=(255-gb)/(255-fb);
for i=1:r
for j=1:c
if im1(i,j)<=fa
dst_img(i,j)=k1*g(i,j);
elseif fa<im1(i,j)&&im1(i,j)<=fb
dst_img(i,j)=k2*(g(i,j)-fa)+ga;
else
dst_img(i,j)=k3*(im1(i,j)-fb)+gb;
end
end
end
dis_img=uint8(dst_img);
J=dst_img;
figure(2);imshow(J);title('线性变换图像');
三、遥感图像融合
%%1.小波变换融合
X1=data(:,:,6);
min_val=min(min(X1));
max_val=max(max(X1));
for i=1:lines
for j=1:samples
X1(i,j)=255*(X1(i,j)-min_val)/(max_val-min_val);
end
end
X1=double(X1)/256;
figure;imshow(X1),title('高分辨率');
axis square;
X2=data(:,:,10);
min_val=min(min(X2));
max_val=max(max(X2));
for i=1:lines
for j=1:samples
X2(i,j)=255*(X2(i,j)-min_val)/(max_val-min_val);
end
end
X2=double(X2)/256;
figure;imshow(X2),title('低分辨率');
axis square;
[c1,s1]=wavedec2(X1,2,'syms4');%将x1进行2维,使用'syms'进行变换
sizec1=size(c1);
for i=1:sizec1(2)
c1(i)=1.2*c1(i); %将分解后的值扩大1.2倍
end
[c2,s2]=wavedec2(X2,2,'syms4');%将x1进行2维,使用'syms'进行变换
c=(c1+c2)/2;
s1=(s1+s2)/2;
xx=waverec2(c,s,'sym4'); %进行重构
figure;imshow(xx),title('融合后的遥感图像');
axis square;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%2.利用自带融合函数实现融合
X1=data(:,:,6);
min_val=min(min(X1));
max_val=max(max(X1));
for i=1:lines
for j=1:samples
X1(i,j)=255*(X1(i,j)-min_val)/(max_val-min_val);
end
end
X2=data(:,:,10);
min_val=min(min(X2));
max_val=max(max(X2));
for i=1:lines
for j=1:samples
X2(i,j)=255*(X2(i,j)-min_val)/(max_val-min_val);
end
end
XFUS=wfusimg(X1,X2,'sym4',5,'max','max');
min_val=min(min(XFUS));
max_val=max(max(XFUS));
for i=1:lines
for j=1:samples
XFUS(i,j)=(XFUS(i,j)-min_val)/(max_val-min_val)*255;
end
end
%显示融合后图像
X1=uint8(X1);
X2=uint8(X2);
XFUS=uint8(XFUS);
subplot(1,3,1),imshow(X1),axis square,title('高分辨率');
subplot(1,3,2),imshow(X2),axis square,title('低分辨率');
subplot(1,3,3),imshow(XFUS),axis square,title('融合后');
四、图像处理常用函数
- 读写图像文件
imread 、imwrite 、imfinfo 、multibandread 、multibandwrite
- 图像的显示
imshow 、colorbar 、figure
- 图像的变换
fft2二维傅里叶变换
ifft2二维傅里叶反变换
fft2可以进行卷积,然后用conv2校验
- 模拟噪声生成函数和预定义滤波器
imnoise 、fspecial
- 图像的增强
imhist直方图
histeq直方图均衡化
log对数变换
filter2基于卷积的图像滤波函数
conv2线性滤波
medfilt2中值滤波
锐化:Sobel算子、拉普拉斯算子
- 图像的分析
P=impixel(I)%交互式获取图像像素值
P=impixel(I,c,r)%指定点坐标像素值,c,r为行坐标和列坐标
im2uint8,im2double和uint8,double