MATLAB图像处理与应用

本文介绍了如何使用MATLAB进行遥感图像的读写操作,包括头文件处理、数据类型判断和数据读取。重点讲解了直方图均衡化、指数变换、对数变换和线性拉伸等图像增强技术,并展示了小波变换和内置融合函数在遥感图像融合中的应用实例。
摘要由CSDN通过智能技术生成

一、遥感图像的读写

相关函数:multibandreadmultibandwrite
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);

另:参考博客

二、遥感图像增强

  1. 直方图均衡化
  2. 指数变换
  3. 对数变换
  4. 线性拉伸
  • 直方图均衡化
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('融合后');

四、图像处理常用函数

  1. 读写图像文件

imread 、imwrite 、imfinfo 、multibandread 、multibandwrite

  1. 图像的显示

imshow 、colorbar 、figure

  1. 图像的变换

fft2二维傅里叶变换
ifft2二维傅里叶反变换
fft2可以进行卷积,然后用conv2校验

  1. 模拟噪声生成函数和预定义滤波器

imnoise 、fspecial

  1. 图像的增强

imhist直方图
histeq直方图均衡化
log对数变换
filter2基于卷积的图像滤波函数
conv2线性滤波
medfilt2中值滤波
锐化:Sobel算子、拉普拉斯算子

  1. 图像的分析

P=impixel(I)%交互式获取图像像素值
P=impixel(I,c,r)%指定点坐标像素值,c,r为行坐标和列坐标

im2uint8,im2double和uint8,double

在这里插入图片描述

  • 0
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值