圖像金字塔

圖像金字塔是圖像處理和計算機視覺中常用到的概念,常常用于多尺度處理領域(multiscale processing),尤其早年的圖像匹配、識別等算法中都用到了圖像金字塔。

高斯金字塔(Gaussian pyramid)

下圖為高斯金字塔的示意圖,金字塔的底層為原始圖像,每向上一層則是通過高斯濾波和1/2采樣得到(去掉偶數行和列)。


高斯金字塔

我們可以使用如下Matlab代碼來進行得到高斯金字塔:

function [ pyr ] = gaussian_pyramid( I,nlev )
%GAUSSIAN_PYRAMID Summary of this function goes here
%   Detailed explanation goes here
pyr = cell(nlev,1);
pyr{1} = I;

filter = fspecial('gaussian');

for i=2:nlev
    % gaussian filter
    I = imfilter(I,filter,'symmetric');
    % downsample
    I = I(1:2:end,1:2:end);
    pyr{i} = I;
end
end

下圖就是生成的金字塔圖像


金字塔圖像

高斯濾波器可以看做一個低通濾波器,那么每經過一次的高斯濾波,圖像中僅能夠保留某個頻率值以下的頻率部分,所以高斯金字塔也可以看做一個低通金字塔(每一級只保留某個頻率以下的成分)。

拉普拉斯金字塔(Laplacian pyramid)

在進行高斯金字塔運算時,由于不斷的進行高斯濾波和下采樣,我們丟失了很多高頻信號,而拉普拉斯金字塔的目的就是保存這些高頻信號,保存這些高頻信號所采用的方式就是保存差分圖像。比如,拉普拉斯金字塔的第0層,就是原始圖像和原始圖像下采樣(Reduce)后再次上采樣(Expand)的圖像的差值。

function pyr = laplacian_pyramid(I,nlev)
r = size(I,1);
c = size(I,2);
if ~exist('nlev')
    % compute the highest possible pyramid    
    nlev = floor(log(min(r,c)) / log(2));
end
% recursively build pyramid
pyr = cell(nlev,1);
filter = pyramid_filter;
J = I;
for l = 1:nlev - 1
    % apply low pass filter, and downsample
    I = downsample(J,filter);
    odd = 2*size(I) - size(J);  % for each dimension, check if the upsampled version has to be odd
    % in each level, store difference between image and upsampled low pass version
    pyr{l} = J - upsample(I,odd,filter);
    J = I; % continue with low pass image
end
pyr{nlev} = J; % the coarest level contains the residual low pass image
%下采樣函數
function R = downsample(I, filter)
border_mode = 'symmetric';
% low pass, convolve with separable filter
R = imfilter(I,filter,border_mode);     %horizontal
R = imfilter(R,filter',border_mode);    %vertical
% decimate
r = size(I,1);
c = size(I,2);
R = R(1:2:r, 1:2:c, :);  
%上采樣函數
function R = upsample(I,odd,filter)

% increase resolution
I = padarray(I,[1 1 0],'replicate'); % pad the image with a 1-pixel border
r = 2*size(I,1);
c = 2*size(I,2);
k = size(I,3);
R = zeros(r,c,k);
R(1:2:r, 1:2:c, :) = 4*double(I); % increase size 2 times; the padding is now 2 pixels wide,注意這里要乘以4!

% interpolate, convolve with separable filter
R = imfilter(R,filter);     %horizontal
R = imfilter(R,filter');    %vertical

% remove the border
R = R(3:r - 2 - odd(1), 3:c - 2 - odd(2), :);
%產生拉普拉斯濾波器
function f = pyramid_filter()
f = [.05, .25, .4, .25, .05];  % original [Burt and Adelson, 1983]
%f = [.0625, .25, .375, .25, .0625];  % binom-5
f = f'*f;
end

通過上面的代碼,我們可以得到拉普拉斯金字塔如下所示。

拉普拉斯金字塔

由于拉普拉斯金字塔保留了高頻信號,那么我們可以用它來重建原始圖像。

function R = reconstruct_laplacian_pyramid(pyr)
r = size(pyr{1},1);
c = size(pyr{1},2);
nlev = length(pyr);
% start with low pass residual
R = pyr{nlev};
filter = pyramid_filter;
for l = nlev - 1 : -1 : 1
    % upsample, and add to current level
    odd = 2*size(R) - size(pyr{l});
    R = pyr{l} + upsample(R,odd,filter);
    %figure
    %imshow(R,[]);
    %imwrite(mat2gray(R),[num2str(l),'.jpg']);
end
重建的圖像

需要注意的地方

  • 為什么在處理高斯金字塔的時候需要采用濾波呢,直接下采樣不可以嗎?
    如果把圖像看做頻率信號的話,直接進行下采樣則會出現采樣不足的情況,消除這種情況的方法是采用低通濾波器(高斯濾波器)對圖像進行濾波,將采樣不足的高頻信號過濾掉,這樣在進行下采樣的時候就保證了不出現采樣不足的情況。

  • 一般在圖像處理中,將上面Matlab實現的下采樣函數(包括高斯濾波和圖像尺寸減半)這一部分叫做Reduce,將上面Matlab實現的上采樣函數(包括高斯濾波和圖像尺寸增加一倍)這部分叫做Expand,如果用數學方式表達的話,Expand函數如下:

注意前面需要乘以4。

  • 拉普拉斯金字塔可以看做一個帶通濾波器,在每一級都保留了圖像某個頻率值附近的成分。(這一點與高斯金字塔不同,高斯金字塔是低通金字塔)

  • 兩個低通濾波器的差值就構成了一個帶通濾波器。

兩個低通之差,構成帶通濾波器

Python實現

下面是高斯金字塔和拉普拉斯金字塔的Opencv-Python實現

import cv2
import numpy as np

def gaussian_pyr(img,lev):
    img = img.astype(np.float)
    g_pyr = [img]
    cur_g = img;
    for index in range(lev):
        cur_g = cv2.pyrDown(cur_g)
        g_pyr.append(cur_g)
    return g_pyr


def laplacian_pyr(img,lev):
    img = img.astype(np.float)
    g_pyr = gaussian_pyr(img,lev)
    l_pyr = []
    for index in range(lev):
        cur_g = g_pyr[index]
        next_g = cv2.pyrUp(g_pyr[index+1])
        cur_l = cv2.subtract(cur_g,next_g)
        l_pyr.append(cur_l)
    l_pyr.append(g_pyr[-1])
    return l_pyr

def lpyr_recons(l_pyr):
    lev = len(l_pyr)
    cur_l = l_pyr[-1]
    for index in range(lev-2,-1,-1):
        print(index)
        cur_l = cv2.pyrUp(cur_l)
        next_l = l_pyr[index]
        cur_l = cur_l + next_l
    return cur_l
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容

  • 轉自:http://www.cnblogs.com/silence-hust/p/4193208.html關于用拉...
    Mordekaiser閱讀 3,229評論 1 2
  • 圖像金字塔 圖像金字塔是圖像中多尺寸表達的一種,最主要的是用于圖像的分割。是一種以多分辨率來解釋圖像的有效但概念簡...
    傻傻小蘿卜閱讀 640評論 0 0
  • 圖像金字塔 圖像金字塔在圖像處理領域應用比較多,上課的時候只記得老師講的一個大概的概念:圖像金字塔和普通金字塔一樣...
    Mordekaiser閱讀 1,512評論 0 0
  • 有些情況下,我們需要處理源自同一張圖像的不同分辨率的圖像集合。這些不同分辨率的圖像組成的集合稱為圖像金字塔。 圖像...
    Kangel_Zenn閱讀 9,101評論 0 6
  • 一般來說,我們都是處理固定大小的圖片,但是有時候也會需要處理一個圖像的不同分辨率的圖片。比如在搜索圖像里的某些元素...
    xxxss閱讀 2,831評論 0 47