opencv-python:18_图像金字塔(高斯金字塔、拉普拉斯金字塔 、cv2.pyrUp()、cv2.pyrDown())

图像金字塔

  • 学习图像金字塔
  • 相关函数:cv2.pyrUp(),cv2.pyrDown()。

一、原理

  • 一般情况下,我们要处理是一副具有固定分辨率的图像。但是有些情况下,我们需要对同一图像的不同分辨率的子图像进行处理。比如,我们要在一幅图像中查找某个目标,比如脸,我们不知道目标在图像中的尺寸大小。这种情下,我们需要创建创建一组图像,这些图像是具有不同分辨率的原始图像。我们把这组图像叫做图像金字塔(简单来说就是同一图像的不同分辨率的子图集合)。

  • 把最大的图像放在底部,最小的放在顶部,看起来像一座金字塔,故而得名图像金字塔。

二、分类

  • 两类图像金字塔:高斯金字塔和拉普拉斯金字塔。

  • 高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。顶部图像中的每个像素值等于下一层图像中 5 个像素的高斯加权平均值。这样操作一次一个 MxN 的图像就变成了一个 M/2xN/2 的图像。所以这幅图像的面积就变为原来图像面积的四分之一。这被称为 Octave。连续进行这样的操作我们就会得到一个分辨率不断下降的图像金字塔。

三、两种采样方法

  • 获得图像金字塔一般包括二个步骤:

    1. 利用低通滤波器平滑图像

    2. 对平滑图像进行抽样(采样)

  • 有两种采样方式——上采样(分辨率逐级升高)和下采样(分辨率逐级降低)。

  • 我们可以使用函数cv2.pyrDown() 和 cv2.pyrUp() 构建图像金字塔。

    • cv2.pyrDown() 从一个高分辨率大尺寸的图像向上构建一个金子塔(尺寸变小,分辨率降低)。

    • cv2.pyrUp() 从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会增加)。

1. 高斯金字塔

  • 向下采样方法(缩小)
    opencv-python:18_图像金字塔(高斯金字塔、拉普拉斯金字塔 、cv2.pyrUp()、cv2.pyrDown())_第1张图片

  • 向上采样方法(放大)
    opencv-python:18_图像金字塔(高斯金字塔、拉普拉斯金字塔 、cv2.pyrUp()、cv2.pyrDown())_第2张图片

上采样之后再下采样,跟原图不一样。损失了部分信息。因为一旦使用 cv2.pyrDown(),图像的分辨率就会降低,信息就会被丢失。从 cv2.pyrDown() 产生的图像金字塔的(由下到上)第三层图像使用函数cv2.pyrUp() 得到的图像,与原图像相比分辨率差了很多。

2. 拉普拉斯金字塔

opencv-python:18_图像金字塔(高斯金字塔、拉普拉斯金字塔 、cv2.pyrUp()、cv2.pyrDown())_第3张图片

import cv2
import numpy as np
from matplotlib import pyplot as plt

img=cv2.imread('tower.jpg')
print (img.shape)

up=cv2.pyrUp(img)
print (up.shape)

down=cv2.pyrDown(img)
print (down.shape)

输出三张图片的shape:

(753, 500, 3)
(1506, 1000, 3)
(377, 250, 3)
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
cv_show(img,'img')
cv_show(up,'up')
cv_show(down,'down')
# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(131),plt.imshow(img,cmap = 'gray'),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(up,cmap = 'gray'),plt.title('up'),plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(down,cmap = 'gray'),plt.title('down'),plt.xticks([]), plt.yticks([])
plt.show()

以同样的大小展示图片,可以看到图片的效果发生了变化。
opencv-python:18_图像金字塔(高斯金字塔、拉普拉斯金字塔 、cv2.pyrUp()、cv2.pyrDown())_第4张图片

你可能感兴趣的:(opencv-python:18_图像金字塔(高斯金字塔、拉普拉斯金字塔 、cv2.pyrUp()、cv2.pyrDown()))