如何大幅提高遥感影像分辨率(Python+MATLAB)

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

前言:

算法:NSCT算法(非下采样变换)
数据:Landsat8 OLI 遥感图像数据
编程平台:MATLAB+Python
论文参考:毛克.一种快速的全色和多光谱图像融合算法[J].测绘科学,2016,41(01):151-153+98.DOI:10.16251/j.cnki.1009-2307.2016.01.028.
在这里插入图片描述

             左图:未进行融合的多光谱真彩色合成                              右图:利用NSCT变换后的多光谱真彩色合成

算法概述

  • (1)上采样低分辨率多光谱图像LRM,使其和全色图像HRP的分辨率相同,记为LRM杠;
  • (2)根据第i个多光谱波段LRMi杠来匹配全色图像得到新的图像HRPi杠;
    在这里插入图片描述
  • (3)使用NSCT变换两层分解HRPi杠,得到低频分量和细节子带;
  • 此处虽然说的是两层分解,但是我找遍了资料,还是不能理解是怎么得出。但是考虑到是低频分量,于是我利用的高斯模糊,方差为20,提取出了全色波段的低频部分。
    在这里插入图片描述
                                          图:全色波段的低频分量
  • (4)提高全色高频信息HF,即
    在这里插入图片描述
  • (5)按比例投影高频信息HF至LRMi杠中,得到融合图像HRMi
    在这里插入图片描述

matlab批量读取遥感影像并将影像矩阵存入.mat文件中:

clc;clear all;
file_path="C:\Users\稳魂\Desktop\data\";
img_path_list = dir(strcat(file_path,'LC08_L1TP_118038_20130525_20170504_01_T1_B*.TIF'));
img_num = length(img_path_list);
fprintf('正在读取的图像为:\n');
data_base={};
name={};
if img_num > 0 
    for j = 1:img_num 
        if j~=9
                img_name = strcat(file_path,'LC08_L1TP_118038_20130525_20170504_01_T1_B',int2str(j),'.TIF');
                pitch=geotiffread(img_name);
                name{j}=img_name;
                data_base{j}=pitch;
                fprintf('第%02d个:%s\n',j,img_name);
        else
                j=j+1;
        end
    end
end
save("D:\pythonProject\data_base.mat","data_base");

Python主程序代码(NSCT融合算法)

附加解释:
def load_mat:读取matlab的mat文件,对全色波段影像进行均值、方差、低频分量提取操作;
def hsc_data: 对多光谱影像进行上述均值、方差操作,并进行NSCT算法对各多光谱影像进行融合。

# coding=utf-8
from typing import List
import scipy.io as scio
import numpy as np
import cv2 as cv

# matlab//python混编.mat数据传递
# 读取.mat数据
def load_mat(path):
    data_data1 = scio.loadmat(path)
    band8_1 = data_data1['data_base'][0, 7]
    row1, col1 = band8_1.shape  # get band8 size
    print(band8_1.shape)  # output
    miu_p1 = np.nanmean(band8_1)  # 计算均值
    std_p1 = np.nanstd(band8_1)  # 计算标准差
    # 获取图像的低频分量//高斯模糊
    L_p1 = cv.GaussianBlur(band8_1, (0, 0), 20)
    # cv.imwrite("my.tif", L_p)
    # print(miu_p)
    # print(std_p)
    return data_data1, row1, col1, miu_p1, std_p1, L_p1, band8_1

def hsc_data(data1, row1, col1, miu_p1, std_p1, L_p1, band81):
    # band_list = []
    miu_i_list = []  # 均值
    std_i_list = []  # 标准差
    # HRP_dd_list = []  # 各个波段的HRP影像
    HF_list = []  # 各个波段的高频分量
    HRM_list = []  # 融合图像列表

    for i in range(0, 4):
        band = data1['data_base'][0, i]
        band = cv.resize(band, (col1, row1))
        # band_list.append(band)
        miu_i = np.nanmean(band)
        miu_i_list.append(miu_i)
        std_i = np.nanstd(band)
        std_i_list.append(std_i)
        HRP_dd = ((band81 - miu_p1) / std_p1) * std_i + miu_i
        # HRP_dd_list.append(HRP_dd)
        HF = HRP_dd - L_p1
        HF_list.append(HF)
        band_aver = np.mean(miu_i_list)
        HRM = band + (band / band_aver) * HF
        HRM_list.append(HRM)
    return miu_i_list, std_i_list, HF_list, HRM_list


if __name__ == '__main__':
    path1 = r"D:\pythonProject\data_base.mat"
    data_data, row, col, miu_p, std_p, L_p, band8 = load_mat(path1)
    miu_i_l, std_i_l, HF_l, HRM_l = hsc_data(data_data, row, col, miu_p, std_p,
                                             L_p, band8)
    # print(HRM_l[1])
    # cv.imwrite('HRM_4.tif', HRM_l[3])

如下结果是NSCT变换前与变换的图,利用arcmap工具打开:

在这里插入图片描述

                                                    图:未进行NSCT变换的原图

在这里插入图片描述

                                                   图:进行NSCT变换后的图

matlab真彩色合成

clc;clear all

HSM_2=uint16(imread("HRM_2.tif"));
HSM_3=uint16(imread("HRM_3.tif"));
HSM_4=uint16(imread("HRM_4.tif"));
hsm_img=cat(3,HSM_4,HSM_3,HSM_2);
imwrite(hsm_img,'HSM.tif','tif');
%% 

band2=imread("LC08_L1TP_118038_20130525_20170504_01_T1_B2.TIF");
band3=imread("LC08_L1TP_118038_20130525_20170504_01_T1_B3.TIF");
band4=imread("LC08_L1TP_118038_20130525_20170504_01_T1_B4.TIF");
band_img=cat(3,band4,band3,band2);
imwrite(band_img,'BAND.tif','tif')

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠楠星球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值