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

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

相关推荐
lixzest1 天前
目标检测算法应用工程师 面试高频题 + 标准答案
python·yolo·目标检测·计算机视觉
机 _ 长1 天前
YOLO26 蒸馏改进全攻略:从理论到实战 (Response + Feature + Relation)
人工智能·深度学习·yolo·目标检测·计算机视觉
棒棒的皮皮1 天前
【OpenCV】Python图像处理矩特征之矩的计算/计算轮廓的面积
图像处理·python·opencv·计算机视觉
迈火1 天前
Facerestore CF (Code Former):ComfyUI人脸修复的卓越解决方案
人工智能·gpt·计算机视觉·stable diffusion·aigc·语音识别·midjourney
qwy7152292581631 天前
7-获取局部图像
人工智能·opencv·计算机视觉
Pyeako1 天前
opencv计算机视觉--Harris角点检测&SIFT特征提取&图片抠图
人工智能·python·opencv·计算机视觉·harris角点检测·sift特征提取·图片抠图
roman_日积跬步-终至千里1 天前
【计算机视觉-作业1】图像分类:两层神经网络进一步提高分类精度
神经网络·计算机视觉·分类
子夜江寒1 天前
OpenCV 学习:从光流跟踪到艺术风格迁移
opencv·学习·计算机视觉
sali-tec1 天前
C# 基于OpenCv的视觉工作流-章18-图像缩放
图像处理·人工智能·opencv·算法·计算机视觉
qwy7152292581631 天前
6-图像的加密与解密
人工智能·opencv·计算机视觉