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拉普拉斯金字塔
实验原理 拉普拉斯金字塔(Laplacian Pyramid)是一种图像表示方法,常被用于图像处理和计算机视觉领域。它是基于高斯金字塔的一种变换形式,主要用于图像融合、图像金字塔的构建等场景。下面简要介绍拉普拉斯金字塔的基本原理。 高…...
redis为什么不使用一致性hash
Redis节点间通信时,心跳包会携带节点的所有槽信息,它能以幂等方式来更新配置。如果采用 16384 个插槽,占空间 2KB (16384/8);如果采用 65536 个插槽,占空间 8KB (65536/8)。 今天我们聊个知识点为什么Redis使用哈希槽而不是一致性…...
Vue.js与Flask/Django后端配合
Vue.js与Flask/Django后端配合 在现代Web开发领域,前后端分离已成为一种流行的架构模式。Vue.js作为一款轻量级、高性能的前端框架,与Flask或Django这样的后端框架相结合,可以构建出强大且可扩展的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 模组的入门级开发板(内置 ESP32-C3FH4 或 ESP32-C3FN4 芯片)。 板上模组大部分管脚均已引出至两侧排针,可根据开发实际需求&a…...
Vue主题色实现
主题色实现 情境 配置平台支持多个主题色的选择,用户可通过在配置平台选择项目主题色。前端项目在骨架屏加载页面获取配置信息,设置项目主题色,实现同个项目不同主题色渲染的需求 实现 1.定义主题色变量 不同主题色根据不同js文件划分定…...
ChartLlama: A Multimodal LLM for Chart Understanding and Generation论文阅读
原文链接:https://arxiv.org/abs/2311.16483 代码与数据集:https://tingxueronghua.github.io/ChartLlama/ 本文启发:文章提出利用GPT-4合成大量图表数据,这些数据包含各种图表类型,包含丰富的instruction data。然后…...
ByteCinema(1):用户的登录注册
文章目录 主要功能生成图形验证码redis滑动窗口操作限流0.限流设计的必要性1.原理2.代码(邮箱发验证码为例)3. 问题与解决高并发环境下redis操作的原子性过时数据的积累 续约token实现长期登录0.设计的出发点1.前置知识:JWT什么是 JWT?JWT 的…...
电力电网电线变电站输电线绝缘子无人机类数据集/农业植物病虫害类数据集/光伏板/工程煤矿矿场类数据集/道路类数据集
电力电网电线变电站输电线红外缺陷类数据集 传送门链接: 1.电线覆盖物检测数据集 气球风筝鸟巢 1300张 voc yol-CSDN博客 2.变电站可见光缺陷数据集数据集包含8376张巡检图像,带xml标签,共包含17类巡检标签!具体缺陷分类见下图!…...
深度学习之表示学习 - 引言篇
序言 在数据爆炸的今天,如何从纷繁复杂的信息中抽取有价值的知识,成为了人工智能领域亟待解决的核心问题。深度学习,作为机器学习的一个重要分支,以其强大的特征表示能力和自动化学习特性,引领了这场数据革命的浪潮。…...
Linux驱动开发 ——架构体系
只读存储器(ROM) 1.作用 这是一种非易失性存储器,用于永久存储数据和程序。与随机存取存储器(RAM)不同,ROM中的数据在断电后不会丢失,通常用于存储固件和系统启动程序。它的内容在制造时或通过…...
Django一分钟:lookupAPI详解,使用django orm生成高效的WHERE子句
一、Lookup API概述 Lookup API是Django用于构建数据库查询WHERE子句的API。 Lookup API的核心包含两部分: RegisterLookupMixin:为子类提供注册lookup的方法Query Expression API:一个接口,规定了可以被注册为lookup的类需要实…...
信息安全工程师(8)网络新安全目标与功能
前言 网络新安全目标与功能在当前的互联网环境中显得尤为重要,它们不仅反映了网络安全领域的最新发展趋势,也体现了对网络信息系统保护的不断加强。 一、网络新安全目标 全面防护与动态应对: 目标:建立多层次、全方位的网络安全防…...
返利机器人在电商返利系统中的负载均衡实现
返利机器人在电商返利系统中的负载均衡实现 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来聊一聊如何在电商返利系统中实现返利机器人的负载均衡,尤其是在面对高并发和大量…...
MATLAB中typecast函数用法
目录 语法 说明 示例 将整数转换为相同存储大小的无符号整数 将 8 位整数转换为单精度 将 32 位整数转换为 8 位整数 将 8 位整数转换为 16 位整数 提示 typecast函数的功能是在不更改基础数据的情况下转换数据类型。 语法 Y typecast(X,type) 说明 Y typecast(X,…...
植物大战僵尸【源代码分享+核心思路讲解】
植物大战僵尸已经正式完结,今天和大家分享一下,话不多说,直接上链接!!!(如果大家在运行这个游戏遇到了问题或者bug,那么请私我谢谢) 大家写的时候可以参考一下我的代码思…...
变压器设备漏油数据集 voc txt
变压器设备漏油数据集 油浸式变压器通常采用油浸自冷式、油浸风冷式和强迫油循环三种冷却方式。该数据集采集于油浸式变压器的设备漏油情况,一般用于变电站的无人巡检,代替传统的人工巡检,与绝缘子的破损检测来源于同一课题。数据集一部分来自…...
算法练习题25——leetcode3279统计重新排列后包含另一个字符串的子字符串的数目(滑动窗口 双指针 哈希)
题目描述 解题思路 本题用到了滑动窗口 双指针 哈希 刚开始我是没读懂题的因为我笨 我想把我的思路说一下 左端不轻易缩小 只有找到跟word2匹配了 比如说abbcdd 遍历到c的时候才能匹配这个word2 对吧 那么之后加上以一个d或者俩d 都符合了 然后我们算完了 才能缩小左端 扩大…...
JavaEE: 深入探索TCP网络编程的奇妙世界(二)
文章目录 TCP核心机制TCP核心机制二: 超时重传为啥会丢包?TCP如何对抗丢包?超时重传的时间设定超时时间该如何确定? TCP核心机制 前一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(一) 书接上文~ TCP核心机制二: 超时重传 在网络传输中,并不会一帆风顺,而是可能出现&qu…...
GPT1-GPT3论文理解
GPT1-GPT3论文理解 视频参考: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语言中动态内存管理方式:malloc/calloc/realloc/free 3、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 4、operator new与operator delete函数 5、new和delete的实现原理 1.内置类…...
Serial Wombat 18AB VGA驱动库:低成本嵌入式实时视频输出方案
1. Serial Wombat 18AB VGA 驱动库技术解析:嵌入式系统中的低成本实时视频输出方案Serial Wombat 18AB 是一款高度集成的可编程 I/O 协处理器芯片,其核心价值在于以极低的主控资源开销实现复杂外设时序控制。当该芯片被配置为 VGA 模式时,它能…...
W5500 TCP客户端实战 | 02 - 从寄存器配置到数据收发的完整流程解析
1. W5500网络寄存器配置详解 第一次接触W5500芯片时,我被它密密麻麻的寄存器地址搞得头晕眼花。后来发现只要抓住几个核心寄存器,配置起来就像填快递单一样简单。先说说最关键的四个本地网络寄存器,它们相当于设备的"身份证"&#…...
AMD Ryzen终极调试工具:5步掌握硬件级性能优化
AMD Ryzen终极调试工具:5步掌握硬件级性能优化 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode.c…...
终极音乐解析方案:music-api如何免费打通四大平台音频资源壁垒
终极音乐解析方案:music-api如何免费打通四大平台音频资源壁垒 【免费下载链接】music-api 各大音乐平台的歌曲播放地址获取接口,包含网易云音乐,qq音乐,酷狗音乐等平台 项目地址: https://gitcode.com/gh_mirrors/mu/music-api…...
如何快速配置MangoHud快捷键:从零开始的游戏性能监控终极指南
如何快速配置MangoHud快捷键:从零开始的游戏性能监控终极指南 【免费下载链接】MangoHud A Vulkan and OpenGL overlay for monitoring FPS, temperatures, CPU/GPU load and more. 项目地址: https://gitcode.com/gh_mirrors/ma/MangoHud 你是否厌倦了游戏性…...
贾子科学定理(Kucius Science Theorem):挑战证伪主义、重构“绝对真理”的科学哲学新论
贾子科学定理(Kucius Science Theorem):挑战证伪主义、重构“绝对真理”的科学哲学新论 摘要 贾子科学定理旨在系统批判波普尔的证伪主义,指出其存在逻辑悖论与文化霸权缺陷。该理论提出科学是“公理驱动、可结构化”的绝对真理…...
车桥耦合振动联合仿真程序功能说明文档
公路车桥耦合振动程序(考虑路面不平整度),适用于研究生参考!!!!!!!! 有两套模型,一套纯ansys,一套是ansys与matlab联合的 …...
打破语言壁垒:Translumo屏幕实时翻译终极指南
打破语言壁垒:Translumo屏幕实时翻译终极指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 还在为看不懂游戏…...
在PC上玩Switch游戏:Ryujinx模拟器终极指南与实用教程
在PC上玩Switch游戏:Ryujinx模拟器终极指南与实用教程 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上体验《塞尔达传说:旷野之息》的震撼画面&#…...
第29章 2023真题作文
目录 题目2023.11-论边缘计算及其应用 题目2023.11-论多源数据集成及应用 题目2023.11-论面向对象的建模及应用 题目2023.11-论软件的可靠性评价 题目2023.11-论边缘计算及其应用 边缘计算是在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用核心能力…...
