功能介绍
(严格意义上不能称得上系统,只能说是一个处理流程介绍吧。)
对spot和tm影像进行几何校正,各截取出同一区域(任一区域),重采样后采用HIS融合方法进行融合,HIS变换融合方法首先将空间分辨率低的3波段多光谱影像变换到HIS空间,得到色度H、明度I、饱和度S3分量;然后将高空间分辨率影像进行对比度拉伸,使之与I分量有相同的均值和方差。HIS变换融合主要步骤如下:
- 将多光谱图像作IHS变换,分别得I,H,S 3个分量;
- 将全色图像和I分量图像进行灰度直方图匹配,然后用全色图像代替I分量作为新的I分量;
- 利用新的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,操作更方便哦
以上内容如有错误之处,还请见谅,请予指正,谢谢!