【影象融合】基於小波變換的影象融合
阿新 • • 發佈:2019-01-03
小波變換
傳統的訊號理論,是建立在Fourier分析基礎上的,而Fourier變換作為一種全域性性的變化,其有一定的侷限性,如不具備區域性化分析能力、不能分析非平穩訊號等。在實際應用中人們開始對Fourier變換進行各種改進,以改善這種侷限性,如STFT(短時傅立葉變換)。由於STFT採用的的滑動窗函式一經選定就固定不變,故決定了其時頻解析度固定不變,不具備自適應能力。
小波分析很好的解決了這個問題。小波直接把傅立葉變換的基給換了——將無限長的三角函式基換成了有限長的會衰減的小波基。這樣不僅能夠獲取頻率,還可以定位到時間了。
常見小波函式:Haar、Daubechies、Biorthogonal、Coiflets、Symlets、Morlet、Mexican Hat、Meyer、Gaus、Dmeyer、ReverseBior、Cgau、Cmor、Fbsp、Shan.
程式碼示例
function y=wtfusion(x1,x2,N,wname)
%函式功能:
% 函式x=wtfusion(x1,x2,N,wname)將兩幅原影象x1,x2進行基於小波變換的影象融合,得到融合後的影象y
% 近似分量採用加權平均的融合規則,各細節分量採用基於區域特性量測的融合規則
%輸入引數:
% x1----輸入原影象1
% x2----輸入原影象2
% N----小波分解的層數
% wname----小波基函式
%輸出引數:
% y----原影象融合後得到的影象
%-----------------------------------------------------------------%
x1=double(x1); %將uint8的影象資料型別轉換成double型進行資料處理
x2=double(x2);
%將原影象x1,x2分別進行N層小波分解,wname為小波基函式,
%C為各層分解係數,S為各層分解係數長度,也就是大小.
%C的結構:c=[A(N)|H(N)|V(N)|D(N)|H(N-1)|V(N-1)|D(N-1)|H(N-2)|V(N-2)|D(N-2)|...|H(1)|V(1)|D(1)]
%A(N)代表第N層低頻係數,H(N)|V(N)|D(N)代表第N層高頻係數,分別是水平,垂直,對角高頻
%S(N+2行2列)的結構是儲存各層分解係數長度的,即第一行是A(N)的長度(其實是A(N)的原矩陣的行數和列數),
%第二行是H(N)|V(N)|D(N)|的長度,第三行是H(N-1)|V(N-1)|D(N-1)的長度,
%倒數第二行是H(1)|V(1)|D(1)長度,最後一行是X的長度(大小)
[C1,S1]=wavedec2(x1,N,wname);
[C2,S2]=wavedec2(x2,N,wname);
A1=appcoef2(C1,S1,wname,N); %提取出小波分解的近似分量
A2=appcoef2(C2,S2,wname,N);
A=0.5*A1+0.5*A2; %近似分量的融合規則採用加權平均的方法
%仿照matlab中近似分量和細節分量的儲存方式,把融合後的近似分量和細節分量轉成行向量,然後存入向量C中
%這樣做是為了方便重構原影象
a=reshape(A,1,S1(1,1)*S1(1,2)); %將A轉換成行向量
C=a;
for i=N:-1:1 %迴圈從第N層到第1層
[H1,V1,D1]=detcoef2('all',C1,S1,i); %提取出小波分解的各層細節分量
[H2,V2,D2]=detcoef2('all',C2,S2,i);
H=f(H1,H2); %各層細節分量的融合規則採用基於區域特性量測的融合規則
V=f(V1,V2);
D=f(D1,D2);
h=reshape(H,1,S1(N+2-i,1)*S1(N+2-i,2));%分別將融合後的細節分量轉成行向量,並存入行向量C中
v=reshape(V,1,S1(N+2-i,1)*S1(N+2-i,2));
d=reshape(D,1,S1(N+2-i,1)*S1(N+2-i,2));
C=[C,h,v,d];
end
S=S1;
y=waverec2(C,S,wname); %重構原影象
figure(1);imshow(uint8(y));title('基於小波變換的融合影象')
end
function y=f(x1,x2)
%函式功能:
% y=f(x1,x2)將兩幅原影象x1和x2基於區域特性量測的融合規則進行融合,得到融合後的影象y
% 首先計算兩幅影象的匹配度,若匹配度大於閾值,說明兩幅影象對應區域性能量較接近,
% 因此採用加權平均的融合方法;若匹配度小於閾值,說明兩幅影象對應區域性能量相差較大,
% 因此選取區域性區域能量較大的小波係數作為融合影象的小波係數
%輸入引數:
% x1----輸入原影象1
% x2----輸入原影象2
%輸出引數:
% y----融合後的影象
%------------------------------------------------------------%
w=1/16*[1 2 1;2 4 2;1 2 1]; %權係數
E1=conv2(x1.^2,w,'same'); %分別計算兩幅影象相應分解層上對應區域性區域的“能量”
E2=conv2(x2.^2,w,'same');
M=2*conv2(x1.*x2,w,'same')./(E1+E2);%計算兩幅影象對應區域性區域的匹配度
T=0.7; %定義匹配閾值
Wmin=1/2-1/2*((1-M)/(1-T));
Wmax=1-Wmin;
[m,n]=size(M);
for i=1:m
for j=1:n
if M(i,j)<T %如果匹配度小於匹配閾值,說明兩幅影象對應區域性區域能量距離較遠;
if E1(i,j)>=E2(i,j) %那麼就直接選取區域能量較大的小波係數
y(i,j)=x1(i,j);
else
y(i,j)=x2(i,j);
end
else %如果匹配度大於匹配閾值,說明兩幅影象對應區域性區域能量比較接近;
if E1(i,j)>=E2(i,j) %那麼就採用加權的融合演算法
y(i,j)=Wmax(i,j)*x1(i,j)+Wmin(i,j)*x2(i,j);
else
y(i,j)=Wmin(i,j)*x1(i,j)+Wmax(i,j)*x2(i,j);
end
end
end
end
end
函式呼叫
x1 = imread('lena1.jpg');
x2 = imread('lena2.jpg');
out = wtfusion(x1,x2,2,'db1');
subplot(1,3,1);imshow(x1);title('左模糊');
subplot(1,3,2);imshow(x2);title('右模糊');
subplot(1,3,3);imshow(uint8(out));title('基於小波變換的影象融合');
執行結果