基于MATALB的多光谱影像与全色影像(高分辨率)的融合的几种方法

基于MATALB的多光谱影像与全色影像(高分辨率)的融合的几种方法

在这里插入图片描述
在这里插入图片描述
1.HIS方法

clear ;close ;clc;
%加载图片
load Sichuan;

% %将图片转换为三波段的光谱低分辨率和全色高分辨率
ImageMS = 255*ImageMS/max(max(max(ImageMS)));
ImageP = 255*ImageP/max(max(max(ImageP)));
tp = ImageMS(:,:,3);
ImageMS(:,:,3) = ImageMS(:,:,1);
ImageMS(:,:,1) = tp;
%全色高分辨率
High=ImageP(:,:);
%三波段的多光谱低分辨率
Multy=ImageMS(:,:,1:3);

%多光谱影像从RGB转到IHS
IHS=rgb2hsv(Multy/255);
%得到IHS矩阵的第三页,因为第三页才是I亮度
I=IHS(:,:,3);

%下面进行灰度直方图的规定化,把I作为标准,对高分辨率影像进行处理
%读入标准图像,得到I的大小和维度
[m_mul,n_mul,d_mul]=size(I);
%计算规定直方图各个像素的概率
Multy_hist=(imhist(I)/(m_mul*n_mul));

%读入要被规定化的图像
[q,p]=imhist(High/255);
%得到高分辨率影像的大小及其维度
[m_h,n_h,d_h]=size(High);
%计算原始直方图各个像素的概率
High_hist=(imhist((High/255))/(m_h*n_h));

Mul_V=[];
High_V=[];

%计算规定累计直方图和原始累计直方图概率
for i=1:256
    Mul_V=[ Mul_V sum(Multy_hist(1:i))];
    High_V=[High_V sum(High_hist(1:i))];
end

%开始对像素进行SML映射
for i=1:256
    %把多光谱的累计概率与高分辨率的累计概率的每一个概率做差
    value{
    
    i}=Mul_V-High_V(i);
    %取绝对值(因为接近无论 正负)
    value{
    
    i}=abs(value{
    
    i});
    %找到最接近的,即为映射的灰度级(index)【即原始图像第i级对应第index(i)级】
    %temp是最小值
    [temp index(i)]=min(value{
    
    i});
end

High=uint8(High);
%设新图像的大小与高分辨率图像等大
newimg=zeros(m_h,n_h);
%对新I像素进行赋值
for i=1:m_h
    for j=1:n_h
        %把规定化后的灰度级赋值给newimg
        newimg(i,j)=index((High(i,j)+1))-1;
    end
end

subplot(1,3,1);
imhist(uint8(High)); %显示变换前的直方图
subplot(1,3,2);
imhist(uint8(Multy));%产生规定化模板
subplot(1,3,3);
imhist(newimg/255);% 规定化变换后的直方图

%把IHS的H与S变成与高分辨率图像等大,同时把IHS的原I用新的I替换
newIHS(:,:,1)=imresize(IHS(:,:,1),[540,600]);
newIHS(:,:,2)=imresize(IHS(:,:,2),[540,600]);
newIHS(:,:,3)=newimg;

%把替换完成的图像从IHS转为RGB,并输出图像
newRGB=hsv2rgb(newIHS);
figure
subplot(1,2,1);
imshow(uint8(Multy));
title('多波段');
subplot(1,2,2);
imshow(uint8(High));
title('高分辨率');
figure
imshow(uint8(newRGB));
title('合成图');

结果图:
在这里插入图片描述
2.小波变换

%小波变换
clear ;close ;clc;
%加载图片
load Sichuan;
%将图片转换为三波段的多光谱低分辨率和全色高分辨率
ImageMS = 255*ImageMS/max(max(max(ImageMS)));
ImageP = 255*ImageP/max(max(max(ImageP)));
tp = ImageMS(:,:,3);
ImageMS(:,:,3) = ImageMS(:,:,1);
ImageMS(:,:,1) = tp;
%全色高分辨率
High=double(ImageP(:,:))/255;
%三波段的多光谱低分辨率
Multy=double(ImageMS(:,:,1:3))/255;
%得到RGB三元色矩阵
Multy_R=Multy(:,:,1)*1.5;
Multy_G=Multy(:,:,2)*1.5;
Multy_B=Multy(:,:,3)*1.5;

%将高分辨率影响进行2维小波分解
% c1是对应的整幅图数据的向量;
[c1,s1]=wavedec2(High,2,'sym4');  
sizec1=size(c1);
for I=1:sizec1(2)
    c1(I)=1.8*c1(I); %将分解后的值都扩大
end
%把RGB都变成与高分辨率影响同等大小,再进行小波分解
Multy_R=imresize(Multy_R,[540 600]);
[cr,sr]=wavedec2(Multy_R,2,'sym4');
Multy_G=imresize(Multy_G,[540 600]);
[cg,sg]=wavedec2(Multy_G,2,'sym4');
Multy_B=imresize(Multy_B,[540 600]);
[cb,sb]=wavedec2(Multy_B,2,'sym4');


%把RGB的分解值分别都与高分辨率进行求均值与重构
cr1=c1+cr ;     %计算小波系数平均值
cr1=0.5*cr1;
sr1=s1+sr;     %对像素进行求和后取平均
sr1=0.5*sr1;
xxr=waverec2(cr1,sr1,'sym4');  %进行重构

cg1=c1+cg ;     %计算平均值
cg1=0.5*cg1;
sg1=s1+sg;
sg1=0.5*sg1;
xxg=waverec2(cg1,sg1,'sym4');  %进行重构

cb1=c1 +cb ;     %计算平均值
cb1=0.5*cb1;
sb1=s1+sb;
sb1=0.5*sb1;
xxb=waverec2(cb1,sb1,'sym4');  %进行重构

%把重构后的矩阵合成RGB三维矩阵即可
xx=cat(3,xxr,xxg,xxb);
figure(1)
subplot(1,2,1);
imshow(High),title('高分辨率影像');
axis square;

subplot(1,2,2);
imshow(Multy),title('多波段影像');
axis square;

IHS=rgb2hsv(xx);
S=IHS(:,:,2)*1.8;
IHS(:,:,2)=S;
I=IHS(:,:,3)*0.59;
IHS(:,:,3)=I;

xx=hsv2rgb(IHS);
figure
imshow(1.25*xx),title('融合后影像');
axis square;

结果图:
在这里插入图片描述
3.Brovery

clear ;close ;clc;
%加载图片
load Sichuan;
%将图片转换为三波段的多光谱低分辨率和全色高分辨率
ImageMS = 255*ImageMS/max(max(max(ImageMS)));
ImageP = 255*ImageP/max(max(max(ImageP)));
tp = ImageMS(:,:,3);
ImageMS(:,:,3) = ImageMS(:,:,1);
ImageMS(:,:,1) = tp;
%全色高分辨率
High=double(ImageP(:,:))/255;
%三波段的多光谱低分辨率
Multy=double(ImageMS(:,:,1:3))/255;
Multy=imresize(Multy,[540 600]);
[a,b,c]=size(Multy);
x=double(Multy);
y1=double(High);
xx=zeros(a,b,c);
p=zeros(a,b,c);
%根据公式
% R=pan*band3/(band1+band2+ band3)
% G=pan*band2/(band1+band2+ band3)
% B=pan*band1/(band1+band2+ band3)
for f=1:a
    for e=1:b
        xx(f,e)=x(f,e,1)+x(f,e,2)+x(f,e,3);
        p(f,e,1)=x(f,e,1)*y1(f,e)/xx(f,e);
        p(f,e,2)=x(f,e,2)*y1(f,e)/xx(f,e);
        p(f,e,3)=x(f,e,3)*y1(f,e)/xx(f,e);
    end
end
imshow(p*4);
title('融合图像');

结果图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46877697/article/details/115220321