youcans 的 OpenCV 例程200篇185.图像金字塔之高斯金字塔
Posted 小白YouCans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了youcans 的 OpenCV 例程200篇185.图像金字塔之高斯金字塔相关的知识,希望对你有一定的参考价值。
【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],:] = pyrD3
plt.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],:] = pyrD2
plt.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],:] = pyrD1
plt.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],:] = pyrU3
plt.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],:] = pyrU2
plt.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],:] = pyrU1
plt.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],:] = pyrU0
plt.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篇】147. 图像分割之孤立点检测
【youcans 的 OpenCV 例程200篇】148. 图像分割之线检测
【youcans 的 OpenCV 例程200篇】149. 图像分割之边缘模型
【youcans 的 OpenCV 例程200篇】150. 边缘检测梯度算子
【youcans 的 OpenCV 例程200篇】151. 边缘检测中的平滑处理
【youcans 的 OpenCV 例程200篇】152. 边缘检测之 LoG 算子
【youcans 的 OpenCV 例程200篇】153. 边缘检测之 DoG 算子
【youcans 的 OpenCV 例程200篇】154. 边缘检测之 Canny 算子
【youcans 的 OpenCV 例程200篇】155. 边缘连接的局部处理方法
【youcans 的 OpenCV 例程200篇】156. 边缘连接局部处理的简化算法
【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测
【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法
【youcans 的 OpenCV 例程200篇】159. 图像分割之全局阈值处理
【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法
【youcans 的 OpenCV 例程200篇】161. OTSU 阈值处理算法的实现
【youcans 的 OpenCV 例程200篇】162. 全局阈值处理改进方法
【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】165.多阈值 OTSU 处理方法
【youcans 的 OpenCV 例程200篇】166.自适应阈值处理
【youcans 的 OpenCV 例程200篇】167.基于移动平均的可变阈值处理
【youcans 的 OpenCV 例程200篇】168.图像分割之区域生长
【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离
【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类
【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割
【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较
【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割
【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割
【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较
【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法
【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法
【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)
【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)
【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法
【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法
【youcans 的 OpenCV 例程200篇】184.鼠标交互标记的分水岭算法
【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔
以上是关于youcans 的 OpenCV 例程200篇185.图像金字塔之高斯金字塔的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 例程200篇182.基于形态学梯度的分水岭算法
youcans 的 OpenCV 例程200篇179.图像分割之 GrabCut 图割法(掩模图像)