图像金字塔

图像金字塔是图像处理和计算机视觉中常用到的概念,常常用于多尺度处理领域(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阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 转自:http://www.cnblogs.com/silence-hust/p/4193208.html关于用拉...
    Mordekaiser阅读 3,096评论 1 2
  • 图像金字塔 图像金字塔是图像中多尺寸表达的一种,最主要的是用于图像的分割。是一种以多分辨率来解释图像的有效但概念简...
    傻傻小萝卜阅读 616评论 0 0
  • 图像金字塔 图像金字塔在图像处理领域应用比较多,上课的时候只记得老师讲的一个大概的概念:图像金字塔和普通金字塔一样...
    Mordekaiser阅读 1,491评论 0 0
  • 有些情况下,我们需要处理源自同一张图像的不同分辨率的图像集合。这些不同分辨率的图像组成的集合称为图像金字塔。 图像...
    Kangel_Zenn阅读 9,065评论 0 6
  • 一般来说,我们都是处理固定大小的图片,但是有时候也会需要处理一个图像的不同分辨率的图片。比如在搜索图像里的某些元素...
    xxxss阅读 2,796评论 0 47