python --opencv图像处理金字塔(高斯金字塔、拉普拉斯金字塔)

article/2025/8/15 17:14:46

引言

前面的文章中,我们有用过图像方法或者缩小的函数 resize() ,这个函数既可以放大图像,也可以缩小图像,其中:

  • 缩小图像:一版使用 CV_INETR_AREA (区域插值)来插值。
  • 放大图像,一般使用 CV_INTER_LINEAR (线性插值)来插值。

图像缩放除了可以使用函数 resize() ,还有另外的一种方式 —— 「图像金字塔」。

在这里插入图片描述

图像金字塔是什么?

在说清楚什么事图像金字塔之前,要先介绍另一个概念:「尺度」。

尺度:先从字面意思来看说的就是尺寸和分辨率。

我们在进行图像处理的时候,会经常对源图像的尺寸进行放大或者缩小的变换,进而转换为我们需要的尺寸的目标图像。

对图像进行放大和缩小的变换的这个过程,称为尺度调整。

而图像金字塔则是图像多尺度调整表达的一种重要的方式。

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。

在这里插入图片描述
图像金字塔方法的总体思想主要是是:将参加融合的的每幅图像分解为多尺度的金字塔图像序列,将低分辨率的图像在上层,高分辨率的图像在下层,上层图像的大小为前一层图像大小的 1/4 。层数为 0 , 1 , 2 …… N 。将所有图像的金字塔在相应层上以一定的规则融合,就可得到合成金字塔,再将该合成金字塔按照金字塔生成的逆过程进行重构,得到融合金字塔。

通常而言,我们一般讨论两种图像金字塔:「高斯金字塔( Gaussian pyramid )」 和 「拉普拉斯金字塔( Laplacian pyramid )」 。

高斯金字塔( Gaussian pyramid )

高斯金字塔是由底部的最大分辨率图像逐次向下采样得到的一系列图像。最下面的图像分辨率最高,越往上图像分辨率越低。

在这里插入图片描述

高斯金字塔向下采样:

这个过程实际上就是一个重复高斯平滑并重新对图像采样的过程。

在这里插入图片描述

高斯金字塔向上采样:

1.将图像在每个方向扩大为原来的两倍,新增的行和列以 0 填充。
2.使用高斯核(5 * 5)对得到的图像进行一次高斯平滑处理,获得 「新增像素」的近似值。

注意:此过程与向下采样的过程一样,属于非线性处理,无法逆转,属于有损处理。

此过程得到的图像为放大后的图像,与原图相比会比较模糊,因为在缩放的过程中丢失了一些图像信息,如果想在缩小和放大整个过程中减少信息的丢失。

如果在缩放过程中想要减少图像信息的丢失,这就引出了第二个图像金字塔 —— 「拉普拉斯金字塔」 。

拉普拉斯金字塔( Laplacian pyramid )

拉普拉斯金字塔可以认为是残差金字塔,用来存储下采样后图片与原始图片的差异。

上面我们介绍了基于高斯金字塔,一个原始图像 Gi ,先进行向下采样得到 G(i-1) ,再对 G(i-1) 进行向上采样得到 Up(Down(Gi)) ,最终得到的 Up(Down(Gi)) 与原始的 Gi 是存在差异的。

这是因为向下采样丢失的信息并不能由向上采样来进行恢复,高斯金字塔是一种有损的采样方式。

如果我们想要完全恢复原始图像,那么我们在进行采样的时候就需要保留差异信息。

这就是拉普拉斯金字塔的核心思想,每次向下采样后,将再次向上采样,得到向上采样的 Up(Down(Gi)) 后,记录 Up(Down(Gi))Gi 的差异信息。

在这里插入图片描述

代码示例

OpenCV 为向上采样和向下采样提供了两个函数:pyrDown()pyrUp()

pyrDown() 的原函数如下:

def pyrDown(src, dst=None, dstsize=None, borderType=None)
  • src: 表示输入图像。
  • dst: 表示输出图像,它与src类型、大小相同。
  • dstsize: 表示降采样之后的目标图像的大小。
  • borderType: 表示表示图像边界的处理方式。

注意:dstsize 参数是有默认值的,调用函数的时候不指定第三个参数,那么这个值是按照 Size((src.cols+1)/2, (src.rows+1)/2) 计算的。而且不管如何指定这个参数,一定必须保证满足以下关系式:|dstsize.width * 2 - src.cols| ≤ 2; |dstsize.height * 2 - src.rows| ≤ 2。也就是说降采样的意思其实是把图像的尺寸缩减一半,行和列同时缩减一半。

pyrUp() 的原函数如下:

def pyrUp(src, dst=None, dstsize=None, borderType=None)
  • src: 表示输入图像。
  • dst: 表示输出图像,它与src类型、大小相同。
  • dstsize: 表示降采样之后的目标图像的大小。
  • borderType: 表示表示图像边界的处理方式。

参数释义和上面的 pyrDown() 保持一致。

下面是高斯金字塔和拉普拉斯金字塔的代码示例:

import cv2 as cv#高斯金字塔
def gaussian_pyramid(image):level = 3#设置金字塔的层数为3temp = image.copy()  #拷贝图像gaussian_images = []  #建立一个空列表for i in range(level):dst = cv.pyrDown(temp)   #先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)gaussian_images.append(dst)  #在列表末尾添加新的对象cv.imshow("gaussian"+str(i), dst)temp = dst.copy()return gaussian_images#拉普拉斯金字塔
def laplacian_pyramid(image):gaussian_images = gaussian_pyramid(image)    #做拉普拉斯金字塔必须用到高斯金字塔的结果level = len(gaussian_images)for i in range(level-1, -1, -1):if (i-1) < 0:expand = cv.pyrUp(gaussian_images[i], dstsize = image.shape[:2])laplacian = cv.subtract(image, expand)# 展示差值图像cv.imshow("laplacian_down_"+str(i), laplacian)else:expand = cv.pyrUp(gaussian_images[i], dstsize = gaussian_images[i-1].shape[:2])laplacian = cv.subtract(gaussian_images[i-1], expand)# 展示差值图像cv.imshow("laplacian_down_"+str(i), laplacian)src = cv.imread('maliao.jpg')
print(src.shape)
# 先将图像转化成正方形,否则会报错
input_image = cv.resize(src, (560, 560))
# 设置为 WINDOW_NORMAL 可以任意缩放
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
laplacian_pyramid(src)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
上面这段程序有一点需要注意,我当前使用 opencv-python 的版本是 4.3.0.36 ,理论上在向上采样的过程中,目标大小只需要满足关系 |dstsize.width - src.cols * 2| ≤ (dstsize.width mod 2) 即可。

实际上经过测试,输入图像是必须使用正方形,长方形的图像会直接爆出如下错误:

error: (-215:Assertion failed) std::abs(dsize.width - ssize.width*2) == dsize.width % 2 && std::abs(dsize.height - ssize.height*2) == dsize.height % 2 in function 'cv::pyrUp_'

具体原因并没有想通,希望哪位知道的大佬可以解释下。


http://chatgpt.dhexx.cn/article/uKXIAKk8.shtml

相关文章

高斯金字塔及拉普拉斯金字塔的Matlab实现

1、高斯金字塔计算步骤 &#xff08;1&#xff09;对第 i i i 层图像进行高斯内核卷积&#xff1b; &#xff08;2&#xff09;将所有偶数行和列去除&#xff08;下采样&#xff09;&#xff0c;得到第 i 1 i1 i1 层图像&#xff1b; &#xff08;3&#xff09;对原始图像不…

【C++】高斯金字塔和拉普拉斯金字塔原理和实现

【C】高斯金字塔和拉普拉斯金字塔原理和实现 图像中各个像素与其相邻像素之间的有很强的相关性&#xff0c;包含的信息也十分丰富&#xff0c;目标的尺寸有大有小&#xff0c;对比度有强有弱&#xff0c;此时就需要一个“显微镜”或者“望远镜”-----多尺度图像技术。它可以在…

python 高斯金字塔_12、高斯金字塔、拉普拉斯金字塔与图片尺寸缩放(示例代码)...

一、引言 我们经常会将某种尺寸的图像转换为其他尺寸的图像&#xff0c;如果放大或者缩小图片的尺寸&#xff0c;笼统来说的话&#xff0c;可以使用OpenCV为我们提供的如下两种方式&#xff1a; (1)resize函数。这是最直接的方式&#xff0c; (2)pyrUp( )、pyrDown( )函数。即图…

高斯金字塔的构建步骤

转自&#xff1a;https://www.cnblogs.com/starfire86/p/5735061.html SIFT(Scale-Invariant Feature Transform&#xff0c;尺度不变特征转换)在目标识别、图像配准领域具有广泛的应用&#xff0c;下面按照SIFT特征的算法流程对其进行简要介绍对SIFT特征做简要介绍。 高斯金字…

图像处理(九)高斯金字塔及拉普拉斯金字塔

高斯滤波的核就是一个求平均值的卷积核 高斯金字塔也是一个高斯核&#xff0c;只是步长为2&#xff0c;卷积后图片缩小二倍。高斯金字塔的目的是在图像不同大小时可以获得不同的信息&#xff0c;比如说图像较小时可以获得轮廓&#xff0c;图像较大时可以获得细节 使用函数cv2.p…

OpenCV SIFT源码讲解——构建高斯金字塔

目录 一、构建方法 二、函数重要点注释 一、构建方法 高斯金字塔每层图像的尺度为&#xff1a;。理论上金字塔每层图像可以从原图做的高斯滤波得到。但是实际操作中&#xff0c;每组的第一张影像&#xff08;除第一组&#xff09;是上一组倒数第三张影像降采样得到&#xff0c…

OpenCV中的图像金字塔(高斯金字塔、拉普拉斯金字塔)

最近在看关于数字图像的知识点&#xff0c;目前在图像金字塔部分&#xff0c;实在是懒得用手作笔记了&#xff0c;就以其中比较出名的“高斯金字塔”和“拉普拉斯金字塔”为例&#xff0c;基于OpenCV的源代码作解析存个档&#xff1b;毕竟属于基础部分&#xff0c;以后有需要就…

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

Python OpenCV 365 天学习计划&#xff0c;与橡皮擦一起进入图像领域吧。 基础知识铺垫 学习图像金字塔&#xff0c;发现网上的资料比较多&#xff0c;检索起来比较轻松。 图像金字塔是一张图像多尺度的表达&#xff0c;或者可以理解成一张图像不同分辨率展示。 金字塔越底层的…

图像金字塔和高斯金字塔

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

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

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

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

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

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

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

高斯金字塔

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

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

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

快速了解Scala技术栈

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

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

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

AI题目整理

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

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

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

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

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

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

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