matlab拉普拉斯殘差金字塔

原文鏈接:https://www.cnblogs.com/tiandsp/archive/2013/06/07/3123755.html

轉自:https://www.cnblogs.com/tiandsp/archive/2013/06/07/3123755.html

過去研究過高斯金字塔,不過今天看來,當時似乎搞錯了,金字塔上下層應該是採樣的關係,而不是縮放的關係,而且不同層的sigma應該也有所不同。

拉普拉斯金字塔在圖像融合中有所應用,方法是首先對兩個待融合圖像求拉普拉斯殘差金字塔,然後用模板對每一級殘差圖像進行融合得到融合後圖像的殘差金字塔,然後對這個金字塔進行重構就能得到最終的融合圖像,圖像各尺度細節得到保留。(注:融合時模板一般會先用高斯函數模糊一下)

不過這裏不實現融合,只實現拉普拉斯金字塔的建立。

建立金字塔的方框圖如下(摘自《數字圖像處理(第二版)》):

通過j-1級近似圖像和j級殘差圖像就能恢復j級輸入圖像。

近似濾波器就是拉普拉斯濾波模板。

插入濾波器是對拉普拉斯濾波模板採樣形成的新濾波模板。

使用的拉普拉斯濾波模板如下:

w=1/256*[1  4   6   4  1; 
                4 16 24 16 4;
                6 24 36 24 6;
                4 16 24 16 4;
                1  4   6   4 1];

產生的殘差金字塔:

前面四張圖像都是殘差,最後一張圖像是原圖的4級近似,通過最後一張圖和殘差圖,就能重構回原圖。

matlab代碼如下:

main.m

clear all; close all; clc;

img=double(imread('lena.jpg'));
[m n]=size(img);

w=1/256*[1  4  6  4 1;      %拉普拉斯濾波器
16 24 16 4;
24 36 24 6;
16 24 16 4;
 4  6  4 1];

imgn{1}=img;
for i=2:5                   %濾波,下采樣
   imgn{i}=imfilter(imgn{i-1},w,'replicate');
   imgn{i}=imgn{i}(1:2:size(imgn{i},1)-1,1:2:size(imgn{i},2)-1); %i-1級近似
end
       
for i=5:-1:2        %調整圖像大小
   imgn{i-1}=imgn{i-1}(1:2*size(imgn{i},1),1:2*size(imgn{i},2)); 
end

 for i=1:4          %獲得殘差圖像,i級預測殘差
    imgn{i}=imgn{i}-expand(imgn{i+1},w);     
 end
 
for i=4:-1:1        %殘差圖像重構原圖像
    imgn{i}=imgn{i}+expand(imgn{i+1},w);
end

imshow(uint8(imgn{1}));

expand.m

function re=expand(img,w)

    img=double(img);
    w=w*4;
    
    [m n]=size(img);
    [M N]=size(w);
    
    %插入濾波器                                   
    w_up_left=w(1:2:M,1:2:N); 
    w_up_right=w(1:2:M,2:2:N); 
    w_down_left=w(2:2:M,1:2:N); 
    w_down_right=w(2:2:M,2:2:N); 

    img_up_left=imfilter(img,w_up_left,'replicate','same');
    img_up_right=imfilter(img,w_up_right,'replicate','same');   
    img_down_left=imfilter(img,w_down_left,'replicate','same');  
    img_down_right=imfilter(img,w_down_right,'replicate','same');  
  
    re= zeros(m*2,n*2);             %上採樣
    re(1:2:m*2,1:2:n*2)=img_up_left;
    re(2:2:m*2,1:2:n*2)=img_up_right;
    re(1:2:m*2,2:2:n*2)=img_down_left;
    re(2:2:m*2,2:2:n*2)=img_down_right;

end

 

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