8.6小波变换(Wavelet Transform)边缘检测

实验原理

由于OpenCV本身并不直接支持小波变换(Wavelet Transform),我们需要借助一些技巧来实现它。一种常见的方法是利用离散余弦变换(DCT)或离散傅立叶变换(DFT)来近似实现小波变换的功能。但是,更直接的方法可能是使用离散小波变换(DWT),这通常需要特定的小波基函数。

示例代码1

在这里,我将提供一个简化版本的概念性代码,展示如何使用OpenCV来尝试模拟小波变换以进行边缘检测。请注意,这个示例并不会直接使用OpenCV内置的小波变换功能,而是通过简单的高斯金字塔来模拟小波变换的效果。

首先,确保你的环境中已经安装了OpenCV库。以下是一个基本的例子:

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv)
{// 加载图像cv::Mat src = cv::imread("01.jpeg", cv::IMREAD_GRAYSCALE);if (src.empty()){std::cout << "Error: Image not found or unable to open" << std::endl;return -1;}// 创建一个高斯金字塔std::vector<cv::Mat> pyramid;cv::Mat currentLevel = src.clone();for (int level = 0; level < 3; ++level) // 可以根据需要调整层数{cv::pyrDown(currentLevel, currentLevel);pyramid.push_back(currentLevel);}// 使用高斯金字塔来提取细节层cv::Mat reconstructed = pyramid.back();for (int level = pyramid.size() - 2; level >= 0; --level){cv::pyrUp(pyramid[level + 1], reconstructed, pyramid[level].size());cv::Mat detail;cv::absdiff(pyramid[level], reconstructed, detail); // 提取细节reconstructed = detail;}// 显示边缘图像cv::namedWindow("Original Image", CV_WINDOW_NORMAL);cv::imshow("Original Image", src);cv::namedWindow("Edge Detection Result", CV_WINDOW_NORMAL);cv::imshow("Edge Detection Result", reconstructed);cv::waitKey(0);return 0;
}

运行结果1

小波变换简介

小波变换是一种时频分析方法,它可以同时提供时间和频率上的分辨率。与傅里叶变换不同,小波变换不仅提供了频率信息,还提供了时间(或空间)上的位置信息。这对于分析非平稳信号特别有用,因为在很多实际应用中,信号的特性随时间变化。

OpenCV中的小波变换

OpenCV提供了一些函数来进行小波变换,主要包括cv::dwt(离散小波变换)cv::idwt(反离散小波变换)。这些函数可以用于多分辨率分析,即在不同的尺度下对图像进行分解和重构。

主要函数

1. cv::dwt:执行离散小波变换。

2. cv::idwt:执行反离散小波变换。

在 OpenCV 3.1.0 版本中,cv::dwt 函数并不直接可用,因为该版本及之前的版本中并未包含这个函数。cv::dwt 和 cv::idwt 函数是在 OpenCV 3.2.0 版本之后引入的。

cv::dwt() 是 OpenCV 库中的一个函数,用于执行离散小波变换(Discrete Wavelet Transform, DWT)。这个变换在图像处理中非常有用,可以用于图像压缩、去噪、特征提取等任务。DWT 可以将信号分解成不同的频率子带,从而提供时间-频率的局部化信息。

函数原型

void dwt(InputArray src, OutputArray dst, int transformType, int level = 1, int wavelet = CV_DWT_HAAR);参数说明
src: 输入数组(通常是图像),支持多种深度和通道数。
dst: 输出数组,与输入数组具有相同的尺寸和类型。
transformType: 指定变换类型,可以是以下值之一:
CV_DWT_FORWARD: 前向变换。
CV_DWT_INVVERSE: 逆变换。
level: 小波变换的级数,默认为 1。增加级数可以进一步分解低频子带。
wavelet: 使用的小波类型,默认为 CV_DWT_HAAR,目前OpenCV只支持Haar小波。注意事项
在使用 cv::dwt() 之前,请确保你的图像尺寸是2的幂次方,这样可以避免由于尺寸原因导致的问题。
Haar小波是最简单的一种小波基,它由两个滤波器组成:近似(低通)滤波器和细节(高通)滤波器。
对于多级变换,每增加一级变换,输出图像的尺寸就会减半。

示例代码2

下面是一个简单的示例,演示如何使用 cv::dwt() 进行前向小波变换:

#include <opencv2/opencv.hpp>int main()
{cv::Mat img = cv::imread("path_to_your_image.jpg", cv::IMREAD_GRAYSCALE);if (img.empty()){std::cout << "Error: Image not found." << std::endl;return -1;}// 创建与原图相同大小的输出矩阵cv::Mat coeffs;// 执行前向离散小波变换cv::dwt(img, coeffs, cv::DWT_FORWARD);// 显示变换后的图像cv::imshow("Original Image", img);cv::imshow("Transformed Image", coeffs);cv::waitKey(0);return 0;
}总结
cv::dwt() 提供了一个方便的方式来应用离散小波变换。
通过选择不同的变换类型和级别,可以实现对图像数据的多种分析和处理。
如果你需要进行更复杂的小波分析或使用其他类型的小波基,可能需要查看其他的库或自定义实现

cv::idwt() 是 OpenCV 库中的一个函数,用于执行逆离散小波变换(Inverse Discrete Wavelet Transform, IDWT)。这个函数可以将通过 cv::dwt() 得到的小波系数重构回原始的图像或信号。

函数原型

void idwt(InputArray src, OutputArray dst, int transformType, int level = 1, int wavelet = CV_DWT_HAAR);参数说明
src: 输入数组(通常是经过离散小波变换后得到的小波系数),支持多种深度和通道数。
dst: 输出数组,与输入数组具有相同的尺寸和类型。
transformType: 指定变换类型,可以是以下值之一:
CV_DWT_FORWARD: 虽然这不是逆变换,但在某些情况下可能被用作参数传递。
CV_DWT_INVERSE: 逆变换。
level: 小波变换的级数,默认为 1。这个参数应该与 cv::dwt() 中使用的相同。
wavelet: 使用的小波类型,默认为 CV_DWT_HAAR,目前OpenCV只支持Haar小波。注意事项
在使用 cv::idwt() 之前,确保你的输入系数数组符合之前进行的 cv::dwt() 变换的结构。
对于多级变换,你需要按照相同的级数进行逆变换。
通常,逆变换的结果会尽可能接近原始图像,但由于量化和其他误差,可能会有一些微小的差异。

示例代码3

下面是一个简单的示例,演示如何使用 cv::dwt() 和 cv::idwt() 进行前向小波变换和逆变换:

#include <opencv2/opencv.hpp>int main()
{cv::Mat img = cv::imread("path_to_your_image.jpg", cv::IMREAD_GRAYSCALE);if (img.empty()){std::cout << "Error: Image not found." << std::endl;return -1;}// 创建与原图相同大小的输出矩阵cv::Mat coeffs, reconstructed;// 执行前向离散小波变换cv::dwt(img, coeffs, cv::DWT_FORWARD, 2);  // 假设使用两级变换// 执行逆离散小波变换cv::idwt(coeffs, reconstructed, cv::DWT_INVERSE, 2);  // 使用相同的级数// 显示原始图像和重构图像cv::imshow("Original Image", img);cv::imshow("Reconstructed Image", reconstructed);cv::waitKey(0);return 0;
}总结
cv::idwt() 函数允许你在 OpenCV 中执行逆离散小波变换,
从而能够从小波系数中恢复出原始的图像或信号。
确保你使用正确的变换级别和类型来匹配之前进行的正向变换。
如果你在使用过程中遇到任何问题,确保你的 OpenCV 版本至少是 3.2.0,因为在更早的版本中可能不包含这些函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1535211.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习(六)】分类和回归任务-LightGBM算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;Histogram&#xff08;二&#xff09;GOSS1、信息增益2、近似误差 &#xff08;三&#xff09;EFB 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、LightGBM分类任务实现对比&a…

AI基础 L21 Quantifying Uncertainty and Reasoning with Probabilities III

Bayesian Networks 1 Bayesian Networks • A Bayesian Network (BN) represents the dependencies among variables and encodes the full joint probability distribution concisely. • A BN is a directed graph, where each node is annotated with probability informati…

[项目][WebServer][CGI机制 设计]详细讲解

目录 1.何为CGI机制&#xff1f;2.理解CGI机制3.CGI接口设计1.ProcessNonCgi2.ProcessCgi 1.何为CGI机制&#xff1f; CGI(Common Gateway Interface)是外部应用程序(CGI程序)与WEB服务器之间的接口标准&#xff0c;是在CGI程序和WEB服务器之间传递信息的过程 2.理解CGI机制 …

[XILINX] 正点原子ZYNQ7015开发板!ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2,性能强悍,资料丰富!

正点原子ZYNQ7015开发板&#xff01;ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2&#xff0c;性能强悍&#xff0c;资料丰富&#xff01; 正点原子Z15 ZYNQ开发板&#xff0c;搭载Xilinx Zynq7000系列芯片&#xff0c;核心板主控芯片的型号是XC7Z015CLG485-2。开发板由核心板&…

JAVA开源项目 在线视频教育平台 计算机毕业设计

本文项目编号 T 027 &#xff0c;文末自助获取源码 \color{red}{T027&#xff0c;文末自助获取源码} T027&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

【数据结构与算法 | 灵神题单 | 合并链表篇】力扣2, 21, 445, 2816

1. 力扣2&#xff1a;两数相加 1.1 题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可…

o1模型:引领AI技术在STEM领域的突破与应用

o1模型是OpenAI最新推出的大型语言模型&#xff0c;它在多个领域展现出了卓越的能力&#xff0c;被认为是AI技术发展的一个重要里程碑。以下是对o1模型的详细介绍和分析&#xff1a; o1模型的简介和性能评估 o1模型在物理、化学、生物学等领域的基准任务上达到了博士生水平&…

Android Studio:驱动高效开发的全方位智能平台

目录 Android Studio 1. 智能的代码编辑与自动补全 2. 快捷键与代码模板 3. 强大的调试工具 4. 实时分析与性能优化 5. 集成的 Gradle 构建系统 6. 持续集成与自动化 7. 版本控制与团队协作 8. 丰富的插件生态与定制化 9. 快速布局与 UI 设计工具 9. 即时运行&#…

数字IC设计\FPGA 职位经典笔试面试--整理

注&#xff1a; 资料都是基于网上一些博客分享和自己学习整理而成的 1&#xff1a;什么是同步逻辑和异步逻辑&#xff1f; 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 同步时序 逻辑电路的特点&#xff1a;各触发器的时钟端全部连接在一…

MySQL权限管理(DCL)总结

黑马程序员老师讲的非常好 第一个用户管理偏向于开发人员 第二个权限控制偏向于管理人员 但是怎么说呢&#xff0c;你毕竟学mysql了&#xff0c;都得学一学吧。只有精通&#xff0c;实力到位&#xff0c;才能被别人所认可&#xff01;

【打印管理】水印设置支持表单内容

09/11 主要更新模块概览 水印设置 拖动排序 恢复默认 其他更新 01 表单管理 1.1 【打印管理】-水印设置新增支持表单内容 说明&#xff1a; 在打印管理的水印设置中&#xff0c;原本仅支持企业名称作为水…

ROS笔记3.路径规划1

在 Rviz 中可视化路径规划move_base 节点的基本概念什么是Global Planner&#xff1f;什么是Global Costmap&#xff1f; 在 Rviz 中可视化路径规划 对于本章&#xff0c;您基本上需要使用 RViz 的 3 个元素&#xff1a; Map Display (Costmaps)Path Displays (Plans)2D 工具 …

加速开发体验:为 Android Studio 设置国内镜像源

Android Studio 是由 JetBrains 开发的一个官方 IDE&#xff0c;用于 Android 应用开发。由于网络原因&#xff0c;直接从 Google 的服务器下载可能会比较慢或者不稳定。幸运的是&#xff0c;我们可以通过配置国内镜像源来加速下载和更新。 文章目录 &#x1f4af; 修改 Gradle…

Go协程及并发锁应用指南

概念 协程&#xff08;Goroutine&#xff09;是Go语言独有的并发体&#xff0c;是一种轻量级的线程&#xff0c;也被称为用户态线程。相对于传统的多线程编程&#xff0c;协程的优点在于更加轻量级&#xff0c;占用系统资源更少&#xff0c;切换上下文的速度更快&#xff0c;不…

如何快速清理Docker中的停止容器?

如何快速清理Docker中的停止容器? 方法一:使用`docker container prune`方法二:结合`docker ps`和`docker rm`注意(这些命令慎用,确定容器不需要之后再执行)💖The Begin💖点点关注,收藏不迷路💖 Docker容器在停止后可能会占用不必要的磁盘空间。如何清理这些停止的…

linux 双网卡服务器突然断电后网卡单通故障解决

某台linux 双网卡服务器突然断电后网卡单通故障解决 故障现象&#xff1a;断电后重启服务器&#xff0c;主用网卡IP只能同网段访问&#xff0c;其他网段无法访问&#xff0c;备用网卡则正常&#xff1b; 解决方案&#xff1a;route -n查询路由信息&#xff0c;发现主网卡路由…

el-table的树形结构结合多选框使用,实现单选父子联动,全选,反选功能

<template><div><el-table:data"tableData":row-key"rowKey":default-expand-all"defaultExpandAll":tree-props"treeProps"><!-- 开启树形多选 --><el-table-column v-if"showSelection" width…

【视频教程】基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

【前端】main.js中app.vue中 render函数的作用及使用背景

vue.js中的main.js中的作用是将app组件挂载到页面中&#xff0c;其中app组件是汇总所有组件元素的组件。main.js的创建vue实例。 #认为的版本 import APP from ./App.vue;new Vue({el:#root,template:<App></App>,components:{App}, })#实际的版本 /* 整个项目的入…

el-table表格的展开行,初始化的时候展开哪一行+设置点击行可展开功能

效果&#xff1a; 表格展开行官网使用&#xff1a; 通过设置 type"expand" 和 Scoped slot 可以开启展开行功能&#xff0c;el-table-column 的模板会被渲染成为展开行的内容&#xff0c;展开行可访问的属性与使用自定义列模板时的 Scoped slot 相同。 但是这种方法…