Python+OpenCV:图像金字塔
程序员文章站
2023-12-27 08:24:45
...
Python+OpenCV:图像金字塔
理论
通常情况下,我们使用固定大小的图像。但在某些情况下,我们需要处理(相同的)不同分辨率的图像。
例如,当搜索图像中的某些东西时,比如脸,我们不确定该物体在图像中呈现的大小。
在这种情况下,我们将需要创建一组具有不同分辨率的相同图像,并在所有这些图像中搜索对象。
这些具有不同分辨率的图像集合被称为图像金字塔(因为当它们被保存在一个堆栈中,最高分辨率的图像在底部,最低分辨率的图像在顶部,它看起来像一个金字塔)。
图像金字塔有两种:1)Gaussian 金字塔;2)Laplacian 金字塔
Gaussian金字塔中的高水平(低分辨率)是通过去除低水平(高分辨率)图像中连续的行和列而形成的。然后,利用下一层5个像素的高斯权值贡献,形成上一层的每个像素。
这样,一个M×N的图像就变成了M/2×N/2的图像。所以面积减少到原来的1 / 4。它被称为倍频。当我们进入金字塔的上部时,同样的模式继续(即分辨率降低)。
同样地,当扩展时,每层面积将变成4倍。我们可以使用cvv.pyrdown()和cvv.pyrup()函数找到高斯金字塔。
Laplacian金字塔是由Gaussian金字塔构成的。它没有专门的功能。Laplacian金字塔图像只是像边缘图像。它的大多数元素都是0。它们被用于图像压缩。
Laplacian金字塔中的层次是由Gaussian金字塔中的层次与Gaussian金字塔中上层层次的扩展形式的差而形成的。
示例
####################################################################################################
# 图像金字塔(Image Pyramids)
def lmc_cv_image_pyramids():
"""
函数功能: 图像金字塔(Image Pyramids).
"""
# 读取图像
image = lmc_cv.imread('D:/99-Research/Python/Image/Lena.jpg')
image = lmc_cv.cvtColor(image, lmc_cv.COLOR_RGB2BGR)
# 图像金字塔(Image Pyramids)
pyr_down_image1 = lmc_cv.pyrDown(image)
pyr_down_image2 = lmc_cv.pyrDown(pyr_down_image1)
pyr_down_image3 = lmc_cv.pyrDown(pyr_down_image2)
pyr_down_image4 = lmc_cv.pyrDown(pyr_down_image3)
pyr_down_image5 = lmc_cv.pyrDown(pyr_down_image4)
# 显示图像
pyplot.figure('Image Display')
titles = ['Original Image', 'Down Pyramids 1', 'Down Pyramids 2', 'Down Pyramids 3', 'Down Pyramids 4',
'Down Pyramids 5']
images = [image, pyr_down_image1, pyr_down_image2, pyr_down_image3, pyr_down_image4, pyr_down_image5]
for i in range(6):
pyplot.subplot(2, 3, i + 1)
pyplot.imshow(images[i], 'gray')
pyplot.title(titles[i])
pyplot.xticks([])
pyplot.yticks([])
pyplot.show()
# 根据用户输入保存图像
if ord("q") == (lmc_cv.waitKey(0) & 0xFF):
# 销毁窗口
pyplot.close()
return
图像金字塔融合(Image Pyramids Blending)
####################################################################################################
# 图像金字塔融合(Image Pyramids Blending)
def lmc_cv_image_pyramids_blending():
"""
函数功能: 图像金字塔融合(Image Pyramids Blending).
"""
# 读取图像
image1 = lmc_cv.imread('D:/99-Research/Python/Image/apple.jpg')
image2 = lmc_cv.imread('D:/99-Research/Python/Image/orange.jpg')
image1 = lmc_cv.cvtColor(image1, lmc_cv.COLOR_RGB2BGR)
image2 = lmc_cv.cvtColor(image2, lmc_cv.COLOR_RGB2BGR)
# 图像金字塔融合(Image Pyramids Blending)
# generate Gaussian pyramid for image1
copy_image = image1.copy()
gp_image1 = [copy_image]
for i in range(6):
copy_image = lmc_cv.pyrDown(copy_image)
gp_image1.append(copy_image)
# generate Gaussian pyramid for image2
copy_image = image2.copy()
gp_image2 = [copy_image]
for i in range(6):
copy_image = lmc_cv.pyrDown(copy_image)
gp_image2.append(copy_image)
# generate Laplacian Pyramid for image1
lp_image1 = [gp_image1[5]]
for i in range(5, 0, -1):
ge_image = lmc_cv.pyrUp(gp_image1[i])
lp_image = lmc_cv.subtract(gp_image1[i - 1], ge_image)
lp_image1.append(lp_image)
# generate Laplacian Pyramid for image2
lp_image2 = [gp_image2[5]]
for i in range(5, 0, -1):
ge_image = lmc_cv.pyrUp(gp_image2[i])
lp_image = lmc_cv.subtract(gp_image2[i - 1], ge_image)
lp_image2.append(lp_image)
# Now add left and right halves of images in each level
ls_image = []
for la, lb in zip(lp_image1, lp_image2):
rows, cols, dpt = la.shape
ls = np.hstack((la[:, 0:cols // 2], lb[:, cols // 2:]))
ls_image.append(ls)
# now reconstruct
reconstruct_image = ls_image[0]
for i in range(1, 6):
reconstruct_image = lmc_cv.pyrUp(reconstruct_image)
reconstruct_image = lmc_cv.add(reconstruct_image, ls_image[i])
# image with direct connecting each half
real_image = np.hstack((image1[:, :cols // 2], image2[:, cols // 2:]))
# 显示图像
pyplot.figure('Image Display')
titles = ['Original Image 1', 'Original Image 2', 'Image Pyramids Blending', 'Image Direct Blending']
images = [image1, image2, reconstruct_image, real_image]
for i in range(4):
pyplot.subplot(2, 2, i + 1)
pyplot.imshow(images[i], 'gray')
pyplot.title(titles[i])
pyplot.xticks([])
pyplot.yticks([])
pyplot.show()
# 根据用户输入保存图像
if ord("q") == (lmc_cv.waitKey(0) & 0xFF):
# 销毁窗口
pyplot.close()
return