网站菜单

OpenCV学习笔记(6)——图像金字塔

原理

图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像素采样的方式,生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底部,以金字塔形状排列,往上是一系列像素(尺寸)逐渐降低的图像,一直到金字塔的顶部只包含一个像素点的图像,这就构成了传统意义上的图像金字塔。

生成图像金字塔主要包括两种方式——向下取样(缩小图像),向上取样(放大图像)。向下取样是分辨率越来越小;向上取样是增加像素。

1. 高斯金字塔

向下取样:Gi -> Gi+1

  1. 对图像Gi进行高斯核卷积。
  2. 删除所有的偶数行和列。

每次处理以后,结果图像是原来的四分之一(M/2 * N/2)。上述操作被称为Octave。

向上取样: Gi -> Gi-1

  1.  将图像在每个方向扩大为原来的两倍,新增的行和列以0填充。
  2. 使用先前同样的卷积核乘以四与放大后的图像卷积,获得 “新增像素”的近似值。

乘以四的卷积核例子:

上图的像素45如果正常卷积,会变成45/4,因为周围都是新增像素0。为了能使图像正确,必须在卷积核乘以4来还原颜色。

得到的图像即为放大后的图像,但是与原来的图像相比会发觉比较模糊,因为在缩放的过程中已经丢失了一些信息,如果想在缩小和放大整个过程中减少信息的丢失,这些数据形成了拉普拉斯金字塔

1.1 SIFT中的高斯金字塔*

高斯金字塔式在Sift算子中提出来的概念,首先高斯金字塔并不是一个金字塔,而是有很多组(Octave)金字塔构成,并且每组金字塔都包含若干层(Interval)。

高斯金字塔的构建过程:

1. 先将原图像扩大一倍之后作为高斯金字塔的第1组第1层,将第1组第1层图像经高斯卷积(其实就是高斯平滑或称高斯滤波)之后作为第1组金字塔的第2层,高斯卷积函数为:

G(x,y)=\frac{1}{2\pi \sigma ^2}e^{-\frac{(x-x_0)^2+(y-y_0)^2}{2\sigma ^2}}

对于参数σ,在Sift算子中取的是固定值1.6。

2. 将σ乘以一个比例系数k,等到一个新的平滑因子σ=k*σ,用它来平滑第1组第2层图像,结果图像作为第3层。

3. 如此这般重复,最后得到L层图像,在同一组中,每一层图像的尺寸都是一样的,只是平滑系数不一样。它们对应的平滑系数分别为:

0,σ,kσ,k^2σ,k^3σ……k^{L-2}σ

4. 将第1组倒数第三层图像作比例因子为2的降采样,得到的图像作为第2组的第1层,然后对第2组的第1层图像做平滑因子为σ的高斯平滑,得到第2组的第2层,就像步骤2中一样,如此得到第2组的L层图像,同组内它们的尺寸是一样的,但是在尺寸方面第2组是第1组图像的一半。

这样反复执行,就可以得到一共O组,每组L层,共计O*L个图像,这些图像一起就构成了高斯金字塔,结构如下:

1.2高斯金字塔在OpenCV调用

向下取样:

#img2 = cv2.pyrDown(img1)

img2 = cv2.pyrDown(img1)
img3 = cv2.pyrDown(img2)
img4 = cv2.pyrDown(img3)

向上取样:

#img2 = cv2.pyrUp(img1)

img2 = cv2.pyrUp(img1)
img3 = cv2.pyrUp(img2)
img4 = cv2.pyrUp(img3)

2. 差分金字塔*

DOG(Difference of Gaussian)金字塔是在高斯金字塔的基础上构建起来的,其实生成高斯金字塔的目的就是为了构建DOG差分金字塔。

构建过程:

差分金字塔的第1组第1层是由高斯金字塔的第1组第2层减第1组第1层得到的。以此类推,逐组逐层生成每一个差分图像,所有差分图像构成差分金字塔。括为差分金字塔的第o组第l层图像是有高斯金字塔的第o组第l+1层减第o组第l层得到的。

结果都是黑的,人眼看不到效果。实际计算结果包含了大量信息点。
我们对结果进行归一化操作,此时就变成了laplace金字塔了。

3.拉普拉斯金字塔

3.1 拉普拉斯金字塔原理

3.2 拉布拉斯金字塔在OpenCV的调用

#img2 = img1 - PyrUp(PyrDown(img1))

#第0层
img1d = cv2.pyrDown(img1)
img1u = cv2.pyrUp(img1d)
lap0 = img1 - img1u
img2 = img1d

#第1层
img2d = cv2.pyrDown(img2)
img2u = cv2.pyrUp(img2d)
lap1 = img2 - img2u
img3 = img2d
显示评论 (6)

文章评论

  • Say, you got a nice post. Really looking forward to read more. Really Great. Vivia Leon Oberg

    • 本文作者
    • 回复
  • A round of applause for your blog post. Really looking forward to read more. Much obliged. Aliza Abeu Wilmott

    • 本文作者
    • 回复
  • Appreciating the persistence you put into your site and detailed information you provide. Mallissa Alaric Hieronymus

    • 本文作者
    • 回复
  • I need to to thank you for this good read!! I certainly loved every bit of it. Daisie Tann Fleck

    • 本文作者
    • 回复
  • gerçekten güzel bir yazı olmuş. Yanlış bildiğimiz bir çok konu varmış. Teşekkürler.

    • 本文作者
    • 回复
  • very informative articles or reviews at this time.

    • 本文作者
    • 回复

相关推荐

Ubuntu交叉编译Python

在 Ubuntu 上交叉编译 Python 的流程通常用于为不同平台生成可执行文件(如 ARM、MIPS 等)。以下是一般的操作步骤: 1. 安装必要的依赖工具 首先,确保已经安装了编译所需的工具和依…

RKNN开发环境常用命令

板端 确认RKNPU2驱动版本 检查RKNPU2环境是否安装 如果出现以下信息则代表启动服务成功 检查版本是否一致 如果出现以下输出,则代表有rknn环境 安装RKNN服务 查看NPU占用