本文分享自华为云社区《[Python图画处理] 二十一.图画金字塔之图画向下取样和向上取样》,作者:eastmount。

一.图画金字塔

前面讲解的图画采样处理能够下降图画的巨细,本末节将补充图画金字塔知识,了解专门用于图画向上采样和向下采样的pyrUp()和pyrDown()函数。

图画金字塔是指由一组图画且不同分别率的子图调集,它是图画多标准表达的一种,以多分辨率来解释图画的结构,主要用于图画的分割或紧缩。一幅图画的金字塔是一系列以金字塔形状摆放的分辨率逐渐下降,且来源于同一张原始图的图画调集。如图6-11所示,它包括了四层图画,将这一层一层的图画比方成金字塔。图画金字塔能够通过梯次向下采样获得,直到达到某个停止条件才停止采样,在向下采样中,层级越高,则图画越小,分辨率越低。

生成图画金字塔主要包括两种办法——向下取样、向上取样。在图6-11中,将图画G0转换为G1、G2、G3,图画分辨率不断下降的进程称为向下取样;将G3转换为G2、G1、G0,图画分辨率不断增大的进程称为向上取样。

二.图画向下取样

在图画向下取样中,运用最多的是高斯金字塔。它将对图画Gi进行高斯核卷积,并删去原图中所有的偶数行和列,终究缩小图画。其间,高斯核卷积运算就是对整幅图画进行加权均匀的进程,每一个像素点的值,都由其本身和邻域内的其他像素值(权重不同)通过加权均匀后得到。常见的3×3和5×5高斯核如下:

高斯核卷积让接近中心的像素点具有更高的重要度,对周围像素核算加权均匀值,如图6-12所示,其间心方位权重最高为0.4。

显而易见,原始图画Gi具有M×N个像素,进行向下取样之后,所得到的图画Gi+1具有M/2×N/2个像素,只要原图的四分之一。通过对输入的原始图画不停迭代以上步骤就会得到整个金字塔。留意,因为每次向下取样会删去偶数行和列,所以它会不停地丢掉图画的信息。

OpenCV中,向下取样运用的函数为pyrDown(),其原型如下所示:

dst = pyrDown(src[, dst[, dstsize[, borderType]]])

  • src表明输入图画,
  • dst表明输出图画,和输入图画具有相同的尺度和类型
  • dstsize表明输出图画的巨细,默认值为Size()
  • borderType表明像素外推办法,详见cv::bordertypes

完成代码如下所示:

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#读取原始图画
img = cv2.imread('nv.png')
#图画向下取样
r = cv2.pyrDown(img)
#显现图画
cv2.imshow('original', img)
cv2.imshow('PyrDown', r)
cv2.waitKey()
cv2.destroyAllWindows()

输出成果如图6-13所示,它将原始图画紧缩成原图的四分之一。

屡次向下取样的代码如下:

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#读取原始图画
img = cv2.imread('nv.png')
#图画向下取样
r1 = cv2.pyrDown(img)
r2 = cv2.pyrDown(r1)
r3 = cv2.pyrDown(r2)
#显现图画
cv2.imshow('original', img)
cv2.imshow('PyrDown1', r1)
cv2.imshow('PyrDown2', r2)
cv2.imshow('PyrDown3', r3)
cv2.waitKey()
cv2.destroyAllWindows()

输出成果如图所示:

三.图画向上取样

在图画向上取样是由小图画不断放图画的进程。它将图画在每个方向上扩大为原图画的2倍,新增的行和列均用0来填充,并运用与“向下取样”相同的卷积核乘以4,再与扩大后的图画进行卷积运算,以获得“新增像素”的新值。如图6-15所示,它在原始像素45、123、89、149之间各新增了一行和一列值为0的像素。

在OpenCV中,向上取样运用的函数为pyrUp(),其原型如下所示:

dst = pyrUp(src[, dst[, dstsize[, borderType]]])

  • src表明输入图画,
  • dst表明输出图画,和输入图画具有相同的尺度和类型
  • dstsize表明输出图画的巨细,默认值为Size()
  • borderType表明像素外推办法,详见cv::bordertypes

完成代码如下所示:

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#读取原始图画
img = cv2.imread('lena.png')
#图画向上取样
r = cv2.pyrUp(img)
#显现图画
cv2.imshow('original', img)
cv2.imshow('PyrUp', r)
cv2.waitKey()
cv2.destroyAllWindows()

输出成果如图6-16所示,它将原始图画扩大为原图画的四倍。

屡次向上取样的代码如下:

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#读取原始图画
img = cv2.imread('lena2.png')
#图画向上取样
r1 = cv2.pyrUp(img)
r2 = cv2.pyrUp(r1)
r3 = cv2.pyrUp(r2)
#显现图画
cv2.imshow('original', img)
cv2.imshow('PyrUp1', r1)
cv2.imshow('PyrUp2', r2)
cv2.imshow('PyrUp3', r3)
cv2.waitKey()
cv2.destroyAllWindows()

输出成果如图6-17所示,每次向上取样均为上次图画的四倍,但图画的清晰度会下降。

参考文献:

  • eastmount – [数字图画处理] 三.MFC完成图画灰度、采样和量化功用详解
  • 《数字图画处理》(第3版),冈萨雷斯著,阮秋琦译,电子工业出版社,2013年.
  • 《数字图画处理学》(第3版),阮秋琦,电子工业出版社,2008年,北京.
  • 《OpenCV3编程入门》,毛星云,冷雪飞,电子工业出版社,2015,北京.

点击重视,第一时间了解华为云新鲜技术~