過去研究過高斯金字塔,不過今天看來,當時似乎搞錯了,金字塔上下層應該是采樣的關系,而不是縮放的關系,而且不同層的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; %拉普拉斯濾波器 4 16 24 16 4; 6 24 36 24 6; 4 16 24 16 4; 1 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