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

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

相关推荐
叶子爱分享8 小时前
计算机视觉与图像处理的关系
图像处理·人工智能·计算机视觉
cver1239 小时前
野生动物检测数据集介绍-5,138张图片 野生动物保护监测 智能狩猎相机系统 生态研究与调查
人工智能·pytorch·深度学习·目标检测·计算机视觉·目标跟踪
kyle~10 小时前
目标检测在国防和政府的应用实例
人工智能·目标检测·计算机视觉
Akttt12 小时前
【T2I】R&B: REGION AND BOUNDARY AWARE ZERO-SHOT GROUNDED TEXT-TO-IMAGE GENERATION
人工智能·深度学习·计算机视觉·text2img
jndingxin12 小时前
OpenCV CUDA模块设备层-----反向二值化阈值处理函数thresh_binary_inv_func()
人工智能·opencv·计算机视觉
jndingxin14 小时前
OpenCV CUDA模块设备层-----在 GPU 上执行类似于 std::copy 的操作函数warpCopy()
人工智能·opencv·计算机视觉
jndingxin14 小时前
OpenCV CUDA模块设备层-----在GPU 上高效地执行两个 uint 类型值的最大值比较函数vmax2()
人工智能·opencv·计算机视觉
顾道长生'16 小时前
(Arxiv-2024)自回归模型优于扩散:Llama用于可扩展的图像生成
计算机视觉·数据挖掘·llama·自回归模型·多模态生成与理解
千宇宙航16 小时前
闲庭信步使用SV搭建图像测试平台:第二十七课——图像的腐蚀
图像处理·计算机视觉·fpga开发
CoovallyAIHub17 小时前
YOLOv13都来了,目标检测还卷得动吗?别急,还有这些新方向!
深度学习·算法·计算机视觉