youcans 的 OpenCV 例程200篇185.图像金字塔之高斯金字塔

Posted 小白YouCans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了youcans 的 OpenCV 例程200篇185.图像金字塔之高斯金字塔相关的知识,希望对你有一定的参考价值。

OpenCV 例程200篇 总目录-202205更新


【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔


6. 图像金字塔

图像金字塔是一种以多分辨率来解释图像的结构,常用于图像分割、图像压缩和机器视觉。

图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通常,上层图像的宽度和高度是相邻的下层图像的 1/2。

通过对原始图像进行多尺度像素采样,生成多个不同分辨率的图像。把高分辨率的原始图像放在底部,越往上的图像越小越模糊,最小的图像放在顶部,称为图像金字塔。

向下采样,分辨率逐级降低;向上采样,分辨率逐级升高。上采样和下采样是不可逆的,将下采样的图像还原回原来尺寸时会丢失高频信息,使图片变模糊。

OpenCV 为向下采样和向上采样提供了两个函数:cv2.pyrDowncv2.pyrUp


6.1 高斯金字塔(Gaussian pyramid)

高斯金字塔(Gaussian pyramid)用于向下降采样,分辨率逐级降低。

高斯金字塔通过高斯平滑和降采样获得一系列下采样图像。首先将原图像作为最底层的图像 G0(第0层),利用高斯核(5*5)进行卷积操作,然后对卷积图像进行下采样(去除偶数行和列)得到上一层的图像 G1;重复卷积和下采样操作得到上一层图像,反复迭代,形成一个金字塔形的图像数据结构。

高斯金字塔通过上采样操作可以放大图像:先将图像的高度和宽度加倍扩充,新增的行和列以 0 填充;再用相同的卷积核(乘以 4)对扩充图像进行卷积操作,就得到放大的近似图像。上采样和下采样是不可逆的,缩放过程中存在信息丢失,因此上采样还原的图像比原始图像模糊。

OpenCV 为向下采样和向上采样提供了两个函数:cv2.pyrDowncv2.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篇结束语

youcans的OpenCV例程200篇总目录

youcans 的 OpenCV 例程200篇179.图像分割之 GrabCut 图割法(掩模图像)

youcans 的 OpenCV 例程200篇201. 图像的颜色空间转换

OpenCV 例程200篇 目录-202205更新