图像金字塔的作用

图像金字塔简单来说就是用多个不同的尺寸来表示一张图片。如下图,最左边的图片是原始图片,然后从左向右图片的尺寸依次缩小直到图片的尺寸达到一个阈值,这个阈值就是多次缩小图片的最小尺寸,不会有比这更小尺寸的图片了,像这种图片的尺寸逐步递增或递减的多张图层就是图像金字塔,每张不同尺寸的图片都称为图像金字塔的一层。图像金字塔的目的就是寻找图片中出现的不同尺寸的目标(物体、动物等)。

代码实现

创建了、一个名为 pyramid 函数,这个函数将用来生成图像金字塔,这个函数有三个参数,如下所示。

  • 第一个参数 image 是要进行图像金字塔操作的原始图片。
  • 第二个参数 top 是图像将会被缩小的最小尺寸,我们将这个参数设置一个默认值为 (128, 128),第一个 128 表示图片的高,第二个 128 表示图片的宽。
  • 第三个参数 ratio 表示每次图像将会被缩小 ratio 倍,我们给这个参数设置了一个默认值为 1.2
import cv2
from matplotlib import pyplot as plt
from IPython import display
%matplotlib inline
def pyramid(image, top = (128, 128), ratio = 1.2):
yield image

while True:
(w, h) = (int(image.shape[1] / ratio), int(image.shape[0] / ratio))
image = cv2.resize(image, (w, h), interpolation = cv2.INTER_AREA)

if w < top[1] or h < top[0]:
break

yield image

在函数内我们首先使用 yield 生成器返回原始图片,因为在图像金字塔的最底端我们需要一张原始图片。然后使用 while 循环来不断缩小图片尺寸。直到缩小后图片的尺寸比前面的 top 参数小为止。在循环内 (w, h) 表示图像金字塔前一层的图像缩小 ratio 倍的宽和高。我们使用 cv2.resize 方法将前一层图片进行缩放,我们将 (w, h) 作为函数的第二个参数,表示缩放后图片的宽和高的值。

随着图片的尺寸不断缩小,我们使用 if 语句判断图片的尺寸是否已经到达了设定的最小尺寸,将每次图片缩放后的宽和高与设定的最小尺寸 top 进行对比,如果小于最小尺寸则使用 break 结束循环。最后使用 yield 生成器返回每次缩放后的图片。至此图像金字塔的函数就构建完成了。