opencv(19) 图像金字塔

当我们需要将图像转换到另一个尺寸的时候, 有两种可能:

  1. 放大 图像 或者
  2. 缩小 图像。

尽管OpenCV 几何变换 部分提供了一个真正意义上的图像缩放函数(resize, 在以后的教程中会学到),不过在本篇我们首先学习一下使用 图像金字塔 来做图像缩放, 图像金字塔是视觉运用中广泛采用的一项技术。

1 图像金字塔原理

图像采样处理可以降低图像的大小,本文将补充图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数。

一个图像金字塔是一系列图像的集合 - 所有图像来源于同一张原始图像 - 通过梯次向下采样获得,直到达到某个终止条件才停止采样。

图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。

有两种类型的图像金字塔常常出现在文献和应用中:

  1. 高斯金字塔(Gaussian pyramid): 用来向下采样
  2. 拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样图像

2 高斯金字塔

想想金字塔为一层一层的图像,层级越高,图像越小。

如图下图所示,它包括了四层图像,将这一层一层的图像比喻成金字塔。图像金字塔可以通过梯次向下采样获得,直到达到某个终止条件才停止采样,在向下采样中,层级越高,则图像越小,分辨率越低[1-2]。

1. 每一层都按从下到上的次序编号, 层级i+1 (表示为 Gi+1 尺寸小于层级 i (Gi ))。

2. 为了获取层级为 i+1 的金字塔图像,我们采用如下方法:

  •  将 Gi 与高斯内核卷积:
  • 将所有偶数行和列去除。

3. 显而易见,结果图像只有原图的四分之一。通过对输入图像 G0  (原始图像) 不停迭代以上步骤就会得到整个金字塔。

以上过程描述了对图像的向下采样,如果将图像变大呢?:

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

4. 在图中,将图像G0转换为G1、G2、G3,图像分辨率不断降低的过程称为向下取样;将G3转换为G2、G1、G0,图像分辨率不断增大的过程称为向上取样

5. 这两个步骤(向下和向上采样) 分别通过OpenCV函数 pyrUppyrDown 实现, 我们将会在下面的示例中演示如何使用这两个函数。

3 cv2.pyrUp()图像向上取样

 

在图像向上取样是由小图像不断放图像的过程。它将图像在每个方向上扩大为原图像的2倍,新增的行和列均用0来填充,并使用与向下取样相同的卷积核乘以4,再与放大后的图像进行卷积运算,以获得新增像素的新值。如下图所示,它在原始像素4512389149之间各新增了一行和一列值为0的像素。

每一次向上采样,图像扩大4倍,但清晰度降低

函数原型dst = pyrUp(src[, dst[, dstsize[, borderType]]])

参数:

  1. src表示输入图像,
  2. dst表示输出图像,和输入图像具有一样的尺寸和类型
  3. dstsize表示输出图像的大小,默认值为Size()
  4. borderType表示像素外推方法,详见cv::bordertypes

4 cv2.pyrDown()图像向下取样

在图像向下取样中,使用最多的是高斯金字塔。它将对图像Gi进行高斯核卷积,并删除原图中所有的偶数行和列,最终缩小图像。其中,高斯核卷积运算就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(权重不同)经过加权平均后得到。常见的3×35×5高斯核如下:

高斯核卷积让临近中心的像素点具有更高的重要度,对周围像素计算加权平均值,如下图10所示,其中心位置权重最高为0.4

每一次向下采样,图像缩小4倍,但清晰度降低

函数原型dst = pyrDown(src[, dst[, dstsize[, borderType]]])

参数:

  1. src表示输入图像,
  2. dst表示输出图像,和输入图像具有一样的尺寸和类型
  3. dstsize表示输出图像的大小,默认值为Size()
  4. borderType表示像素外推方法,详见cv::bordertypes

5 综合示例

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
 
#读取原始图像
img = cv2.imread('C:\\Users\\xxx\\Downloads\\lena.jpg')
 
#图像多次向上取样
u1 = cv2.pyrUp(img)
u2 = cv2.pyrUp(u1)
u3 = cv2.pyrUp(u2)

#图像多次向下取样
d1 = cv2.pyrDown(img)
d2 = cv2.pyrDown(d1)
d3 = cv2.pyrDown(d2)
 
#显示多次向上采集图像
cv2.imshow('original', img)
cv2.imshow('PyrUp1', u1)
cv2.imshow('PyrUp2', u2)
cv2.imshow('PyrUp3', u3)
cv2.waitKey()
cv2.destroyAllWindows()
 
#显示多次向下采集图像
cv2.imshow('original', img)
cv2.imshow('PyrDown1', d1)
cv2.imshow('PyrDown2', d2)
cv2.imshow('PyrDown3', d3)
cv2.waitKey()
cv2.destroyAllWindows()

 可以看到,每一次向上采样,图像扩大4倍,但清晰度降低,如下:

可以看到,每一次向下采样,图像缩小4倍,但清晰度降低,如下:

6 小结

图像金字塔处理,包括图像向上取样和向下取样。需要注意,向上取样放大后的图像比原始图像要模糊,而每次向下取样会删除偶数行和列,它会不停地丢失图像的信息。此外,向上采样和向下采样不是互逆的操作,经过两种操作后,是无法恢复原始图像的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值