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

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

相关推荐
泡泡茶壶_ovo2 小时前
RORPCAP: retrieval-based objects and relations prompt for image captioning
人工智能·深度学习·计算机视觉·语言模型·prompt·多模态·imagecaptioning
这张生成的图像能检测吗2 小时前
(论文速读)Logits DeConfusion-CLIP少样本学习
人工智能·计算机视觉·图像分类·clip
法迪5 小时前
【学习】Linux 内核中的 cgroup freezer 子系统
人工智能·opencv·计算机视觉
Coovally AI模型快速验证7 小时前
全景式综述|多模态目标跟踪全面解析:方法、数据、挑战与未来
人工智能·深度学习·算法·机器学习·计算机视觉·目标跟踪·无人机
这张生成的图像能检测吗8 小时前
(论文速读)RandAR:突破传统限制的随机顺序图像自回归生成模型
图像处理·人工智能·机器学习·计算机视觉·生成模型·自回归模型
Virgil13918 小时前
【TrOCR】模型预训练权重各个文件解读
人工智能·pytorch·计算机视觉·自然语言处理·ocr·transformer
我希望的一路生花18 小时前
Nik Collection 6.2全新版Nik降噪锐化调色PS/LR插件
人工智能·计算机视觉·设计模式·stable diffusion·aigc
飞翔的佩奇1 天前
【完整源码+数据集+部署教程】遥感森林砍伐检测系统源码和数据集:改进yolo11-SWC
python·yolo·计算机视觉·数据集·yolo11·遥感森林砍伐检测
星期天要睡觉1 天前
计算机视觉(opencv)实战六——图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)
人工智能·opencv·计算机视觉
Struart_R1 天前
LLaVA-3D,Video-3D LLM,VG-LLM,SPAR论文解读
人工智能·深度学习·计算机视觉·3d·大语言模型·多模态