OpenCV Python 图像金字塔
有时候,我们可能需要将一幅图像转换为与其原始大小不同的尺寸。为此,您可以对图像进行放大(缩小)或缩小(放大)。
图像金字塔是一组图像(由单个原始图像构成),按照指定的次数进行逐渐降采样。
高斯金字塔用于对图像进行降采样,而拉普拉斯金字塔则从金字塔中分辨率较低的图像重建上采样图像。
将金字塔视为一组层。以下是该图像的示例−
金字塔的上层图像尺寸较小。为了生成高斯金字塔中下一层的图像,我们将低一级图像与高斯核进行卷积。
\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()