使用小波变换进行灰度图像的融合

参考:
https://blog.csdn.net/liu_guanzhang/article/details/42120861
https://wenku.baidu.com/view/a4cfe4c36137ee06eff918c0.html
本文旨在利用小波变换实现一个很简单的融合算法,对小波变换的应用有个粗略的认识。当然本文的算法其实是很简陋的,仅是作为一个例子,不具有广泛应用的实际。
在下面的程序中,我们基于这样一个简单的融合规则,即对2幅图像的低频部分采取均值,而对2幅图像的高频部分,我们留下对应位置最大的那个频率信息。
算法的流程图如下图所示:
这里写图片描述

融合程序

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
% % 使用小波变换对2幅图像进行融合,仅适用灰度图
% % % % % %参数说明:
%    M1     - 输入图像 A
%    M2     - 输入图像 B 
%    wtype  - 指定使用的小波基
%    Y      - 融合结果图像
% % 
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 

clc;
clear;
close all;                
% % ===============================================
%   读入要进行融合的图像
% % ===============================================
imA = imread('pan.tif');
% 这里转化成double类型,否则使用小波变换输出的会有大量大于1的存在,会导致图像显示有问题
M1 = double(imA) / 256;   % 【问题1】
imB = imread('LR.tif');
imB = imresize(imB,4);
imB = rgb2gray(imB);
M2 = double(imB) / 256;


zt = 4;           % 设置小波分解的层数
wtype = 'haar';  % 设置小波基

% % ===============================================================
% 这里的融合规则是:在高频系数中,取2幅图像绝对值大的小波系数,
% 在低频系数中,取2幅图像的平均值。
% % ================================================================

% % ==============================================
% 对2幅图像分别进行小波分解
% % ==============================================
[c0,s0] = wavedec2(M1, zt, wtype);  
[c1,s1] = wavedec2(M2, zt, wtype); 


KK = size(c1);
Coef_Fusion = zeros(1,KK(2));  % 生成同系数矩阵c一样大的矩阵作为结果存储单元

Coef_Fusion(1:s1(1,1)*s1(1,2)) = (c0(1:s1(1,1)*s1(1,2))+c1(1:s1(1,1)*s1(1,2)))/2;


% % =============================================
% % 处理高频系数
% % =============================================
MM1 = c0(s1(1,1)*s1(1,2)+1:KK(2));
MM2 = c1(s1(1,1)*s1(1,2)+1:KK(2));
mm = (abs(MM1)) > (abs(MM2));
Y  = (mm.*MM1) + ((~mm).*MM2);
Coef_Fusion(s1(1,1)*s1(1,2)+1:KK(2)) = Y;


% % =============================================
% 重构
% % 这里我们已经生成新的系数矩阵了,并利用新的系数矩
% % 阵,进行小波逆变换
% % =============================================
Y = waverec2(Coef_Fusion,s0,wtype);

% % =============================================
% 显示图像
% % =============================================
subplot(2,2,1);imshow(M1);title('pan');
subplot(2,2,2);imshow(M2);title('LR');
subplot(223);imshow(Y,[]);title('融合图像');

结果

这里写图片描述

为什么要有这句代码M1 = double(imA) / 256

需要注意的是,为什么要将图像放缩到0-1?我们看下面一段程序就知道原因了。即不加这句代码,会造成图像显示为“全白”的现象。

clc;
clear;
close all;

x=imread('lena_color_512.tif');  %读取原图像
x = double(x)/256; % 注释掉这段代码,再看现象
figure(1);imshow(x);title('原始图像');
x=double(x);
[c,s ]=wavedec2(x,1,'db8'); %作小波变换,形成小波系数矩阵
r = waverec2(c,s,'db8');%还原图像文件
figure;imshow(r);title('重构之后的图像');
  • 10
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
图像融合是指将不同传感器或者不同时间拍摄的多幅图像进行融合,生成一幅具有更为丰富信息的图像。小波变换是一种基于信号分解的方法,可以将信号分解成多个不同频率的子带,从而提取出信号的局部特征。因此,小波变换被广泛应用于图像处理中,包括图像融合。 下面是一个简单的 Matlab 代码示例,实现了基于小波变换的图像融合。该代码使用了离散小波变换(DWT)进行多分解,并使用了基于像素平均的简单融合策略。具体实现步骤如下: 1. 读入两幅待融合的图像并将它们转换为灰度图像; 2. 对两幅灰度图像进行 DWT 多分解,并提取出每个分解层的近似和细节系数; 3. 对每个分解层的近似和细节系数进行融合,生成新的近似和细节系数; 4. 对新的近似和细节系数进行逆 DWT 反变换,得到融合后的图像。 ```matlab % 读入两幅待融合的图像 img1 = imread('image1.jpg'); img2 = imread('image2.jpg'); % 将图像转换为灰度图像 img1_gray = rgb2gray(img1); img2_gray = rgb2gray(img2); % 设置小波变换参数 level = 3; % 分解层数 wname = 'db4'; % 小波基函数 % 对两幅灰度图像进行 DWT 多分解 [C1,S1] = wavedec2(img1_gray,level,wname); [C2,S2] = wavedec2(img2_gray,level,wname); % 提取每个分解层的近似和细节系数 A1 = appcoef2(C1,S1,wname,level); H1 = detcoef2('h',C1,S1,level); V1 = detcoef2('v',C1,S1,level); D1 = detcoef2('d',C1,S1,level); A2 = appcoef2(C2,S2,wname,level); H2 = detcoef2('h',C2,S2,level); V2 = detcoef2('v',C2,S2,level); D2 = detcoef2('d',C2,S2,level); % 对每个分解层的近似和细节系数进行融合 A = (A1 + A2) / 2; H = (H1 + H2) / 2; V = (V1 + V2) / 2; D = (D1 + D2) / 2; % 对新的近似和细节系数进行逆 DWT 反变换 fused_img = waverec2(cat(2,A,H,V,D),S1,wname); % 显示融合后的图像 imshow(fused_img); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值