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

article/2025/8/15 4:17:47

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

图像中各个像素与其相邻像素之间的有很强的相关性,包含的信息也十分丰富,目标的尺寸有大有小,对比度有强有弱,此时就需要一个“显微镜”或者“望远镜”-----多尺度图像技术。它可以在不同分辨率下观察目标的特征进而进行处理。

多尺度图像技术也叫做多分辨率技术(MRA),指对图像采用多尺度的表达,并且在不同尺度下分别进行处理。这样做的理由是很多情况下在一种尺度中不容易看清的或者获取的特性在另外的某种尺度下就很容易发现或者是提取。所以多尺度技术在提取图像特征时更加的常用。要在多尺度情况下对图像进行处理首先要在多尺度情况下对图像进行表达,并且找到各尺度之间的相互联系。而金字塔结构就是一种图像的多尺度表达形式。为了获得多尺度表达所采用的多尺度变换技术基本上可以分为三大类,尺度空间技术,时间尺度技术,时间频率技术。
在这里插入图片描述

1. 图像金字塔

图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像素采样的方式,生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底部,以金字塔形状排列,往上是一系列像素(尺寸)逐渐降低的图像,一直到金字塔的顶部只包含一个像素点的图像,这就构成了传统意义上的图像金字塔。
请添加图片描述

通过上采样和下采样实现图像金字塔,即对源图像的尺寸进行放大或者缩小变换。在opencv里面可以用resize函数,将源图像精准地转化为指定尺寸的目标图像。要缩小图像,一般推荐使用CV_INETR_AREA(区域插值)来插值;若要放大图像,推荐使用CV_INTER_LINEAR(线性插值)。这个函数可以用来做简单的图像尺度变换。

void resize(src,dst,size,int interpolation)
//src:源图像;dst:目标图像,
//size目标图像大小,可以是指定的尺寸或者放大缩小的比例
//指定插值方式,一般有四种插值方式可供选择,默认为线性插值法

图像金字塔效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 高斯金字塔

高斯金字塔(Gaussian pyramid): 通过高斯滤波和下采样获得一系列图像。相比于上面简单的下采样图像金字塔,高斯金字塔每一层都需要进行一次高斯滤波。通过使用不同的δ来调节高斯滤波器的频带宽度,得到经过不同高斯滤波器相同尺寸的同一组高斯金字塔。
请添加图片描述
当图像向金字塔的上层移动时,尺寸和分辨率就降低。OpenCV中,从金字塔中上一级图像生成下一级图像的可以用PryDown。而通过PryUp将现有的图像在每个维度都放大两倍。
上采样:pyrUp()函数

void pyrUp(InputArray src, OutputArray dst, const Size& dstsize=Size());

上采样效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下采样:pyrDown()函数

void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size());

高斯金字塔效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 拉普拉斯金字塔

拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。我们可以将拉普拉斯金字塔理解为高斯金字塔的逆过程形式。

拉普拉斯金字塔的计算过程是通过源图像减去先缩小后再放大的图像,可以直接用OpenCV进行拉普拉斯运算:
在这里插入图片描述
请添加图片描述
拉普拉斯效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将拉普拉斯金字塔逐层上采样累加重构后的效果图如下:
在这里插入图片描述
C++和opencv代码实现:

#include "iostream"
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;void Gaussian_Pyramid(Mat &image, vector<Mat> &pyramid_images, int level);
void Laplaian_Pyramid(vector<Mat> &pyramid_images, Mat &image);
void reconstuction(int level);int main(int argc, char** argv)
{Mat src = imread("Curry.jpg");/*copyMakeBorder(src, src, 0, 3, 0, 3, BORDER_REPLICATE);*/imshow("01", src);/*resize(src, src, Size(src.cols *4, src.rows *4));*//*cvtColor(src, src, COLOR_BGR2GRAY);*/vector<Mat> p_images;const int layer = 3; //金字塔层数Gaussian_Pyramid(src, p_images, layer - 1);Laplaian_Pyramid(p_images, src);reconstuction(layer - 1);//从拉普拉斯金字塔恢复原图waitKey();return 0;}void Gaussian_Pyramid(Mat &image, vector<Mat> &pyramid_images, int level) {Mat temp = image.clone();Mat dst;char buf[64];for (int i = 0; i < level; i++) {pyrDown(temp, dst);imshow(format("pyramid_up_%d", i), dst);sprintf_s(buf, "./result/gaussian_%d.jpg", i);imwrite(buf, dst);temp = dst.clone();pyramid_images.push_back(temp);}
}void Laplaian_Pyramid(vector<Mat> &pyramid_images, Mat &image) {int num = pyramid_images.size() - 1;imwrite("./result/laplacian_0.jpg", pyramid_images[num]);imshow("laplacian_0.jpg", pyramid_images[num]);for (int t = num; t > -1; t--) {Mat dst;char buf[64];if (t - 1 < 0) {pyrUp(pyramid_images[t], dst, image.size());subtract(image, dst, dst);// dst = dst + Scalar(127, 127, 127);sprintf_s(buf, "./result/laplacian_%d.jpg", num - t + 1);imshow(buf, dst);imwrite(buf, dst);}else {pyrUp(pyramid_images[t], dst, pyramid_images[t - 1].size());subtract(pyramid_images[t - 1], dst, dst);// dst = dst + Scalar(127, 127, 127);sprintf_s(buf, "./result/laplacian_%d.jpg", num - t + 1);imshow(buf, dst);imwrite(buf, dst);}}
}void reconstuction(int level) {char buf[64];Mat dst = imread("./result/laplacian_0.jpg");Mat dst2 = imread("./result/laplacian_1.jpg");Mat dst3 = imread("./result/laplacian_2.jpg");pyrUp(dst, dst);Mat dst4 = dst + dst2;pyrUp(dst4, dst4);Mat dst5 = dst4 + dst3;imshow("dst", dst5);
}

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

相关文章

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)按值查找元素缺失值比较追加、插入、删除统计数据重复数…

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

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

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

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