前面我們說到灰度圖像的融合,其實我本意是想實現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,看看最終的結果有何不同。