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

news2024/12/27 0:41:47

实验原理

由于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.coloradmin.cn/o/2137027.html

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

相关文章

Spring的核心思想

目录 一、Spring要解决的问题 二、Spring的核心结构 三、核心思想 3.1.1 什么是IOC 3.1.2 IOC解决的问题&#xff1a;耦合 3.1.3 IOC和DI的区别 3.2.1 什么是AOP 3.2.2 AOP解决的问题&#xff1a;耦合 3.2.3 为什么叫做面向切面编程 一、Spring要解决的问题 问题1&am…

道路检测-目标检测数据集(包括VOC格式、YOLO格式)

道路检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nDwTmZxH_BQrVTj9MzUgDg?pwd3zh7 提取码&#xff1a;3zh7 数据集信息介绍&#xff1a; 共有 3321张图像和一一对应的标注文件 标注文…

Excel 国产化替换新方案

前言 在当前数字化转型和信创&#xff08;信息技术应用创新&#xff09;战略背景下&#xff0c;企业对于安全性、自主可控性和高效办公工具的需求日益增加。作为一款国产自主研发的高性能表格控件&#xff0c;SpreadJS 正成为替换 Excel 的最佳选择。它不仅全面支持国产化认证…

衡石分析平台使用手册-通用配置文档

配置文件​ 配置文件中存放 HENGSHI SENSE 的配置参数&#xff0c;可以通过修改配置文件来改变 HENGSHI SENSE 的服务方式。 配置文件说明​ 配置文件存放在 conf 路径下&#xff0c;包含 hengshi-sense-env.sh 和 engine-segment-hosts 两个文件。其中 engine-segment-host…

Qt与VS打包命令

一 QT 将程序编译生成的可执行文件&#xff08;.exe&#xff09;放到一个干净的文件夹。找到QT安装目录&#xff0c;进入编译版本的bin目录&#xff0c;找到windeployqt.exe&#xff0c;在文件访问路径栏的最前边&#xff0c;添加“cmd ”进入控制台。控制台命令&#xff1a; …

K8s 简介以及详细部署步骤

Kubernetes 简介 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个阶段&#xff1a; 1、传统部署 互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用程序定义资源…

【Java面试】第七天

&#x1f31f;个人主页&#xff1a;时间会证明一切. 目录 有三个线程T1,T2,T3如何保证顺序执行&#xff1f;依次执行start方法使用join使用CountDownLatch使用线程池使用CompletableFuture Spring Bean的生命周期是怎么样的&#xff1f;Autowired和Resource的关系&#xff1f;相…

使用Python生成多种不同类型的Excel图表

目录 一、使用工具 二、生成Excel图表的基本步骤 三、使用Python创建Excel图表 柱形图饼图折线图条形图散点图面积图组合图瀑布图树形图箱线图旭日图漏斗图直方图不使用工作表数据生成图表 四、总结 Excel图表是数据可视化的重要工具&#xff0c;它通过直观的方式将数字信…

Linux环境

Linux环境 导语程序参数getoptgetopt_long 环境变量getenv/putenvenviron 时间和日期timedifftime和gmtimectime&asctimestrftime/strptime 临时文件tmpnamtmpfile 获取信息用户主机日志 资源和限制总结参考文献 导语 任何程序都是在一定的环境下运行的&#xff0c;通常这…

分布式事务学习笔记(二)Seata架构、TC服务器部署、微服务集成Seata

文章目录 前言2 Seata2.1 Seata的架构2.2 部署TC服务1&#xff09;下载安装包2&#xff09;解压3&#xff09;修改配置文件4&#xff09;在Nacos中添加TC服务配置5&#xff09;创建数据库表6&#xff09;启动TC服务7&#xff09;查看TC服务 2.3 微服务集成Seata2.3.1 引入依赖2…

通过覆写 url_for 将 flask 应用部署到子目录下

0. 缘起 最近用 flask 写了一个 web 应用&#xff0c;需要部署到服务器上。而服务器主域名已经被使用了&#xff0c;只能给主域名加个子目录进行部署&#xff0c;比如主域名 example.org &#xff0c;我需要在 example.org/flask 下部署。这时 flask 应用里的内部连接们就出现…

sqli-labs Basic Challenge Less_1 通关指南

sqli-labs Basic Challenge Less_1 通关指南 测试注入点测试注入点的数据类型测试过程&#xff1a; 测试返回点&#xff1a;测试列数&#xff1a;测试返回点&#xff1a; 收集数据&#xff1a;版本用户权限库名表名与列名 查找敏感信息 测试注入点 在进行SQL注入之前&#xff…

React js Router 路由 2, (把写过的几个 app 组合起来)

完整的项目&#xff0c;我已经上传了&#xff0c;资源链接. 起因&#xff0c; 目的: 每次都是新建一个 react 项目&#xff0c;有点繁琐。 刚刚学了路由&#xff0c;不如写一个 大一点的 app &#xff0c;把前面写过的几个 app, 都包含进去。 这部分感觉就像是&#xff0c; …

打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程

打包后端‘ 1&#xff0c;打开若依&#xff0c;点击右侧的Maven展开Maven管理&#xff0c;选择ruoyi>Lifecycle 先双击clean清除原本启动项目时生成的文件。然后点击package等待项目打包&#xff0c;切记要取消运行再打包 打包完成后会在ruoyi-admin>src>target里面…

Qt 边框border - qss样式

border属性 实际上&#xff0c;border并不是一个单独的属性&#xff0c;在Qt样式表中&#xff0c;它通常指的是一系列与边框相关的属性的组合。然而&#xff0c;你也可以在一条样式规则中一次性设置所有这些值&#xff0c;如下所示&#xff1a; QPushButton { border: 2px sol…

HTB-Unified(log4j2漏洞、MongoDb替换管理员密码)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Unified靶机 渗透过程 信息搜集 服务器开放了SSH服务&#xff0c;HTTP服务 访问网站 验证log4j2漏洞 8443端口&#xff1a;UniFi 网络 &#xff0c;访问查询 是否有Nday漏洞利用 可以观察到UniFi的版…

汇编实现从1加到1000(《X86汇编语言 从实模式到保护模式(第2版》) 第135页第2题解答)

题目: 编写一段主引导扇区程序,计算从1加到1000的和,并在屏幕上显示结果 输出结果: 代码: jmp near start text db 123...1000 start:mov ax,0x07c0mov ds,ax ;数据段从主引导区开始mov ax,0xb800mov es,ax ;显存地址从B8000物理地址开始mov si,text ;si指向text的第…

linux系统安装miniconda3

一、下载minconda3 下载地址&#xff1a;https://docs.conda.io/en/latest/miniconda.html 一般国内访问比较困难&#xff0c;可到清华软件镜像站 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 需要特别注意自己的下载版本和自己的…

苹果CMS海洋CMS那个更容易被百度收录?苹果CMS站群

SEO优化和搜索引擎的友好性常常是网站管理员关注的重点。苹果CMS&#xff08;maccmscn&#xff09;和海洋CMS都是国内常见的CMS平台&#xff0c;但在搜索引擎优化&#xff08;SEO&#xff09;和百度收录方面&#xff0c;苹果CMS凭借其优秀的插件生态系统&#xff0c;特别是泛目…

Java 类一口气给你讲完!(✿◡‿◡)

Java 类实例 Java面向对象设计 - Java类实例 以下是创建类的实例的一般语法: new <Class Constructor>;new 运算符后面是对构造函数的调用。 new 运算符通过分配堆上的内存来创建类的实例。以下语句创建Dog类的实例: new Dog();Dog()是对Dog类的构造函数的调用。 当…