当前位置: 首页 > 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.内置类…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...