MATLAB代码实现---遥感图像预处理系统

功能介绍

(严格意义上不能称得上系统,只能说是一个处理流程介绍吧。)
对spot和tm影像进行几何校正,各截取出同一区域(任一区域),重采样后采用HIS融合方法进行融合,HIS变换融合方法首先将空间分辨率低的3波段多光谱影像变换到HIS空间,得到色度H、明度I、饱和度S3分量;然后将高空间分辨率影像进行对比度拉伸,使之与I分量有相同的均值和方差。HIS变换融合主要步骤如下:

  1. 将多光谱图像作IHS变换,分别得I,H,S 3个分量;
  2. 将全色图像和I分量图像进行灰度直方图匹配,然后用全色图像代替I分量作为新的I分量;
  3. 利用新的I分量和原来的H,S分量作RGB变换即得到融合后的图像。

代码实现

1.几何校正

读取图片,通过cpselect函数在两张待处理图片中选取配准点对。最后将点对文件进行保存。然后使用fitgeotrans函数建立两组点对之间的映射关系,得到一个变换矩阵。最后基于该变化矩阵,使用imwarp函数对tm影像进行图像变换。得到了校正后的tm影像。
代码
在这里插入图片描述

2.裁剪

为了便于后续的HIS变换,需要在spot影像和校准后的tm影像中裁剪出同一块区域。因为两幅影像的尺寸不同,同一个地物在两个影像中的坐标位置也就不一样,因此要找到两幅影像间点对点的映射关系,才能得到一幅影像地物在另一幅影像中的对应坐标范围,进而才能裁剪出同一范围的地图影像。通过步骤cpselect函数找spot影像和校准后的tm影像之间的几组配准点对,然后通过fitgeotrans函数得到映射关系,使用transformPointsForward函数得到spot影像上一点在校准后的tm影像中对应的坐标关系,然后选择合适的范围,使用imcrop函数对这两幅影像进行裁剪。
在这里插入图片描述
在这里插入图片描述

3.HIS变换

先把tm影像通过rgb2hsv函数转成hsv格式,然后然后提取I分量的数据。使用histeq函数对spot影像进行直方图均衡化,然后把直方图均衡化后的spot影像的值使用imdouble转换成双精度,使其与hsv格式的tm影像的值类型一样。用上一步得到的spot影像替换把tm影像的I分量,最后通过hsv2rgb函数把hsv格式的tm影像转成rgb格式用imshow函数显示即可。
在这里插入图片描述
在这里插入图片描述

4.完整代码

完整代码及运行结果如下:

clc,clear
spot = imread('D:/桌面/sp.tif');    %基准
tm = imread('D:/桌面/tm.tif');      %待校准

%cpselect(tm,spot);   %选择配准点对
load('D:/桌面/movingPoints.mat');    %读取配准点对文件
load('D:/桌面/fixedPoints.mat');

tform = fitgeotrans(movingPoints,fixedPoints,'affine');   %变换模型:affine---仿射变换
res_tm = imwarp(tm,tform);    %图像变换

%找spot影像和配准后tm影像坐标点的映射关系
%cpselect(res_tm,tm);   %选择配准点对
load('D:/桌面/movingPoints_tm1.mat');
load('D:/桌面/fixedPoints_tm.mat');
tform1 = fitgeotrans(movingPoints_tm1,fixedPoints_tm,'affine');   %变换模型:affine---仿射变换
[tx,ty] = transformPointsForward(tform1,160,170)
[sx,sy] = transformPointsForward(tform,tx,ty)

%从spot影像和配准后tm影像中分别截取出同一区域
spot1 = imcrop(spot,[sx,sy,170,170]); 
tm1 = imcrop(res_tm,[160,170,170,170]); 

figure
subplot(2,3,1),imshow(spot);title('基准图像');
subplot(2,3,2),imshow(tm);title('待校准图像');
subplot(2,3,3),imshow(res_tm);title('校准后图像');
subplot(2,3,4),imshow(spot1);title('裁剪后spot');
subplot(2,3,5),imshow(tm1);title('裁剪后tm');

tm1_hsv = rgb2hsv(tm1);
tm1_I = tm1_hsv(:,:,3);
pipei = histeq(rgb2gray(spot1),imhist(tm1_I));   %直方图匹配
pipei1 = im2double(pipei);   %将输入值归一化到[0,1]之间,即转换为double类型
tm1_hsv(:,:,3) = pipei1;   %全色图像替代I分量
res = hsv2rgb(tm1_hsv);    %融合图像
subplot(2,3,6),imshow(res);title('融合后的新图像');

在这里插入图片描述

5.其他细节

5.1配准点

在这里插入图片描述
先用cpselect()函数获取配准点,运行后,会弹出配准窗口,通过调整图片到合适位置添加合适的基准点。
在这里插入图片描述
然后点击工作量的"File"→"Export Points to Workspace",在弹出的窗口在设置好基准点和配准点名字,点击"确定",便可将配准点的信息保存到工作空间,以便后续图像校正和裁剪时使用。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在matlab的工作区窗口在分布右击两个文件,对其进行另存为。后续在编写、调试代码时就可以直接使用load()函数对加载文件读取配准点信息,而无需再次使用cpselect()函数获取配准点信息了。
在这里插入图片描述
在这里插入图片描述

5.2裁剪

需要裁剪出A图和C图一块相同的区域,但是两个图片同一块区域的坐标是不一样的,所以需要使用fitgeotrans()函数建立两图像直接坐标点对之间的映射关系,得到一个变换矩阵。最后基于该变化矩阵,计算得到两图像直接同一个区域对应的坐标范围。
因此可以使用cpselect()函数获取A图和C图的配准点信息,再使用fitgeotrans()、transformPointsForward()获取对应坐标范围。本文代码是通过建立B图和C图、A图和B图支舰的两对映射关系,进而获取正确坐标范围的。如果嫌麻烦,可以如前面所说的,直接获取A图和C图的映射关系也是可以的。
在这里插入图片描述

6.测试数据

如需,自取。
链接:https://pan.baidu.com/s/1Pt6-kKoiYNVyQameoLJR7g
提取码:59jd
复制这段内容后打开百度网盘手机App,操作更方便哦

以上内容如有错误之处,还请见谅,请予指正,谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值