如何使用OpenCV在Python中找到一张图像的高斯金字塔?
在许多情况下,我们需要处理同一图像的不同分辨率和大小。在图像金字塔的概念中,我们可以找到具有不同分辨率和大小的原始图像的图像。高斯金字塔是一种图像金字塔。
要找到一个 高斯金字塔 , OpenCV 提供了两个函数 cv2.pyrDown() 和 cv2.pyrUp() 。
- 函数 cv2.pyrDown() 减小输入图像中相邻行和列的分辨率。输出图像的宽度和高度变为输入图像的一半,其面积减小至四分之一。
-
函数 cv2.pyrUp() 通过在输入图像中添加相邻的行和列来增加分辨率。输出图像的宽度和高度为输入图像的两倍,其面积增加四倍。
我们可以通过等级降低或等级提高来创建高斯金字塔。要创建等级降低的高斯金字塔,我们应用 cv2.pyrDown() 函数。创建等级提高的高斯金字塔时,应用 cv2.pyrUp() 函数。
在创建高斯金字塔时,原始图像被设置为基本图像。可以使用这两个函数找到更高的层。
示例1
在本例中,我们创建了一个3层的高斯金字塔。我们使用 cv.pyrDown() 进行两次等级下降。
# 导入必要的库
import cv2
# 加载图像,它是高斯金字塔的第一层
img = cv2.imread('car.jpg')
# 获取高斯金字塔的第二层图像(分辨率下降)
pyramid1 = cv2.pyrDown(img)
# 获取第三层高斯金字塔图像(分辨率下降)
pyramid2 = cv2.pyrDown(pyramid1)
# 定义三个窗口以显示三个层图像
cv2.imwrite('pyramid2.jpg', pyramid2)
cv2.namedWindow('Layer 1', cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('Layer 2', cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('Layer 3', cv2.WINDOW_AUTOSIZE)
# 显示所有的层图像
cv2.imshow('Layer 1', img)
cv2.imshow('Layer 2', pyramid1)
cv2.imshow('Layer 3', pyramid2)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用下面的图像 ” car.jpg ” 作为上述程序代码中的输入文件。
输出
运行程序后,将产生以下输出窗口。
以上输出显示,较高级别的分辨率(如“Layer 2”)是较低级别分辨率(如“Layer 1”)的一半。同样,第三层的分辨率是第二层的一半。
注意 − 上述 Layer 3 的输出图像用作下面示例2中的输入。
示例2
在这个例子中,我们使用 cv2.pyrUp() 函数进行了三层高斯金字塔向上采样过程。我们使用了两次上采样(Level up)。
import cv2
img = cv2.imread('pyramid2.jpg')
pyr1 = cv2.pyrUp(img)
pyr2 = cv2.pyrUp(pyr1)
cv2.namedWindow('Layer 1', cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('Layer 2', cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('Layer 3', cv2.WINDOW_AUTOSIZE)
cv2.imshow('Layer 1', img)
cv2.imshow('Layer 2', pyr1)
cv2.imshow('Layer 3', pyr2)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
在执行上述代码时,将产生以下输出窗口。
上述输出显示,较高层级(即Layer 2)的分辨率是较低层级(如Layer 1)的两倍。同样,Layer 3的分辨率是Layer 2的两倍。
请注意Example 1中的输入图像和Example 2的输出中的Layer 3图像之间的差异。