使用小波變換進行灰度圖像的融合

參考:
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('重構之後的圖像');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章