使用小波變換進行Pan和多光譜融合

前面我們說到灰度圖像的融合,其實我本意是想實現Pan和多光譜(MS)的融合的,但是由於無法解決Pan小波分解之後與MS小波分解後維度匹配上的差異,就放棄了。正如前面的博客的代碼所描述的那樣,其實單通道與單通道的小波分變換的融合是十分容易的。但是要從單通道跳躍到多通道,還需要一些小小的技巧。對於初看融合代碼的我來說,確實沒能輕鬆的跳過。

如何從單通道到多通道

那如何將小波變換從單通道應用到多通道呢?
其實是一種很簡單樸素的想法,就是將Pan擴展成同MS一樣的通道數。這樣就保證Pan在第三維度上同MS圖像一樣了。然後MS圖像也上採樣4倍,這樣Pan和MS在各維度上都一樣了。分別對數上述結果小波變換,接着用MS的低頻部分去代替Pan的低頻部分。最後實現小波逆變換就得到融合結果了。

matlab程序

主程序如下:

pan_file = 'big_pan.tif';
pan = imread(pan_file);
pan = double(pan) /256;

ms_file = 'LR.tif';
ms = imread(ms_file);
ms = imresize(ms,4);
ms = double(ms)/256;

res = waveletfusion(ms,pan);
figure(1);imshow(res,[]);title('融合結果');

以下是核心代碼:

function solution = waveletfusion( lowres, panimage, level, waveletname)
% % % % % % % % % % % % % % % % % % % % % % %
% % @author chaolei
% % 2010/07/10
% % % % % % % % % % % % % % % % % % % % % % %
% % ================================================
%      設置默認小波基和分解尺度的默認值
% % ================================================
if ~exist('waveletname','var')
    waveletname = 'haar';
end

if ~exist('level','var')
    level = 2;
end

[height ,width ,channels] = size(lowres);

[panvec, s] = wavedec2(panimage,level,waveletname);
% % ================================================
%      開闢存儲Pan和MS各波段的小波係數的空間
% % ================================================
length = size(panvec,2);
reconstvec = zeros(length,channels);  % 複製Pan的小波係數 channels倍
lowresvec = zeros(length,channels);   % 存儲MS各波段小波係數

% % ================================================
%      對MS的各波段分別進行小波變換(小波分解)
% % ================================================
for i = 1:channels
    reconstvec(:,i) = panvec;
    lowresvec(:,i)  = wavedec2(lowres(:,:,i),level,waveletname);
end

% % ================================================
%   融合策略:Pan的高頻部分+MS各波段的低頻部分得到結果
% % ================================================
j = s(1,1) * s(1,2);
reconstvec(1:j,:) = lowresvec(1:j,:);

% % ================================================
%      小波逆變換
% % ================================================
solution = zeros(height,width,channels);
for i=1:channels
    solution(:,:,i) = waverec2(reconstvec(:,i),s,waveletname);
end

end

以上就是我找到的代碼然後修改了,其實我有好幾個自己實現的版本,這裏就貼一個另一種的Pan擴展的思想的代碼吧。爲了避免繁瑣,我不再寫成子函數的形式。大家可以體會一下,下面的代碼究竟與上面的代碼有何不同。

pan_file = 'big_pan.tif';
pan = imread(pan_file);
pan = double(pan) /256;

pan = repmat(pan,1,1,3);
ms_file = 'LR.tif';
ms = imread(ms_file);
ms = imresize(ms,4);  % 使MS同Pan尺寸一致
ms = double(ms)/256;

level =2;
waveletname = 'haar';

[panvec,s0] = wavedec2(pan,level,waveletname);
[msvec, s1] =  wavedec2(ms,level,waveletname);

j = s0(1,1)*s0(1,2)*s0(1,3);
panvec(1,1:j) = msvec(1,1:j);

res = waverec2(panvec,s0,waveletname);
figure(3);imshow(res);title('融合結果');

結果圖像

這裏寫圖片描述
需要注意的是,level參數要控制好,如果太大會造成光譜失真。適度的level可以保證很好的光譜保持。有興趣的同學可以試試不同的level,看看最終的結果有何不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章