小波融合---超分辨率重建

在《小波图像融合的Matlab实现示例(添加图片演示080428)》一文中,有示例图

1。远景模糊近景清晰的 2。远景清晰近景模糊的3。小波融合

这好象有点超分辨率重建的意思了。

复制了它的代码,缺少一些函数。搜索了一阵,在《小波融合 高频区域能量取大 低频平均 matlab》的文章中找到可以运行的代码

 lowfrefus 函数(低频融合)两者不同,并且一个高频部分没用上 nlfilter 

由于图像太小,没有看出明显差别

下面把《小波融合 高频区域能量取大 低频平均 matlab》的文中的用到的复制过来

%高频区域能量取大,低频平均
function y=imfus(I1,I2)

st=cputime; %程序开始运行时的cpu时间 
 
if(nargin~=2)
    I1=imread('o_Fus01.jpg');
    I2=imread('o_Fus02.jpg');
end
I1=rgb2gray(I1);
I2=rgb2gray(I2);


 [r1,c1]=size(I1);% 读取图像分解后的小波分解系数矩阵的大小

 [r2,c2]=size(I2);
 if(r1~=r2)||(c1~=c2)
     error('图像尺寸不匹配。图像大小必须相同!');
    return;
 end 
 dim=3;%小波分解层数
%  
y1=mywavedec2(I1,dim);

y2=mywavedec2(I2,dim);
%-----------------分解结束,下面 融合--------
% 高频
y11=nlfilter(y1,[3 3],@myfunction3);
y21=nlfilter(y2,[3 3],@myfunction3);
%y11=y1;y21=y2;
[m,n]=size(y11);
for i=1:m
    for j=1:n
        if abs(y11(i,j))>abs(y21(i,j))
            y3(i,j)=y1(i,j);
 
        else
            y3(i,j)=y2(i,j);
 
        end 
    end 
end 
[r,c]=size(y1);% 根据低频融合算法进行图像融合
LLa=y1(1:r/(2^dim),1:c/(2^dim));% 调用lowfrefus函数对低频部分的小波分解系数 进行融合,剩下之前计算得系数,为高频 
LLb=y2(1:r/(2^dim),1:c/(2^dim));
 y3(1:r/(2^dim),1:c/(2^dim))=lowfrefus(LLa,LLb);
 
 y=mywaverec2(y3,dim);% 调用mywaverec2函数重构融合图像 
 y=uint8(y);
 %imwrite(yy,'重构图像.jpg');
 et=cputime-st;

 disp(['用时:',num2str(et)]);

%小波分解
function y1=mywavedec2(I1,dim) 

I1=modmat(I1,dim);% 首先规范化输入矩阵,使其行列数均能被2^dim 整除, 从而使分解顺利进行 
figure;
subplot(121);
imshow(I1);
title('原始图像'); %画出规范化后的源图像

 [m,n]=size(I1);%求出规范化矩阵x的行列数 
 
 xd=double(I1);%将矩阵x的数据格式转换为适合数值处理的double 格式 
 
 for i=1:dim 
     xd=modmat(xd,1);
     [dLL,dHL,dLH,dHH]=mydwt2(xd); %矩阵小波分解
    
     tmp=[dLL,dHL;dLH,dHH];%将分解系数存入缓存矩阵
     
     xd=dLL;    %将缓存矩阵左上角部分的子矩阵作为下一层分解的源矩阵 
 
     [row,col]=size(tmp); %求出缓存矩阵的行列数
    
     y1(1:row,1:col)=tmp;%将缓存矩阵存入输出矩阵的相应行列
     
 end 
 yd=y1;%uint8(y1);%将输出矩阵的数据格式转换为适合显示图像的uint8格式
for i=1:dim %  对矩阵yd 进行分界线处理,画出分解图像的分界线 
    m=m-mod(m,2);
    n=n-mod(n,2);
    yd(m/2,1:n)=255;%0;%
    yd(1:m,n/2)=255;%0;%
    m=m/2;n=n/2;
end
 subplot(122);
imshow(uint8(yd));
title([ num2str(dim) ' 层小波分解图像' ]);

 % 规范化输入矩阵,使其行列数均能被2^dim 整除, 从而使分解顺利进行 
 function y=modmat(x,dim) 
     
 
 [row,col]=size(x);%求出输入矩阵的行列数row,col
 rt=row-mod(row,2^dim); %将row,col分别减去本身模 2^dim 得到的数 
 ct=col-mod(col,2^dim); %所得的差为rt、ct,均能被2^dim 整除 
 

 y=x(1:rt,1:ct); %输出矩阵 y 为输入矩阵 x 的 rt*ct 维子矩阵
 
function [LL,HL,LH,HH]=mydwt2(x)
    
lpd=[1/2 1/2];hpd=[-1/2 1/2];%默认的低通、高通滤波器

[row,col]=size(x);

for j=1:row %首先对输入矩阵的每一行序列进行一维离散小波分解 
    tmp1=x(j,:);
    [ca1,cd1]=mydwt(tmp1,lpd,hpd,1);
    x(j,:)=[ca1,cd1];%将分解系数序列再存入矩阵x中,得到[L|H]
end 
for k=1:col %再对输入矩阵的每一列序列进行一维离散小波分解 
    tmp2=x(:,k);
    [ca2,cd2]=mydwt(tmp2,lpd,hpd,1);
    x(:,k)=[ca2,cd2]; %将分解所得系数存入矩阵 x 中,得到[LL,Hl;LH,HH] 
end 
 
 LL=x(1:row/2,1:col/2);%LL是矩阵x 的左上角部分 
 
 
 LH=x(row/2+1:row,1:col/2); %LH是矩阵x 的左下角部分 

 
 HL=x(1:row/2,col/2+1:col);%HL是矩阵x 的右上角部分 
 
 
 HH=x(row/2+1:row,col/2+1:col);%HH是矩阵x 的右下角部分 
 
 
function [cA,cD]= mydwt(x,lpd,hpd,dim)
cA=x;%初始化cA
cD=[];
for i=1:dim
    cvl=conv(cA,lpd); %低通滤波,为了提高运行速度,调用MATLAB 提供的卷积函数 conv() 
    dnl=downspl(cvl); %通过下抽样求出平均部分的分解系数
    cvh=conv(cA,hpd); %高通滤波
    dnh=downspl(cvh); %通过下抽样求出本层分解后的细节部分系数
    cA=dnl; %下抽样后的平均部分系数进入下一层分解
    cD=[cD,dnh];%将本层分解所得的细节部分系数存入序列cD
end 

 %下采样
 function y=downspl(x);
 N=length(x);% 读取输入序列长度
 M=floor(N/2);%输出序列的长度是输入序列长度的一半(带小数时取整数部分)
 i=1:M;
 y(i)=x(2*i);

%求滑动窗口中的元素的平方和
function c=myfunction3(x)

y=0;
%平方和
% for i=1:numel(x)
%    y=x(i).^2+y;
% end
%差值和
for i=2:numel(x)
    y=abs(x(i-1)-x(i))+y;
end
c=y;

%小波重构
 function y=mywaverec2(x,dim) 
 
 xd=uint8(x);% 将输入矩阵的数据格式转换为适合显示图像的uint8格式 
 [m,n]=size(x);
 for i=1:dim %对转换矩阵xd进行分界线处理 
     m=m-mod(m,2);
     n=n-mod(n,2);
     xd(m/2,1:n)=255;%0;%
     xd(1:m,n/2)=255;%0;%
     m=m/2;n=n/2;
 end
figure;
 subplot(121);imshow(xd);
title([ num2str(dim) ' 层小波分解图像']);%画出带有分界线的分解图像 
xr=double(x);% 将输入矩阵的数据格式转换回适合数值处理的double格式 
[row,col]=size(xr);% 求出转换矩阵xr的行列数 
for i=dim:-1:1 %重构次序是从内层往外层进行,所以先抽取矩阵xr 的最内层 分解矩阵进行重构 
    tmp=xr(1:floor(row/2^(i-1)),1:floor(col/2^(i-1)));% 重构的内层矩阵的行列数均为矩阵xr 的2^(i-1) 
    [rt1,ct1]=size(tmp);% 读取待重构矩阵tmp 的行列数 
    rt=rt1-mod(rt1,2);ct=ct1-mod(ct1,2);
     rLL=tmp(1:rt/2,1:ct/2);% 将待重构矩阵tmp 分解为四个部分 
     rHL=tmp(1:rt/2,ct/2+1:ct);
     rLH=tmp(rt/2+1:rt,1:ct/2);
     rHH=tmp(rt/2+1:rt,ct/2+1:ct);
     tmp(1:rt,1:ct)=myidwt2(rLL,rHL,rLH,rHH);% 将重构结果返回到矩阵tmp 
     xr(1:rt1,1:ct1)=tmp;% 把矩阵tmp 的数据返回到矩阵 xr 的相应区域,准备 下一个外层的重构 
end 
y=xr;% 重构结束后得到的矩阵xr即为输出矩阵y 
yu=uint8(xr);%将矩阵xr的数据格式转换为适合显示图像的uint8 格式 
subplot(122);
imshow(yu);
title('小波重构融合图像');

function y=myidwt2(LL,HL,LH,HH);

 lpr=[1 1];hpr=[1 -1];% 默认的低通、高通滤波器
 tmp_mat=[LL,HL;LH,HH];% 将输入的四个矩阵组合为一个矩阵
 [row,col]=size(tmp_mat);
 
for k= 1:col %首先对组合矩阵tmp_mat的每一列,分开成上下两半 
    ca1=tmp_mat(1:row/2,k);% 分开的两部分分别作为平均系数序列ca1、细节系数 序列cd1 
    cd1=tmp_mat(row/2+1:row,k);
    tmp1=myidwt(ca1,cd1,lpr,hpr);% 重构序列
    yt(:,k)=tmp1;% 将重构序列存入待输出矩阵yt 的相应列,此时 y=[L|H]
end
for j=1:row %将输出矩阵 y 的每一行,分开成左右两半
    ca2=yt(j,1:col/2);% 分开的两部分分别作为平均系数序列ca2、细节系数序列cd2 
    cd2=yt(j,col/2+1:col);
    tmp2=myidwt(ca2,cd2,lpr,hpr);% 重构序列
    yt(j,:)=tmp2;% 将重构序列存入待输出矩阵yt 的相应行,得到最终 的输出矩阵 y=yt 
end 
y=yt;

function y=myidwt(cA,cD,lpr,hpr);

lca=length(cA);% 求出平均、细节部分分解系数的长度
lcd=length(cD);

 while (lcd)>=(lca) % 每一层重构中,cA 和 cD 的长度要相等,故每层重构后, 
                    % lcd小于 lca,则重构停止,这时的 cA 即为重构信号 序列 y 。 
      upl=upspl(cA);%对平均部分系数进行上抽样
      cvl=conv(upl,lpr);% 低通卷积
      cD_up=cD(lcd-lca+1:lcd);% 取出本层重构所需的细节部分系数,长度与本层平均部分系数的长度相等 
      uph=upspl(cD_up);% 对细节部分系数进行上抽样
      cvh=conv(uph,hpr);% 高通卷积
      cA=cvl+cvh;% 用本层重构的序列更新cA,以进行下一层重构
      cD=cD(1:lcd-lca);% 舍弃本层重构用到的细节部分系数,更新cD
      lca=length(cA);% 求出下一层重构所用的平均、细节部分系数的长度
      lcd=length(cD);
 end %lcd<lca,重构完成,结束循环
 y=cA;% 等于重构完成后的平均部分系数序列cA 
 
%上采样
function y=upspl(x);

 N=length(x);% 读取输入序列长度
 M=2*N-1;% 输出序列的长度是输入序列长度的2倍再减1
 for i=1:M % 输出序列的偶数位为0,奇数位按次序等于相应位置的输入序列元 
     if mod(i,2)
         y(i)=x((i+1)/2);
     else
         y(i)=0;
     end
 end

如果还要用到其它函数,自行去复制吧

如果要比较两者不同效果,也自行去复制lowfrefus 相关吧。

=====================================

又在《matlab使用小波变换进行图像融合》一文中找到两个示例图

12

运行该文中的小波融合:


中间哪个水印好象消失了

运行本文的小波融合:


水印又出来了,一个只有平均,一个加了高频取大,效果就是不一样。


图 像 融 合 是一 种 重要的 增 强 图 像信 息的 技术方 法 , 如 何 对 同 一 目 标 的多 源 遥 感 图 像 数 据 进 行有效 的融 合 , 最 大 限 度 地利 用 多 源 遥 感 数据 中 的 有 用 信 息 , 提 高 系 统的 正 确 识 别 、 判 断 和 决 策 能力 , 这是 遥感 数 据融 合研 究 的重要 内容之 一 。 图 像 融 合 技 术 的 发 展 经 历了 3 个阶段 : ( l ) 简单 的 图 像 融 合方 法 , 如 R G B 假彩色 合 成 、 I H S 彩 色 变 换 、 P CA 主 分 量 变换 法 等 ; ( 2 ) 随 着 塔 式算 子的提 出 , 在融 合领域 也出现 了 一 些较为复杂 的 模 型 ; ( 3 ) 用 小波 变换 的多 尺 度分 析 替代塔 式 算 法 。 传 统的图 像 数 据 融 合 方法对 中 、 高 分辨率 的遥 感 图 像 的 数据 融 合 一 般 都 能 取 得 比 较理 想的 效 果 , 但 对 于 低 分 辨率 的 遥 感 图 像 数 据 融 合 效 果 并 不 明 显 。 具 有 “ 数学 显 微 镜 ” 之称 的 小波变换 同时 在 时 域 和 频 域 具有分 辨率 , 对 高 频 分 量 采 用 逐 渐 精 细的 时域或 空 域 步 长 , 可 以 聚 焦 到 分析 对 象 的 任 意细节 , 对 于 剧 烈 变化 的 边 缘 , 比 常 规 的 傅 里 叶 变换 具有更 好 的适 应性 。 由 于 小波变换具有 的 特 点 , 使 它 很快在 图 像 处理 中 得 到 广 泛的应 用 。 与 传 统的 数据 融 合方 法相 比 , 小波融 合 方 法 不 仅 能 够 针 对 输 人图 像 的 不 同 特 征 来 合 理选择小波 基 以 及小 波 变 换 的次 数 , 而 且在融 合 操 作 时 又 可 以 根 据 实 际 需 要 来引 人 双方的细节 信 息 。 从 而 表 现 出 更 强 的针对 性 和 实 用 性 , 融 合效 果更 好 。 另 外 , 从实施 过程 的 灵 活性 方 面 评 价 , IH S 彩色变换 只 能 而且 必须 同 时对 三 个波 段 进行融 合 操 作 , P C A 主 分 量变换 法 的 输 人 图 像 必 须有 三 个或 三 个 以 上 , 而 小 波方 法则 能够完成 对 单 一 波 段 或多 个波 段 的 融 合 运 算 , 对 于 单 个 黑 白 图 像 的 融 合 , 小波 方 法 更 是唯一的选 择 。 本 文 提出 了 一种基 于 小波变 换 的 融 合方 法 , 使 得融 合 图 像 在最 大 限 度 保 留 多波段光 谱 信 息 的 同时 , 提 高 了 清 晰 度 和空 间 分 辨 率 。 并 在 M A T L A B 环 境 下 对 该方 法 进行 了 实 例 分 析 , 从 图 像 清 晰度 、 信 息墒 、 信 噪 比 等 几 个 方 面 对结 果 做 了 深 人的 分 析 与 对 比 , 发现 融 合 后的 图 像 均 值 和 方 差 基 本 保持 不 变 , 图 像 信 噪 比 为 ZO db 左右 , 说 明 融 合 后 的 图 像 基 本保持 了 原 始 图 像 的光 谱 特 性 , 而 信 息 嫡 和 清 晰度 有 明 显 的 提高 。 因 此基 于 小 波 变换 的 M a l l a t 多分辨 率 分 析 可 有 效 地 用 于 低分 辨 率多光 谱 遥 感 图 像 的 数 据 融 合 , 融 合 后 的图 像 在 信 息 含量 、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值