OpenCV Python - 图像金字塔
有时,我们可能需要将图像转换为与其原始尺寸不同的尺寸。 为此,您可以放大图像(放大)或缩小图像(缩小)。
图像金字塔是连续向下采样指定次数的图像集合(由单个原始图像构建)。
Gaussian 高斯金字塔用于对图像进行下采样,而 Laplacian 拉普拉斯金字塔用于从金字塔较低分辨率的图像重建上采样图像。
将金字塔视为一组图层。 图像如下所示 −
金字塔较高层的图像尺寸较小。 为了在高斯金字塔的下一层生成图像,我们将较低级别的图像与高斯核进行卷积。
$$\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。 在原始图像上迭代此过程会生成整个金字塔。
为了使图像更大,列用零填充。 首先,放大图像以在每个维度上将原始图像放大一倍,并使用新的偶数行,然后与内核执行卷积以近似缺失像素的值。
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()