參考:
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('重構之後的圖像');