python 高斯金字塔_Python OpenCV 之图像金字塔,高斯金字塔与拉普拉斯金字塔

article/2025/8/15 18:23:43

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。

基础知识铺垫

学习图像金字塔,发现网上的资料比较多,检索起来比较轻松。

图像金字塔是一张图像多尺度的表达,或者可以理解成一张图像不同分辨率展示。

金字塔越底层的图片,像素越高,越向上,像素逐步降低,分辨率逐步降低。

高斯金字塔

我们依旧不对概念做过多解释,第一遍学习应用,应用,毕竟 365 天的周期,时间长,后面补充理论知识。

高斯金字塔用于向下采样,同时它也是最基本的图像塔。

在互联网检索原理,得到最简单的说明如下:

将图像的最底层(高斯金字塔的第 0 层),例如高斯核(5x5)对其进行卷积操作,这里的卷积主要处理掉的是偶数行与列,然后得到金字塔上一层图像(即高斯金字塔第 1 层),在针对该图像重复卷积操作,得到第 2 层,反复执行下去,即可得到高斯金字塔。

每次操作之后,都会将 M×N 图像变成 M/2 × N/2 图像,即减少一半。

还有实测中发现,需要用图像的宽和高一致的图片,并且宽高要是 2 的次幂数,例如,8 像素,16 像素,32 像素等等,一会你也可以实际测试一下。

图像金字塔应用到的函数有 cv2.pyrDown() 和 cv2.pyrUp()。

cv2.pyrDown 与 cv2.pyrUp 函数原型

通过 help 函数得到函数原型如下:

pyrDown(src[, dst[, dstsize[, borderType]]]) -> dst

pyrUp(src[, dst[, dstsize[, borderType]]]) -> dst

两个函数原型参数一致,参数说明如下:

src:输入图像;

dst: 输出图像;

dstsize: 输出图像尺寸,默认值按照 ((src.cols+1)/2, (src.rows+1)/2) 计算。

关于两个函数的补充说明:

cv2.pyrDown 从一个相对高分辨率的大尺寸的图像上构建一个金字塔,运行之后的结果是,图像变小,分辨率降低(下采样);

cv2.pyrUp 是一个上采样的过程,尽管相对尺寸变大,但是分辨率不会增加,图像会变得更模糊。

测试代码如下:

import cv2 as cv

src = cv.imread("./testimg.jpeg")

print(src.shape[:2])

cv.imshow("src", src)

# 向下采样

dst = cv.pyrDown(src)

print(dst.shape[:2])

cv.imshow("dst", dst)

# 再次向下采样

dst1 = cv.pyrDown(dst)

print(dst1.shape[:2])

cv.imshow("dst1", dst1)

cv.waitKey()

运行代码之后,得到三张图片,大小依次减小,分辨率降低。

50b9cd369b38de97fdb66d8c49a75dc2.png

通过上面运行得到的最小图,在执行向上采样之后,图片会变的模糊,这也说明上采样和下采样是非线性处理,它们是不可逆的有损处理,因此下采样后的图像是无法还原的,即使放大图片也会变模糊(后面学习到拉普拉斯金字塔可以解决该问题)。

# 向上采样

dst2 = cv.pyrUp(dst1)

print(dst2.shape[:2])

cv.imshow("dst2", dst2)

e3965e70b3ab19e3f3bff6d8c7576b18.png

在总结一下上采样和下采样的步骤:

上采样:使用 cv2.pyrUp 函数, 先将图像在每个方向放大为原来的两倍,新增的行和列用 0 填充,再使用先前同样的内核与放大后的图像卷积,获得新增像素的近似值;

下采样:使用 cv2.pyrDown 函数,先对图像进行高斯内核卷积 ,再将所有偶数行和列去除。

拉普拉斯金字塔(Laplacian Pyramid, LP)

拉普拉斯金字塔主要用于重建图像,由上文我们已经知道在使用高斯金字塔的的时候,上采样和下采样会导致图像细节丢失。

拉普拉斯就是为了在放大图像的时候,可以预测残差,何为残差,即小图像放大的时候,需要插入一些像素值,在上文直接插入的是 0,拉普拉斯金字塔算法可以根据周围像素进行预测,从而实现对图像最大程度的还原。

学习到原理如下:用高斯金字塔的每一层图像,减去其上一层图像上采样并高斯卷积之后的预测图像,得到一系列的差值图像即为 LP 分解图像(其中 LP 即为拉普拉斯金字塔图像)。

关于拉普拉斯还存在一个公式(这是本系列课程第一次书写公式),其中 L 为拉普拉斯金字塔图像,G 为高斯金字塔图像

L n = G n − P y r U p ( P y r D o w n ( G n ) ) L_n = G_n-PyrUp(PyrDown(G_n))Ln​=Gn​−PyrUp(PyrDown(Gn​))

使用下面的代码进行测试。

import cv2 as cv

src = cv.imread("./testimg.jpeg")

print(src.shape[:2])

cv.imshow("src", src)

# 向下采样一次

dst = cv.pyrDown(src)

print(dst.shape[:2])

cv.imshow("dst", dst)

# 向上采样一次

dst1 = cv.pyrUp(dst)

print(dst1.shape[:2])

cv.imshow("dst1", dst1)

# 计算拉普拉斯金字塔图像

# 原图 - 向上采样一次的图

laplace = cv.subtract(src, dst1)

cv.imshow("laplace", laplace)

cv.waitKey()

运行结果如下,相关的图像已经呈现出来,重点注意最右侧的图片。

0c46c33d5dcc49d1184cbebf3a0300f4.png

这个地方需要注意下,如果你使用 cv.subtract(src, dst1) 函数,得到的是上图效果,但是在使用还原的时候会发现问题,建议直接使用 -完成,匹配公式,修改代码如下:

# cv.subtract(src, dst1)

laplace = src - dst1

代码运行效果如下。

58c56ceec1995ce06d3389132549aa67.png

学习过程中发现这样一段话:图像尺寸最好是 2 的整次幂,如 256,512 等,否则在金字塔向上的过程中图像的尺寸会不等,这会导致在拉普拉斯金字塔处理时由于不同尺寸矩阵相减而出错。

这个我在实测的时候发现确实如此,例如案例中使用的图像,在向下采样 2 次的时候,图像的尺寸就会发生变化,测试代码如下:

import cv2 as cv

src = cv.imread("./testimg.jpeg")

print(src.shape[:2])

cv.imshow("src", src)

# 向下采样1次

dst1 = cv.pyrDown(src)

print(dst1.shape[:2])

cv.imshow("dst", dst1)

# 向下采样2次

dst2 = cv.pyrDown(dst1)

print(dst1.shape[:2])

cv.imshow("dst2", dst2)

# 向上采样1次

up_dst1 = cv.pyrUp(dst2)

print(up_dst1.shape[:2])

cv.imshow("up_dst1", up_dst1)

# 计算拉普拉斯金字塔图像

# 采样1次 - 向上采样1次的图

laplace = dst1 - up_dst1

cv.imshow("laplace", laplace)

cv.waitKey()

注意 print(up_dst1.shape[:2]) 部分的输出如下:

(710, 400)

(355, 200)

(355, 200)

(356, 200)

如果在该基础上使用拉普拉斯图像金字塔,就会出现如下错误

Sizes of input arguments do not match

在总结一下拉普拉斯图像金字塔的执行过程:

向下采样:用高斯金字塔的第 i 层减去 i+1 层做上采样的图像,得到拉普拉斯第 i 层的图像;

向上采样:用高斯金字塔的 i+1 层向上采样加上拉普拉斯的第 i 层,得到第 i 层的原始图像。

向下采样上面的代码已经实现了,但是拉普拉斯向上采样还未实现,完善一下代码如下,为了代码清晰,我们将变量命名进行修改。

import cv2 as cv

src = cv.imread("./testimg_rect.jpeg")

print(src.shape[:2])

cv.imshow("src", src)

# 高斯金字塔第 0 层

gus0 = src # 原图

# 高斯金字塔第 1 层

gus1 = cv.pyrDown(gus0)

# 高斯第 2 层

gus2 = cv.pyrDown(gus1)

# 拉普拉斯金字塔第 0 层

lap0 = gus0 - cv.pyrUp(gus1)

# 拉普拉斯金字塔第 1 层

lap1 = gus1 - cv.pyrUp(gus2)

# 显示拉普拉斯第一层代码

cv.imshow("laplace", lap1)

cv.waitKey()

下面用修改好的代码完成还原图片的操作。

import cv2 as cv

src = cv.imread("./testimg_rect.jpeg")

print(src.shape[:2])

cv.imshow("src", src)

# 高斯金字塔第 0 层

gus0 = src # 原图

# 高斯金字塔第 1 层

gus1 = cv.pyrDown(gus0)

# 高斯第 2 层

gus2 = cv.pyrDown(gus1)

# 拉普拉斯金字塔第 0 层

lap0 = gus0 - cv.pyrUp(gus1)

# 拉普拉斯金字塔第 1 层

lap1 = gus1 - cv.pyrUp(gus2)

rep = lap0 + cv.pyrUp(lap1 + cv.pyrUp(gus2))

gus_rep = cv.pyrUp(cv.pyrUp(gus2))

cv.imshow("rep", rep)

cv.imshow("gus_rep", gus_rep)

cv.waitKey()

以上代码最重要的部分为下面两句:

rep = lap0 + cv.pyrUp(lap1 + cv.pyrUp(gus2))

gus_rep = cv.pyrUp(cv.pyrUp(gus2))

第一行代码中 lap1 + cv.pyrUp(gus2) 即文字公式 【用高斯金字塔的 i+1 层向上采样加上拉普拉斯的第 i 层,得到第 i 层的原始图像】的翻译。

第二行代码是使用直接向上采样,最终得到的是损失细节的图像。

上述代码运行的结果如下,通过拉普拉斯可以完美还原图像。

学习本案例之后,你可以在复盘本文开始部分的代码,将其进行修改。

eeb441c8e2ca4953cdf6ca5c5aaafa30.png

最后在学习一种技巧,可以直接将两幅图片呈现,代码如下:

import cv2 as cv

import numpy as np

src = cv.imread("./testimg_rect.jpeg")

print(src.shape[:2])

cv.imshow("src", src)

# 向下采样1次

down_dst1 = cv.pyrDown(src)

print(down_dst1.shape[:2])

cv.imshow("dst", down_dst1)

# 向上采样1次

up_dst1 = cv.pyrUp(down_dst1)

print(up_dst1.shape[:2])

cv.imshow("up_dst1", up_dst1)

res = np.hstack((up_dst1, src))

cv.imshow('res', res)

cv.waitKey()

运行之后,通过 np.hstack((up_dst1, src))函数,将两个图像矩阵合并,实现效果如下:

c850823786feec697975883825bcb35f.png

橡皮擦的小节

希望今天的 1 个小时,你有所收获,我们下篇博客见~

相关阅读

技术专栏

逗趣程序员

今天是持续写作的第 71 / 100 天。

如果你有想要交流的想法、技术,欢迎在评论区留言。

如果你想跟博主建立亲密关系,可以关注博主,或者关注博主公众号 “非本科程序员”,了解一个非本科程序员是如何成长的。

博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏

本文同步分享在 博客“梦想橡皮擦”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。


http://chatgpt.dhexx.cn/article/1JtqUmaa.shtml

相关文章

图像金字塔和高斯金字塔

一:图像金字塔 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔实际上是一张图片在不同尺度下的集合,即原图的上采样和下采样集合。金字塔的底部是高分辨…

opencv学习-高斯金字塔和拉普拉斯金字塔

图像金字塔 一个图像金字塔是由一系列的图像组成,最底下一张是图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看就像一个古代的金字塔。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的…

高斯金字塔与拉普拉斯金字塔的原理与python构建

转载自:https://zhuanlan.zhihu.com/p/94014493 高斯金字塔和拉普拉斯金字塔【1】在图像相关领域应用广泛,尤其是图像融合和图像分割方面。本文从理论和opencv实现两个方面对两种金字塔进行了介绍,并给出了二者的视觉效果。 1、高斯金字塔 在计算机视觉…

图像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码

图像金字塔是对图像进行多分辨率表示的一种有效且简单的结构。 一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像。图像金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率表示。 图像金字塔有什么作用? 图像金字塔常用于图像缩放…

高斯金字塔

1、为什么要构建高斯金字塔 高斯金字塔模仿的是图像的不同的尺度,尺度应该怎样理解?对于一副图像,你近距离观察图像,与你在一米之外观察,看到的图像效果是不同的,前者比较清晰,后者比较模糊&am…

系统集成项目管理工程师知识点

信息化知识 在这个学时里,将学习有关信息化的许多知识点,这些知识点的试题大多出现在上午试 题中。这引起知识点主要是: (1)信息与信息化的定义。 (2)国家信息化发展战略(2006-2020&…

快速了解Scala技术栈

http://www.infoq.com/cn/articles/scala-technology/ 我无可救药地成为了Scala的超级粉丝。在我使用Scala开发项目以及编写框架后,它就仿佛凝聚成为一个巨大的黑洞,吸引力使我不得不飞向它,以至于开始背离Java。固然Java 8为Java阵营增添了一…

一篇博客带你掌握pytorch基础,学以致用(包括张量创建,索引,切片,计算,Variable对象的创建,和梯度求解,再到激活函数的使用,神经网络的搭建、训练、优化、测试)

一篇博客带你掌握pytorch基础,学以致用 1.将numpy的 ndarray对象转换为pytorch的张量 在 Pytroch 中,Tensor 是一种包含单一数据类型元素的多维矩阵,译作张量。熟悉 numpy 的同学对这个定义应该感到很熟悉,就像ndarray一样&…

AI题目整理

文章目录 1、网络配置时batchsize的大小怎样设置?过小和过大分别有什么特点?2、设置学习率衰减的原因?3、有哪些分类算法?4、分类和回归的区别?5、请描述一下K-means聚类的过程?6、训练集、测试集、验证集的作用?7、请讲解一下k折交叉验证?8、分类和聚类的区别?9、讲述…

【深度学习】对迁移学习中域适应的理解和3种技术的介绍

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达 1 『如何理解域适应』 域适应是计算机视觉的一个领域,我们的目标是在源数据集上训练一个神经网络,并确保在显著不同于源数据集的目标数据集上也有…

协议模糊的堆叠式Seq2seq注意模型

摘要--通过生成大量异常数据作为程序的输入,模糊测试是发现软件漏洞的有效方法。很难自动模糊协议,因为必须手动构造一个满足协议规范的模板以生成测试用例。在本文中,我们建立了堆叠的seq2seq注意模型来自动生成协议测试用例。Seq2seq-atten…

【推荐收藏】3.5万字图解Pandas

文章目录 第一部分:Pandas 展示技术提升1. 排序2.按多列排序3. 添加一列4. 快速元素搜索5. 按列连接(join)6.按列分组7. 数据透视表8、Pandas速度 第二部分. Series 和 Index索引(Index)按值查找元素缺失值比较追加、插入、删除统计数据重复数…

层次分析法原理及应用案例

层次分析法是指将一个复杂的多目标决策问题作为一个系统,将目标分解为多个目标或准则,进而分解为多指标(或准则、约束)的若干层次,通过定性指标模糊量化方法算出层次单排序(权数)和总排序&#…

论文研读-AI4VIS-可视化推荐-VizML: 一种基于机器学习的可视化推荐方法

VizML: 一种基于机器学习的可视化推荐方法 1 论文概述1.1 摘要1.2 引言 2 问题陈述3 相关工作3.1 基于规则的可视化推荐系统3.2 基于机器学习的可视化推荐系统 4 数据4.1 Plotly介绍4.2 数据描述和分析,收集和清理4.2 数据特征提取4.3 设计选择提取 5 方法5.1 特征处…

《python数据分析与挖掘实战》笔记第3章

文章目录 第3章:数据探索3.1、数据质量分析3.2、数据特征分析3.2.1、分布分析3.2.2、对比分析3.2.3、统计量分析1.集中趋势度量2.离中趋势度量 3.2.4、周期性分析3.2.5、贡献度分析3.2.6、相关性分析1. 直接绘制散点图2. 绘制散点图矩阵3. 计算相关系数 3.3、python…

对迁移学习中域适应的理解和3种技术的介绍

域适应是计算机视觉的一个领域,我们的目标是在源数据集上训练一个神经网络,并确保在显著不同于源数据集的目标数据集上也有良好的准确性。为了更好地理解域适应和它的应用,让我们先看看它的一些用例。 我们有很多不同用途的标准数据集&#…

基于1305变频器的几种变参数运行测试

该文主要用于学习归纳,因此会省略正规操作中很多步骤,详述原理。欢迎指正。 一. 设备参数 1305变频器一台(380-460V/9A/4.0KW/5HP);三相异步交流电动机(1.5(2HP)/3.65A/380V/50Hz/1420rpm/4),直流发电机组;计算机&am…

2022秋 | PTA编程训练(一)

目录 1.素数对猜想 2.数组元素循环右移问题 3.水仙花数 4.找出不是两个数组共有的元素 5.找鞍点 6.验证“哥德巴赫猜想” 7.黑洞数 8.装箱问题 9.IP地址转换 10.龟兔赛跑 1.素数对猜想 题目详情: 让我们定义dn​为:dn​pn1​−pn​&#xff0…

测试用例设计之正交表法详解

正交实验法的由来 拉丁方名称的由来 古希腊是一个多民族的国家,国王在检阅臣民时要求每个方队中每行有一个民族代表,每列也要有一个民族的代表。 数学家在设计方阵时,以每一个拉丁字母表示一个民族,所以设计的方阵称为拉丁方。 什么是n阶拉丁方? 用n个不同的拉丁字母排成一…

2018年华为数通技术大赛复赛拓扑题

正在准备华为杯的竞赛,期间的训练需要用心练习,希望我的这篇文章能对跟我一样的小伙伴们起到作用。在比赛之前,我们的目的都不是配通这个网络,而是在一次次错误中总结经验,你会受益匪浅!不多说,…