OpenCV-Python教程:图像金字塔

原文链接:http://www.juzicode.com/opencv-python-pyrup-pyrdown

返回Opencv-Python教程

图像金字塔是一系列图像的集合,就如下图所示,更高层图像尺寸更小,更底层图像尺寸更大,看起来就像一个金字塔一样:

图源:docs.opencv.org

1、pyrDown

这里的down是指图像变小,所以原始图像在金字塔的底部。

首先将当前层的图像和下面这个高斯核卷积:

这个高斯核的尺寸为5×5大小,所有元素的值加起来正好为256,最后再除以256,得到的加权和正好为1。其距离最中心越近数值越大,这正好和高斯平滑选择的高斯核类似。这个过程也类似于高斯平滑,从后面的例子也可以看到经过pyrDown()处理的图像变得更加模糊(平滑)。然后移除偶数行和偶数列,然后就能得到和原图相比是原图1/4大小的新的图像,在图像金字塔中就位于当前层的上一层。

接口形式:

cv2.pyrDown(src[, dst[, dstsize[, borderType]]]) ->dst 
  • 参数含义:
  • src:源图像;
  • dst:目标图像;
  • dstsize:缩放后目标图像的尺寸,必须满足std::abs(dsize.width*2 – ssize.width) <= 2 && std::abs(dsize.height*2 – ssize.height) <= 2
  • borderType:边界填充类型;

下面的例子中连续3次进行pyrDown:

import cv2
print('VX公众号: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)

img = cv2.imread('..\\messi5.jpg')
img_down = cv2.pyrDown(img,dstsize=(img.shape[1]//2,img.shape[0]//2))
img_down2 = cv2.pyrDown(img_down,dstsize=(img_down.shape[1]//2,img_down.shape[0]//2))
img_down3 = cv2.pyrDown(img_down2,dstsize=(img_down2.shape[1]//2,img_down2.shape[0]//2))
print('img.shape',img.shape)
print('img_down.shape',img_down.shape)
print('img_down2.shape',img_down2.shape)
print('img_down3.shape',img_down3.shape)
cv2.imshow('img',img)
cv2.imshow('img_down',img_down)
cv2.imshow('img_down2',img_down2)
cv2.imshow('img_down3',img_down3)
cv2.waitKey(0)

运行结果:

VX公众号: 桔子code / juzicode.com
cv2.__version__: 4.5.3
img.shape (342, 548, 3)
img_down.shape (171, 274, 3)
img_down2.shape (85, 137, 3)
img_down3.shape (42, 68, 3)

2、pyrUp

这里的up是指将图像的尺寸变大,所以原始图像位于图像金字塔的顶层。

首先将当前层图像的宽高扩大2倍,插入的行和列位于偶数行或偶数列,这些位置填充数值0;然后用和pyrDown一样的kernel和当前层的图像卷积,填充到刚才插入的行列中。

接口形式:

cv2.pyrUp(src[, dst[, dstsize[, borderType]]]) ->dst
  • 参数含义:
  • src:源图像;
  • dst:目标图像;
  • dstsize:缩放后目标图像的尺寸,必须满足std::abs(dsize.width – ssize.width*2) == dsize.width % 2 && std::abs(dsize.height – ssize.height*2) == dsize.height % 2
  • borderType:边界填充类型;

下面的例子中连续3次进行pyrUp,为了显示方便,这里原图用resize()进行了缩小:

import cv2
print('VX公众号: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)

img = cv2.imread('..\\messi5.jpg')
img = cv2.resize(img,None,fx=0.15,fy=0.15)#为了观察方便缩小原图
img_up = cv2.pyrUp(img,dstsize=(2*img.shape[1],2*img.shape[0]))
img_up2 = cv2.pyrUp(img_up,dstsize=(2*img_up.shape[1],2*img_up.shape[0]))
img_up3 = cv2.pyrUp(img_up2,dstsize=(2*img_up2.shape[1],2*img_up2.shape[0]))
print('img.shape',img.shape)
print('img_up.shape',img_up.shape)
print('img_up2.shape',img_up2.shape)
print('img_up3.shape',img_up3.shape)
cv2.imshow('img',img)
cv2.imshow('img_up',img_up)
cv2.imshow('img_up2',img_up2)
cv2.imshow('img_up3',img_up3)
cv2.waitKey(0)

运行结果:

VX公众号: 桔子code / juzicode.com
cv2.__version__: 4.5.3
img.shape (51, 82, 3)
img_up.shape (102, 164, 3)
img_up2.shape (204, 328, 3)
img_up3.shape (408, 656, 3)

扩展阅读:

  1. OpenCV-Python教程

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注