《高斯金字塔与拉普拉斯金字塔原理、操作及实用经验分享》

简介:本文全面深入地介绍图像金字塔相关知识,涵盖图像下采样、上采样原理,详细讲解高斯金字塔(包括 cv2.pyrDown 和 cv2.pyrUp 操作及示例代码)与拉普拉斯金字塔(构建及还原原理与代码演示),并分享拉普拉斯金字塔还原时确保原图尺寸为 2 的 n 次方等实用经验,搭配多幅示例图片及代码,助您透彻理解图像金字塔知识要点及应用。

如果我的文章对您有帮助,请您点赞收藏关注,我会持续创作更多与OpenCV相关的文章

高斯金字塔与拉普拉斯金字塔原理、操作及实用经验分享

什么是图像金字塔

比如有一幅图像,他是500x500的图像。删除一次其偶数行和偶数列,他会变成250 250的图像,删除两次他会变成125 125的图像。

也可以先对图像进行滤波,得到原始图像的近似图像,再去下采样。如果你不了解滤波,建议阅读我的文章:《全面解析图像平滑处理:多种滤波方法及应用实例》,这篇文章对高斯滤波有充分详尽的讲解,这里就不过多赘述。

图像可以向下采样,也可以向上采样,可以通过补0的方式扩容,可以看下图:

如果在补0以后使用高斯滤波器,会出现一种状况 ,他的灰度值会小于 255/4 因为有三个空的格子,所以要对高斯的系数*4.

分析向下采样是丢弃一些值,向上采样是补充一些值,所以这不是可逆的,一旦进行了下采样就没法回复。

高斯金字塔

下采样cv2.pyrDown

语法如下:

dst 目标图像 = cv2.pyrDown(原始图像src ,dstsize目标图像大小 , borderType边界类型,只支持cv2.BODER_DEFAULT)

图像的尺寸必须满足 |dst *2 - src|<=2

我使用的是猪猪侠的图片,命名为pig.JPG,跟代码放入同一个文件夹:

(我的项目结构如下):

这是我那个pig.JPG的图像:

python 复制代码
import numpy as np
import cv2
pig = cv2.imread("pig.JPG")
FI = cv2.pyrDown(pig)
Se = cv2.pyrDown(FI)
THI = cv2.pyrDown(Se)
cv2.imshow('original',pig)
cv2.imshow("first",FI)
cv2.imshow("Second",Se)
cv2.imshow('Third',THI)
cv2.waitKey()
cv2.destroyAllWindows()

上采样pyrUp

用法与pyrUp一致,还用这种图片,运行下面这段代码:

python 复制代码
import numpy as np
import cv2
pig = cv2.imread("pig.JPG")
pig = pig[0:100,0:100]
FI = cv2.pyrUp(pig)
Se = cv2.pyrUp(FI)
THI = cv2.pyrUp(Se)
cv2.imshow('original',pig)
cv2.imshow("first",FI)
cv2.imshow("Second",Se)
cv2.imshow('Third',THI)
cv2.waitKey()
cv2.destroyAllWindows()

查看上采样下采样的区别:

python 复制代码
import numpy as np
import cv2
pig = cv2.imread("pig.JPG",cv2.IMREAD_GRAYSCALE)
pig = pig[0:300,0:300]
FI = cv2.pyrDown(pig)
Fi = cv2.pyrUp(FI)
diff = Fi-pig
cv2.imshow("original",pig)
cv2.imshow("down",FI)
cv2.imshow("up",Fi)
cv2.imshow("different",diff)
cv2.waitKey()
cv2.destroyAllWindows()

通过下采样再上采样得到的图像与原图有区别,说明他是高斯图像金字塔不可逆的。

拉普拉斯金字塔

拉普拉斯金字塔是高斯上采样 - 高斯下采样。他的目的是为了计算两次高斯金字塔的区别,以便恢复原图

我们看下面这段代码,就一目了然:

python 复制代码
import numpy as np
import cv2
pig = cv2.imread("pig.JPG",cv2.IMREAD_GRAYSCALE)
pig = pig[0:512,0:512]
# 生成高斯金字塔
G0 = pig
G1 = cv2.pyrDown(G0)
print(G1.shape)
G2 = cv2.pyrDown(G1)
print(G2.shape)
G3 = cv2.pyrDown(G2)
print(G3.shape)
# 生成拉普拉斯金字塔
l0 = G0-cv2.pyrUp(G1)
l1 = G1-cv2.pyrUp(G2)
l2 = G2-cv2.pyrUp(G3)
# 复原 G0
RG0 = l0+cv2.pyrUp(G1)
result = RG0-G0
print(f"G0与复原的G0的区别是{abs(result)}")

我在这里对大家有一点经验要分享,当你在使用拉普拉斯金字塔试图还原的时候,一定要确保你的原图是 2的n次方,不然很容易出现奇数的时候,上采样和下采样的shape不同。建议使用cv2.resize改变shape

致谢

本文参考了一些博主的文章,博取了他们的长处,也结合了我的一些经验,对他们表达诚挚的感谢,使我对 图像金字塔 有更深入的了解,也推荐大家去阅读一下他们的文章。纸上学来终觉浅,明知此事要躬行:
图像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码

相关推荐
odoo中国17 分钟前
Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例
python·深度学习·计算机视觉·卷积神经网络
硅谷秋水33 分钟前
MAPLE:编码从自我为中心的视频中学习的灵巧机器人操作先验
人工智能·机器学习·计算机视觉·机器人·音视频
fytianlan2 小时前
OpenCV day5
opencv·计算机视觉
都是些老物件2 小时前
目标检测概述
人工智能·目标检测·计算机视觉
学步_技术5 小时前
自动驾驶系列—GLane3D: Detecting Lanes with Graph of 3D Keypoints
人工智能·机器学习·计算机视觉·3d·自动驾驶
jndingxin13 小时前
OpenCV 图形API(39)图像滤波----同时计算图像在 X 和 Y 方向上的一阶导数函数SobelXY()
人工智能·opencv·计算机视觉
HenrySmale14 小时前
信息科技伦理与道德0:课程安排
人工智能·科技·计算机视觉
yngsqq15 小时前
CAD 像素点显示图片——CAD二次开发 OpenCV实现
人工智能·opencv·计算机视觉
知来者逆16 小时前
计算机视觉——基于MediaPipe实现人体姿态估计与不良动作检测
人工智能·深度学习·计算机视觉·mediapipe·姿态估计·人体姿态
满天星耶17 小时前
机器学习数据特征处理,鸢尾花案例,数字识别案例
图像处理·人工智能·机器学习·计算机视觉·数据分析·近邻算法