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

简介:本文全面深入地介绍图像金字塔相关知识,涵盖图像下采样、上采样原理,详细讲解高斯金字塔(包括 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代码

相关推荐
小蒋观天下6 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
YOLO数据集集合12 小时前
Deepseek融合yolo的行人车辆多目标检测系统 |行人检测 车辆检测 多目标检测 YOLO DeepSeek9165期
人工智能·yolo·目标检测·计算机视觉·车辆检测·行人检测
兴通物联科技14 小时前
自助终端涉外证件核验选型:XT2010MRZ 嵌入式护照识别模块技术解析
单片机·嵌入式硬件·计算机视觉·硬件架构
lisw0515 小时前
图像质量评估:从误差可见度到结构相似性
人工智能·机器学习·计算机视觉
Latchh17 小时前
PDF打开不要密码却显示已加密,前端怎么判断
前端·图像处理·人工智能·计算机视觉·pdf
原子延迟17 小时前
PDF权限密码和打开密码差在哪?我拿7份文件试了
图像处理·人工智能·计算机视觉·pdf
richard_yuu17 小时前
OpenCV 实战第 7 篇:Canny 阈值自适配、findContours 层级与 approxPolyDP
人工智能·opencv·计算机视觉
YOLO数据集集合19 小时前
道路与桥梁灾后损伤检测数据集 | 道路损伤 桥梁损坏 灾后评估 无人机巡检 目标检测 YOLO格式 深度学习数据集 计算机视觉10551期
yolo·目标检测·计算机视觉·无人机·桥梁损害·灾后评估
loulanyue_1 天前
体验的Scaling时刻:读淘天首席科学家郑波2026云栖演讲
人工智能·计算机视觉·大模型·多模态
答案是你2 天前
YOLOE 开放词汇检测 + ONNX / TensorRT 推理,开源了!
python·深度学习·yolo·目标检测·计算机视觉·视觉检测