OpenCV Python - 图像Pyramid


有时,我们可能需要将图像转换为与其原始尺寸不同的尺寸。为此,您可以放大图像(放大)或缩小图像(缩小)。

图像Pyramid是连续下采样指定次数的图像集合(由单个原始图像构建)。

高斯Pyramid用于对图像进行下采样,而拉普拉斯Pyramid则从Pyramid中较低分辨率的图像重建上采样图像。

将Pyramid视为一组层。图像如下所示 -

Pyramid

Pyramid较高层的图像尺寸较小。为了在高斯Pyramid的下一层生成图像,我们将较低级别的图像与高斯核进行卷积。

$$\frac{1}{16}\begin{bmatrix}1 & 4 & 6 & 4 & 1 \\4 & 16 & 24 & 16 & 4 \\6 & 24 & 36 & 24 & 6 \\4 & 16 & 24 & 16 & 4 \\1 & 4 & 6 & 4 & 1\end{bmatrix}$$

现在删除所有偶数行和列。生成的图像将是其前一个图像面积的 1/4。在原始图像上迭代此过程会生成整个Pyramid。

为了使图像更大,列中填充了零。首先,使用新的偶数行扩大图像的大小,使其在每个维度上都是原始图像的两倍,然后与内核执行卷积以近似丢失像素的值。

cv.pyrUp ()函数将原始大小加倍,而cv.pyrDown()函数将其减小到一半。

例子

以下程序分别根据用户输入“I”或“o”调用pyrUp() 和pyrDown() 函数。

请注意,当我们缩小图像的大小时,图像的信息就会丢失。有一次,我们缩小尺寸,如果将其重新缩放到原始尺寸,我们会丢失一些信息,并且新图像的分辨率比原始图像低得多。

import sys
import cv2 as cv

filename = 'chicky_512.png'

src = cv.imread(filename)

while 1:
   print ("press 'i' for zoom in 'o' for zoom out esc to stop")
   rows, cols, _channels = map(int, src.shape)
   cv.imshow('Pyramids', src)
   k = cv.waitKey(0)

   if k == 27:
      break

   elif chr(k) == 'i':
      src = cv.pyrUp(src, dstsize=(2 * cols, 2 * rows))

   elif chr(k) == 'o':
      src = cv.pyrDown(src, dstsize=(cols // 2, rows // 2))

cv.destroyAllWindows()

输出

图像Pyramid

高斯Pyramid

拉普拉斯Pyramid