图像金字塔是图像处理和计算机视觉中常用到的概念,常常用于多尺度处理领域(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

matlab 拉普拉斯金字塔,图像金字塔相关推荐

  1. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔总结

    我们经常会将某种尺寸的图像转换为其他尺寸的图像,如果放大或者缩小图片的尺寸,笼统来说的话,可以使用OpenCV为我们提供的如下两种方式: <1> resize函数.这是最直接的方式, &l ...

  2. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放...

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  3. 【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  4. 原理 拉普拉斯金字塔_图像金字塔(高斯金字塔、拉普拉斯金字塔)

    1.图像金字塔 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构. 图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状 ...

  5. 【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔

    OpenCV 例程200篇 总目录-202205更新 [youcans 的 OpenCV 例程200篇]186.图像金字塔之拉普拉斯金字塔 图像金字塔是一种以多分辨率来解释图像的结构,常用于图像分割. ...

  6. 15. 图像金字塔-高斯金字塔、拉普拉斯金字塔、DOG金字塔

    1.  什么是图像金字塔 图像金字塔是图像处理和计算机视觉中常用到的概念,常常用于多尺度处理领域(multiscale processing),尤其早年的图像匹配.识别.图像分割等算法中都用到了图像金 ...

  7. 滤波、漫水填充、图像金字塔、图像缩放、阈值化

      imgpro 组件是 Image 和 Process 这两个单词的缩写组合,即图像处理模块,这个模块包含了如下内容: 文章目录 1.线性滤波:方框滤波.均值滤波.高斯滤波 1.1 平滑处理 1.2 ...

  8. opencv进阶学习笔记10:图像金字塔和图像梯度

    基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 图像金字塔 变小 变大 原理 ...

  9. python+OpenCV图像处理(九)图像金字塔

    图像金字塔        图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构.图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步 ...

  10. 【OpenCV 例程200篇】31. 图像金字塔(cv2.pyrDown)

    [OpenCV 例程200篇]31. 图像金字塔(cv2.pyrDown) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更 ...

最新文章

  1. PyTorch中的Element-wise operations
  2. redux react ajax,使用react-redux触发事件操作
  3. jmeter使用问题——将接口返回变量存储成csv文件
  4. android项目中单实例数据库类
  5. 前端学习(2008)vue之电商管理系统电商系统之获取静态属性列表
  6. 【转载】linux环境下tcpdump源代码分析
  7. 【ABAP系列】SAP ABAP 取两个内表的交集 比较两个内表的不同
  8. TreeMap源码解析
  9. 《ArcGIS Runtime SDK for Android开发笔记》——(11)、ArcGIS Runtime SDK常见空间数据加载...
  10. 主机通过网络访问虚拟机VirtualBox的WEB服务器
  11. 机器人的分类、发展史、现状及国内外发展趋势
  12. WA47 电子管麦克风
  13. 字符串转成正则表达式
  14. Dubbo—— 一个服务既是消费者又是提供者
  15. 算力基础设施的现状、趋势和对策建议
  16. 并发编程之原子性及同步锁
  17. 【文章思路、算法分析】Membership Inference Attacks Against Machine Learning Models
  18. c++ stack用法 入门必看 超详细
  19. 政务大厅存在的问题及信息化建设
  20. BZOJ1984: 月下“毛景树”

热门文章

  1. win7 OneNote不能登录一直登录
  2. 安卓10自带录屏_荣耀v10怎么录屏?荣耀v10三种录屏方法
  3. C语言方波转换正弦波,方波转换成正弦波电路
  4. 错误:java.lang.IllegalArgumentException: Service not registered
  5. 简单的php表单制作
  6. table表单的制作
  7. 计算机应用基础制作表格的步骤,计算机应用基础_WORD制作表格_表格编辑公开课课件.ppt...
  8. y-在C语言while语句中的意义,c语言while用法(C语言while用法)
  9. win7计算机出现空白图标,Win7系统桌面图标显示异常变未知白色图标解决方法大全...
  10. 一招教你解决Rational rose画时序图(Sequence diagram)时找不到参与者(Actor)的尴尬现场