当前位置: 首页 > news >正文

10.3拉普拉斯金字塔

实验原理

拉普拉斯金字塔(Laplacian Pyramid)是一种图像表示方法,常被用于图像处理和计算机视觉领域。它是基于高斯金字塔的一种变换形式,主要用于图像融合、图像金字塔的构建等场景。下面简要介绍拉普拉斯金字塔的基本原理。

高斯金字塔(Gaussian Pyramid)

首先,为了理解拉普拉斯金字塔,我们需要了解高斯金字塔的概念。高斯金字塔是一个多分辨率的图像表示方法,通过一系列对原图进行下采样的操作生成不同分辨率的图像序列。每个层是由前一层经过卷积滤波后进行下采样得到的。

拉普拉斯金字塔

拉普拉斯金字塔也是多分辨率表示的一种方式,但与高斯金字塔不同的是,拉普拉斯金字塔记录的是每一层相对于上一层的差异信息。这种金字塔由如下步骤构建:

1. 构建高斯金字塔:从原始图像开始,依次生成每一层的高斯金字塔,每层都是通过应用高斯滤波器后进行下采样(通常是将图像尺寸缩小一半)得到的。

2. 构建拉普拉斯层:对于每一层高斯金字塔,拉普拉斯层是通过以下步骤得到的:

•从较高分辨率的图像生成较低分辨率的图像(即,先下采样再高斯滤波)。

•从较低分辨率的图像生成较高分辨率的图像(即,先上采样再高斯滤波)。

•计算两者的差值,这就是该层的拉普拉斯层。

应用

拉普拉斯金字塔在很多场合都有应用,比如:

•图像融合:可以将多个源图像的拉普拉斯层叠加在一起,从而创建出一个具有多个视角信息的新图像。

•图像压缩:由于拉普拉斯金字塔的每一层都表示了图像的一个细节层次,因此可以用不同的精度来存储每一层,从而实现图像的高效压缩。

•边缘检测:拉普拉斯金字塔中的每一层都可以看作是对应尺度下的边缘信息,因此可以用来进行边缘检测。

在OpenCV(开源计算机视觉库)中,拉普拉斯金字塔(Laplacian Pyramid)是一种多尺度图像表示方法,它用于图像处理和计算机视觉任务中。拉普拉斯金字塔是基于高斯金字塔(Gaussian Pyramid)构建的,通常用于图像融合、图像金字塔之间的差异存储以及图像缩放等操作。

原理
1.高斯金字塔:

首先创建一个高斯金字塔,它是通过连续对原始图像进行模糊和下采样得到的一系列图像。每次生成新的层时,通常会使用一个5x5或3x3的高斯核来对图像进行平滑处理,然后将图像的宽度和高度减半。
2.拉普拉斯金字塔构造:

一旦有了高斯金字塔,就可以构建拉普拉斯金字塔了。对于每个高斯金字塔中的非顶层图像,我们对其进行上采样(通常是尺寸扩大一倍),然后从其上方一层(即更精细的层)减去这个上采样的版本。结果就是该层的拉普拉斯图像,它捕捉了与上一层相比的细节变化。
3.拉普拉斯金字塔应用:
图像融合:可以将两个或多个不同来源的拉普拉斯金字塔对应层相加,然后通过逆过程重建出融合后的图像。
图像压缩:可以仅存储拉普拉斯金字塔的顶部(最粗糙的层),以及每一层的差值,这样可以减少存储空间。
图像金字塔之间的差异存储:这有助于在网络上传输图像时节省带宽。
4.重建图像:为了从拉普拉斯金字塔中恢复原始图像,需要反向操作。先从最顶层开始,进行上采样,并将其与下一层的拉普拉斯图像相加。重复这一过程直到最后一层,就能重建出完整的图像。

在OpenCV中,buildPyramidMultiChannel函数可以用来创建拉普拉斯金字塔,而pyrUp和pyrDown函数则分别用于上采样和下采样操作。不过需要注意的是,直接用于创建拉普拉斯金字塔的函数可能需要你自己实现,因为OpenCV没有直接提供这样的函数,你需要组合使用上述提到的功能来构建拉普拉斯金字塔。

示例代码1

使用C++编写的拉普拉斯金字塔构建示例代码:

#include "pch.h"#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;// 定义一个函数来构建拉普拉斯金字塔
vector<Mat> buildLaplacianPyramid(const Mat &src, int levels)
{vector<Mat> gaussianPyramid;vector<Mat> laplacianPyramid;// 创建高斯金字塔gaussianPyramid.push_back(src.clone());Mat temp = src.clone();for (int i = 0; i < levels; ++i) {GaussianBlur(temp, temp, Size(5, 5), 1.5);Mat nextLevel;pyrDown(temp, nextLevel);gaussianPyramid.push_back(nextLevel.clone());temp = nextLevel;}// 创建拉普拉斯金字塔for (int i = gaussianPyramid.size() - 2; i >= 0; --i) {Mat expanded;pyrUp(gaussianPyramid[i + 1], expanded, gaussianPyramid[i].size());Mat laplacian;gaussianPyramid[i] -= expanded;laplacian = gaussianPyramid[i];laplacianPyramid.push_back(laplacian);}// 将最后一个高斯层加入拉普拉斯金字塔laplacianPyramid.push_back(gaussianPyramid.back());return laplacianPyramid;
}int main(int argc, char** argv) 
{/*if (argc != 2){cout << "Usage: ./LaplacianPyramid <Image Path>" << endl;return -1;}*/// 加载图像Mat img = imread("01.png", IMREAD_GRAYSCALE);if (!img.data){cout << "Error opening image" << endl;return -1;}// 设置金字塔的层数int levels = 5;// 构建拉普拉斯金字塔vector<Mat> laplacianPyramid = buildLaplacianPyramid(img, levels);// 显示金字塔的每一层for (size_t i = 0; i < laplacianPyramid.size(); ++i){namedWindow("Laplacian Level " + to_string(i), WINDOW_NORMAL);imshow("Laplacian Level " + to_string(i), laplacianPyramid[i]);waitKey(0);}return 0;
}说明
1. 高斯金字塔: 使用 pyrDown 函数创建高斯金字塔的每一层。
2. 拉普拉斯金字塔: 使用 pyrUp 函数将高斯金字塔的每一层扩大到原始尺寸,并与原图相减得到拉普拉斯层。
3. 显示: 使用 imshow 和 waitKey 来显示每一层的拉普拉斯金字塔。

运行结果1

示例代码2

在OpenCV中,你可以使用C++编写一个简单的程序来构建拉普拉斯金字塔。下面是一个基本的示例,展示如何构建拉普拉斯金字塔,并且显示每层的结果。

#include "pch.h"#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, char** argv)
{// 读取图像Mat img = imread("78.jpeg", IMREAD_COLOR);if (img.empty()){cout << "Error: Image cannot be loaded!" << endl;return -1;}int levels = 4;  // 定义金字塔层数vector<Mat> pyr(levels);// 创建高斯金字塔pyr[0] = img;for (int i = 1; i < levels; ++i){pyrDown(pyr[i - 1], pyr[i]);}// 创建拉普拉斯金字塔vector<Mat> lap_pyr(levels);for (int i = 0; i < levels - 1; ++i){Mat up;pyrUp(pyr[i + 1], up, pyr[i].size());lap_pyr[i] = pyr[i] - up;}// 最后一层不需要上采样lap_pyr[levels - 1] = pyr[levels - 1];// 显示每一层for (int i = 0; i < levels; ++i){namedWindow("Level " + to_string(i), WINDOW_NORMAL);imshow("Level " + to_string(i), lap_pyr[i]);}waitKey(0);  // 等待按键退出return 0;
}说明:
读取图像:首先读取一个图像文件,并检查是否成功加载。
创建高斯金字塔:使用pyrDown函数逐层创建高斯金字塔。
创建拉普拉斯金字塔:通过上采样高斯金字塔的每一层,并从它的上一层减去,从而创建拉普拉斯金字塔。
显示图像:使用imshow函数显示拉普拉斯金字塔的每一层。
请确保替换 "path/to/your/image.jpg" 为你的图像文件的实际路径。此外,确保你的环境中已经正确安装了OpenCV,并且包含了必要的头文件和链接库。这个例子简单地展示了如何创建拉普拉斯金字塔,但在实际应用中,你可能还需要处理更多细节,例如边界条件、不同数据类型的处理等。

运行结果2

实验代码3

#include "pch.h"
#include <iostream>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui_c.h>
using namespace std;
using namespace cv;
//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 //拉普拉斯 边缘计算
void TLaplacian()
{Mat img1, img2, gray_img, edge_img;const char* win1 = "window1";const char* win2 = "window2";const char* win3 = "window3";const char* win4 = "window4";namedWindow(win1, CV_WINDOW_NORMAL);namedWindow(win2, CV_WINDOW_NORMAL);namedWindow(win3, CV_WINDOW_NORMAL);namedWindow(win4, CV_WINDOW_NORMAL);img1 = imread("8.png");if (img1.empty()){cout << "could not found image" << endl;return;}//高斯模糊,去掉噪点GaussianBlur(img1, img2, Size(3, 3), 0, 0);//转为灰度图cvtColor(img2, gray_img, CV_BGR2GRAY);//拉普拉斯Laplacian(gray_img, edge_img, CV_16S, 3);convertScaleAbs(edge_img, edge_img);threshold(edge_img, edge_img, 2, 255, THRESH_OTSU | THRESH_BINARY);imshow(win1, img1);imshow(win2, img2);imshow(win3, gray_img);imshow(win4, edge_img);
}int main()
{TLaplacian();waitKey(0);return 0;
}

运行结果3

相关文章:

10.3拉普拉斯金字塔

实验原理 拉普拉斯金字塔&#xff08;Laplacian Pyramid&#xff09;是一种图像表示方法&#xff0c;常被用于图像处理和计算机视觉领域。它是基于高斯金字塔的一种变换形式&#xff0c;主要用于图像融合、图像金字塔的构建等场景。下面简要介绍拉普拉斯金字塔的基本原理。 高…...

redis为什么不使用一致性hash

Redis节点间通信时&#xff0c;心跳包会携带节点的所有槽信息&#xff0c;它能以幂等方式来更新配置。如果采用 16384 个插槽&#xff0c;占空间 2KB (16384/8);如果采用 65536 个插槽&#xff0c;占空间 8KB (65536/8)。 今天我们聊个知识点为什么Redis使用哈希槽而不是一致性…...

Vue.js与Flask/Django后端配合

Vue.js与Flask/Django后端配合 在现代Web开发领域&#xff0c;前后端分离已成为一种流行的架构模式。Vue.js作为一款轻量级、高性能的前端框架&#xff0c;与Flask或Django这样的后端框架相结合&#xff0c;可以构建出强大且可扩展的Web应用。本文将详细介绍如何将Vue.js与Fla…...

ESP32 入门笔记02: ESP32-C3 系列( 芯片ESP32-C3FN4) (ESP-IDF + VSCode)

ESP32-C3 系列的 芯片 / 模组 / 开发板 ESP32-C3-DevKitM-1是乐鑫一款搭载 ESP32-C3-MINI-1 或 ESP32-C3-MINI-1U 模组的入门级开发板&#xff08;内置 ESP32-C3FH4 或 ESP32-C3FN4 芯片&#xff09;。 板上模组大部分管脚均已引出至两侧排针&#xff0c;可根据开发实际需求&a…...

Vue主题色实现

主题色实现 情境 配置平台支持多个主题色的选择&#xff0c;用户可通过在配置平台选择项目主题色。前端项目在骨架屏加载页面获取配置信息&#xff0c;设置项目主题色&#xff0c;实现同个项目不同主题色渲染的需求 实现 1.定义主题色变量 不同主题色根据不同js文件划分定…...

ChartLlama: A Multimodal LLM for Chart Understanding and Generation论文阅读

原文链接&#xff1a;https://arxiv.org/abs/2311.16483 代码与数据集&#xff1a;https://tingxueronghua.github.io/ChartLlama/ 本文启发&#xff1a;文章提出利用GPT-4合成大量图表数据&#xff0c;这些数据包含各种图表类型&#xff0c;包含丰富的instruction data。然后…...

ByteCinema(1):用户的登录注册

文章目录 主要功能生成图形验证码redis滑动窗口操作限流0.限流设计的必要性1.原理2.代码&#xff08;邮箱发验证码为例&#xff09;3. 问题与解决高并发环境下redis操作的原子性过时数据的积累 续约token实现长期登录0.设计的出发点1.前置知识:JWT什么是 JWT&#xff1f;JWT 的…...

电力电网电线变电站输电线绝缘子无人机类数据集/农业植物病虫害类数据集/光伏板/工程煤矿矿场类数据集/道路类数据集

电力电网电线变电站输电线红外缺陷类数据集 传送门链接&#xff1a; 1.电线覆盖物检测数据集 气球风筝鸟巢 1300张 voc yol-CSDN博客 2.变电站可见光缺陷数据集数据集包含8376张巡检图像&#xff0c;带xml标签&#xff0c;共包含17类巡检标签!具体缺陷分类见下图&#xff01…...

深度学习之表示学习 - 引言篇

序言 在数据爆炸的今天&#xff0c;如何从纷繁复杂的信息中抽取有价值的知识&#xff0c;成为了人工智能领域亟待解决的核心问题。深度学习&#xff0c;作为机器学习的一个重要分支&#xff0c;以其强大的特征表示能力和自动化学习特性&#xff0c;引领了这场数据革命的浪潮。…...

Linux驱动开发 ——架构体系

只读存储器&#xff08;ROM&#xff09; 1.作用 这是一种非易失性存储器&#xff0c;用于永久存储数据和程序。与随机存取存储器&#xff08;RAM&#xff09;不同&#xff0c;ROM中的数据在断电后不会丢失&#xff0c;通常用于存储固件和系统启动程序。它的内容在制造时或通过…...

Django一分钟:lookupAPI详解,使用django orm生成高效的WHERE子句

一、Lookup API概述 Lookup API是Django用于构建数据库查询WHERE子句的API。 Lookup API的核心包含两部分&#xff1a; RegisterLookupMixin&#xff1a;为子类提供注册lookup的方法Query Expression API&#xff1a;一个接口&#xff0c;规定了可以被注册为lookup的类需要实…...

信息安全工程师(8)网络新安全目标与功能

前言 网络新安全目标与功能在当前的互联网环境中显得尤为重要&#xff0c;它们不仅反映了网络安全领域的最新发展趋势&#xff0c;也体现了对网络信息系统保护的不断加强。 一、网络新安全目标 全面防护与动态应对&#xff1a; 目标&#xff1a;建立多层次、全方位的网络安全防…...

返利机器人在电商返利系统中的负载均衡实现

返利机器人在电商返利系统中的负载均衡实现 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊一聊如何在电商返利系统中实现返利机器人的负载均衡&#xff0c;尤其是在面对高并发和大量…...

MATLAB中typecast函数用法

目录 语法 说明 示例 将整数转换为相同存储大小的无符号整数 将 8 位整数转换为单精度 将 32 位整数转换为 8 位整数 将 8 位整数转换为 16 位整数 提示 typecast函数的功能是在不更改基础数据的情况下转换数据类型。 语法 Y typecast(X,type) 说明 Y typecast(X,…...

植物大战僵尸【源代码分享+核心思路讲解】

植物大战僵尸已经正式完结&#xff0c;今天和大家分享一下&#xff0c;话不多说&#xff0c;直接上链接&#xff01;&#xff01;&#xff01;&#xff08;如果大家在运行这个游戏遇到了问题或者bug&#xff0c;那么请私我谢谢&#xff09; 大家写的时候可以参考一下我的代码思…...

变压器设备漏油数据集 voc txt

变压器设备漏油数据集 油浸式变压器通常采用油浸自冷式、油浸风冷式和强迫油循环三种冷却方式。该数据集采集于油浸式变压器的设备漏油情况&#xff0c;一般用于变电站的无人巡检&#xff0c;代替传统的人工巡检&#xff0c;与绝缘子的破损检测来源于同一课题。数据集一部分来自…...

算法练习题25——leetcode3279统计重新排列后包含另一个字符串的子字符串的数目(滑动窗口 双指针 哈希)

题目描述 解题思路 本题用到了滑动窗口 双指针 哈希 刚开始我是没读懂题的因为我笨 我想把我的思路说一下 左端不轻易缩小 只有找到跟word2匹配了 比如说abbcdd 遍历到c的时候才能匹配这个word2 对吧 那么之后加上以一个d或者俩d 都符合了 然后我们算完了 才能缩小左端 扩大…...

JavaEE: 深入探索TCP网络编程的奇妙世界(二)

文章目录 TCP核心机制TCP核心机制二: 超时重传为啥会丢包?TCP如何对抗丢包?超时重传的时间设定超时时间该如何确定? TCP核心机制 前一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(一) 书接上文~ TCP核心机制二: 超时重传 在网络传输中,并不会一帆风顺,而是可能出现&qu…...

GPT1-GPT3论文理解

GPT&#xff11;&#xff0d;GPT&#xff13;论文理解 视频参考&#xff1a;https://www.bilibili.com/video/BV1AF411b7xQ/?spm_id_from333.788&vd_sourcecdb0bc0dda1dccea0b8dc91485ef3e74 1 历史 2017.6 Transformer 2018.6 GPT 2018.10 BERT 2019.2 GPT-2 2020…...

C/C++内存管理 ——

目录 五、C/C内存管理 1、C/C内存分布 2、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 4、operator new与operator delete函数 5、new和delete的实现原理 1.内置类…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...