OpenCV 例程200篇 总目录-202205更新
【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔
6. 图像金字塔
图像金字塔是一种以多分辨率来解释图像的结构,常用于图像分割、图像压缩和机器视觉。
图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通常,上层图像的宽度和高度是相邻的下层图像的 1/2。
通过对原始图像进行多尺度像素采样,生成多个不同分辨率的图像。把高分辨率的原始图像放在底部,越往上的图像越小越模糊,最小的图像放在顶部,称为图像金字塔。
向下采样,分辨率逐级降低;向上采样,分辨率逐级升高。上采样和下采样是不可逆的,将下采样的图像还原回原来尺寸时会丢失高频信息,使图片变模糊。
OpenCV 为向下采样和向上采样提供了两个函数:cv2.pyrDown 和 cv2.pyrUp。
6.1 高斯金字塔(Gaussian pyramid)
高斯金字塔(Gaussian pyramid)用于向下降采样,分辨率逐级降低。
高斯金字塔通过高斯平滑和降采样获得一系列下采样图像。首先将原图像作为最底层的图像 G0(第0层),利用高斯核(5*5)进行卷积操作,然后对卷积图像进行下采样(去除偶数行和列)得到上一层的图像 G1;重复卷积和下采样操作得到上一层图像,反复迭代,形成一个金字塔形的图像数据结构。
高斯金字塔通过上采样操作可以放大图像:先将图像的高度和宽度加倍扩充,新增的行和列以 0 填充;再用相同的卷积核(乘以 4)对扩充图像进行卷积操作,就得到放大的近似图像。上采样和下采样是不可逆的,缩放过程中存在信息丢失,因此上采样还原的图像比原始图像模糊。
OpenCV 为向下采样和向上采样提供了两个函数:cv2.pyrDown 和 cv2.pyrUp。
函数说明:
cv2.pyrDown(src[, dst[, dstsize[, borderType]]]) → dst # 向下采样
cv2.pyrUp(src[, dst[, dstsize[, borderType]]]) → dst # 向下采样
函数 cv2.pyrDown 是从高分辨率的大尺寸图像逐次向下采样得到一系列图像,构建成为高斯金字塔,是一个重复高斯平滑并重新对图像采样的过程。
函数 cv2.pyrUp 对图像进行上采样和模糊。 它也可以用于拉普拉斯金字塔操作
参数说明:
- src:输入图像
- dst:输出图像,大小和类型与 src 相同
- dstsize:输出图像的尺寸,默认为输入图像尺寸的 1/2
- borderType:边界扩充的类型
注意事项:
- 高斯平滑的卷积核为 5*5
例程:1.85 高斯图像金字塔
# # 1.85:高斯图像金字塔 (Gaussian pyramid)img = cv2.imread("../images/imgLena.tif", flags=1)# 图像向下取样pyrD0 = img.copy()pyrD1 = cv2.pyrDown(pyrD0)pyrD2 = cv2.pyrDown(pyrD1)pyrD3 = cv2.pyrDown(pyrD2)# 图像向上取样pyrU3 = pyrD3.copy()pyrU2 = cv2.pyrUp(pyrU3)pyrU1 = cv2.pyrUp(pyrU2)pyrU0 = cv2.pyrUp(pyrU1)plt.figure(figsize=(10, 6))plt.subplot(244), plt.axis('off'), plt.title("->"+str(pyrD3.shape[:2]))down3 = np.zeros_like(img, dtype=np.uint8)down3[:pyrD3.shape[0],:pyrD3.shape[1],:] = pyrD3plt.imshow(cv2.cvtColor(down3, cv2.COLOR_BGR2RGB))plt.subplot(243), plt.axis('off'), plt.title("->"+str(pyrD2.shape[:2]))down2 = np.zeros_like(img, dtype=np.uint8)down2[:pyrD2.shape[0],:pyrD2.shape[1],:] = pyrD2plt.imshow(cv2.cvtColor(down2, cv2.COLOR_BGR2RGB))plt.subplot(242), plt.axis('off'), plt.title("->"+str(pyrD1.shape[:2]))down1 = np.zeros_like(img, dtype=np.uint8)down1[:pyrD1.shape[0],:pyrD1.shape[1],:] = pyrD1plt.imshow(cv2.cvtColor(down1, cv2.COLOR_BGR2RGB))plt.subplot(241), plt.axis('off'), plt.title(str(pyrD0.shape[:2]))plt.imshow(cv2.cvtColor(pyrD0, cv2.COLOR_BGR2RGB))plt.subplot(248), plt.axis('off'), plt.title("<-"+str(pyrU3.shape[:2]))up3 = np.zeros_like(img, dtype=np.uint8)up3[:pyrU3.shape[0],:pyrU3.shape[1],:] = pyrU3plt.imshow(cv2.cvtColor(up3, cv2.COLOR_BGR2RGB))plt.subplot(247), plt.axis('off'), plt.title("<-"+str(pyrU2.shape[:2]))up2 = np.zeros_like(img, dtype=np.uint8)up2[:pyrU2.shape[0],:pyrU2.shape[1],:] = pyrU2plt.imshow(cv2.cvtColor(up2, cv2.COLOR_BGR2RGB))plt.subplot(246), plt.axis('off'), plt.title("<-"+str(pyrU1.shape[:2]))up1 = np.zeros_like(img, dtype=np.uint8)up1[:pyrU1.shape[0],:pyrU1.shape[1],:] = pyrU1plt.imshow(cv2.cvtColor(up1, cv2.COLOR_BGR2RGB))plt.subplot(245), plt.axis('off'), plt.title(str(pyrU0.shape[:2]))up0 = np.zeros_like(img, dtype=np.uint8)up0[:pyrU0.shape[0],:pyrU0.shape[1],:] = pyrU0plt.imshow(cv2.cvtColor(up0, cv2.COLOR_BGR2RGB))plt.tight_layout()plt.show()
(本节完)
版权声明:
OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124834527)
Copyright 2022 youcans, XUPT
Crated:2022-5-18
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔
【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔
【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像
【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合
【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合
【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合
【youcans 的 OpenCV 例程200篇】191.基于图像分割的金字塔图像融合
【youcans 的 OpenCV 例程200篇】192.Gabor 滤波器组的形状
【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】