python的opencv操作记录(八)——小波变换

news2025/7/18 9:37:19

文章目录

  • 什么是小波
    • 从一个例子入手
    • 把例子再深化一下
    • 各种个样的小波基
      • 哈尔小波
      • 其他小波
  • 小波分解
  • 图像(二维)小波变换

什么是小波

上一篇里提到了stft,短时傅里叶变换,是针对不稳定信号进行加窗来做每一个小窗口的频谱分析。然后一个一个的时间窗就可以理解为时域。
在stft中,窗口的大小是固定的,太大无法分辨,太小又无法获得足够的信息(一个极端的例子就是一个窗口中只有一个信号采样点,那么就根本没有频率的概念了)
一种新的信号分析的方式就是小波变换,也有叫小波分解的,接下来久来讲一讲这个小波变换。

从一个例子入手

假设我们有一个恒定的信号,总共8个信号采样点:
signal = [1, 3, 5, 7, 9, 11, 13, 15]
如果要对这个信号中的信号点进行分析的话,可以采用下面一种分析方式:

  • 计算每两个信号的平均值,那么这个信号就可以变成:[(1+3)/2=2, (5+7)/2=6, (9+11)/2=10, (13+15)/2=14],总共4个平均值。这样可以从某种程度上可以描述原信号的一些特征,这就可以称作是一种转换或者说分解,但是如果只有这样一种转换,转换后是无法恢复到原信号的,那么就还需要一点别的信息。
  • 在上面的基础上,我们再计算每两个信号点之间的差,再除以二。经过这样的一个变换,我们又可以得到一组变换后的信号值:[(1-3)/2=-1, (5-7)/2=-1, (9-11)/2=-1, (13-15)/2=-1]

得到上面两组变换后,就可以将一个原始信号做一个变换或者说一种分解,而且还可以从这种变换逆变换回去。

把例子再深化一下

看一下小波变换的一般公式:公式一
α = W T f \alpha = W^Tf α=WTf
其中

  • α \alpha α就是转换后的小波系数,分成尺度系数和细节系数,后面会具体提到这两个东西。
  • f f f为原信号的函数
  • W T W^T WT为转换矩阵

接着上面的例子,我们可以这么去理解:
α \alpha α就是由平均值和相减除2的值组成的向量:[2,6,10,14,-1,-1,-1,-1],那么,小波变换的一般公式就可以写成:
[ 2 6 10 14 − 1 − 1 − 1 − 1 ] = [ ] [ 1 3 5 7 9 11 13 15 ] \begin{bmatrix} 2 \\ 6 \\ 10 \\ 14 \\ -1 \\ -1 \\ -1 \\ -1 \end{bmatrix} = \begin{bmatrix} \\ \\ \\ \\ \\ \\ \\ \end{bmatrix} \begin{bmatrix} 1 \\ 3 \\ 5 \\ 7 \\ 9 \\ 11 \\ 13 \\ 15 \end{bmatrix} 2610141111 = 13579111315

中间空出来的部分就是我们需要去找到小波变换矩阵。
通过数据计算可以得到下面这样一个矩阵:
在这里插入图片描述

然后,他的逆变换的矩阵就是:
在这里插入图片描述

对于这个矩阵,有一个约束是要满足数学上的“规范正交化”,这个不是我这篇文章需要关心的内容,有兴趣的朋友可以自行去了解。

各种个样的小波基

回到小波函数的话题上来,如上面的公式一所列的,小波基可以理解为一个一个的这样的变换矩阵,可以把一个原始信号变换成另外一个向量,这个向量可以分成两个部分:

  • 尺度部分(注意不是上面的求平均值,上面只是举个例子),好像也可以称之为高频部分
  • 细节部分(注意也不是上面的两个数相减除二,同样上面只是举个例子),也可以称之为低频部分

哈尔小波

哈尔小波是最简单的一个小波基(变换形式),haar小波的变换矩阵如下:
在这里插入图片描述

我们使用python的一个小波变换库来验证一下这个过程:

import pywt

def demowavelets():
    x = [1, 1, 1, 1, 1, 1, 1, 1]

    dwt_haar = pywt.dwt(x, wavelet=pywt.Wavelet('haar'))
    print(dwt_haar)


if __name__ == '__main__':
    demowavelets()

dwt是表示用的离散小波变换,还有一个是连续小波变换,这个后面再详细说,先了解一下。
看一下输出是:
(array([1.41421356, 1.41421356, 1.41421356, 1.41421356]), array([0., 0., 0., 0.]))

这里是两个数组,分别是上面的尺度部分和细节部分。
当然恰好哈尔小波变换和我们的例子很类似:

  • 尺度部分是两个数字相加再取根号,所以四个1.414
  • 细节部分和例子中的结果碰巧是一样的,是四个0,换成别的就不一样了

有兴趣的朋友自己用矩阵计算的方式来计算一下。

这里有个问题是,如果不够变换的长度或者不满足要求的话,就会有一个补齐的动作,可以参考pywt官网的说明:
https://pywavelets.readthedocs.io/en/latest/ref/signal-extension-modes.html?highlight=padding#padding-using-pywavelets-signal-extension-modes-pad

默认是constant:
也就是根据最前或者最后的一个采样数据补充常量:
… x1 x1 | x1 x2 … xn | xn xn …

其他小波

还有很多的小波种类,文章里就不一一列举了,我自己也没接触过几种,从网上搬了一个列表过来(侵删),有兴趣的朋友自行深入了解吧
在这里插入图片描述

也可以通过
print(pywt.families())
来输出pywt这个库支持哪些小波变换。

小波分解

小波分解的概念就是对其中一个部分进行不同层级的小波变换,一般来说是尺度部分。
可以理解上面提到的过程是就是第一层分解,对尺度部分再做一次小波变换,就可以叫做第二层,当然我们不需要自己去写循环进行分解,可以使用一个函数:
pywt.wavedec

dwt_one = pywt.wavedec(x, wavelet=pywt.Wavelet('haar'), level=2)

print(dwt_one)

输出就会变为:
[array([2., 2.]), array([0., 0.]), array([0., 0., 0., 0.])]
相当于对尺度部分做了两次变换,或者说分解。

当缩小到一个值的时候就不能再分解了,也就是这个信号的level最多只能是3

图像(二维)小波变换

图像是一个二维数据,我们对图像的行和列都做一下小波变换,就是2D小波变换了,这里存在一个顺序的问题,是先对行做还是先对列做的问题。

  • 先把行分解到最精细,然后再分解列的方法叫做 standard decomposition
  • 而行列交替分解的方法叫做 non-standard decomposition。

在pywt库中也提供了一个二维dwt的函数:
dwt2,这个函数的输出结果是
在这里插入图片描述

从物理含义上理解,第一象限从行的角度上来理解,是高频部分的数据,从列上来理解,也是高频部分的数据,所以是整张图像的高频部分。
然后,对于图像来说,高频一般出现在物体的边缘部分,想想看,只有像素值发生了较大的改变,这个东西才叫边缘。所以小波变换是提取物体边缘的一个很有用的工具。

一段demo,一般来说,变换后的图像是要做一些转换的,因为dwt之后的数字就不一定在0-255之间了。

img1 = np.zeros((100, 100, 3), dtype="uint8")
cv2.rectangle(img1, (60, 20), (70, 70), (255, 255, 255), 5)
cv2.rectangle(img1, (80, 20), (90, 70), (255, 255, 255), 5)
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

result = pywt.dwt2(img1, wavelet=pywt.Wavelet('haar'), mode='constant')

cv2.imshow("origin", img1)
img_dwt = result[0]

cv2.imshow("dwt", img_dwt)

cv2.waitKey(0)

cv2.destroyAllWindows()

实际上,每个象限都有其含义:
在这里插入图片描述

  • 第一象限的A表示一个“近似矩阵”
  • 第二象限的V表示一个“垂直细节”
  • 第三象限的H表示一个“水平细节”
  • 第四象限的D表示一个“对角细节”

可以针对不同的需求取不同的数据进行处理和过滤,形成对特有图像的滤波器。

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

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

相关文章

STM32F103 UART4串口使用DMA接收不定长数据和DMA中断发送

一、前言 使用DMA通信的好处是,不占用单片机资源(不像普通串口中断,发送一个字节触发一次中断,发送100个字节触发100次中断;接收一个字节触发一次中断,接收200个字节触发200次中断),…

第五章 栈的讲解与实现

初阶数据结构 第一章 时间复杂度和空间复杂度 第二章 动态顺序表的实现 第三章 单向链表的讲解与实现 第四章 带头双向链表的讲解与实现 第五章 栈的讲解与实现 文章目录初阶数据结构前言一、栈1、什么是栈?二、栈的定义三、接口函数的实现1、初始化2、判断是否为空…

前端js手写面试题看这篇就够了

实现一个JSON.stringify JSON.stringify(value[, replacer [, space]]):Boolean | Number| String类型会自动转换成对应的原始值。undefined、任意函数以及symbol,会被忽略(出现在非数组对象的属性值中时),或者被转换…

利用opencv 做一个疲劳检测系统(2)

文章目录杂谈实现步骤核心算法交互界面界面代码检测效果源代码杂谈 最近发现视力下降严重, 可能跟我的过度用眼有关,于是想着能不能做一个检测用眼疲劳的,灵感来自特斯拉的疲劳检测系统。 效果如下: 实现步骤 实现核心算法制作…

【消息队列笔记】chp2-如何选择消息队列

一、选择消息队列的基本标准 不同的消息队列产品在功能和特性方面是各有优劣的,但是我们在选择的时候应尽量保证一个通用的最低标准。 1.必须是开源的产品 开源很重要,如果在使用该产品时遇到了影响业务的bug,可以通过修改源代码来进行修复…

音视频开发基础概念

目录一、音视频如何采集和表示1、音视频录制原理2、音视频播放原理二、视频基础概念1、图像基础概念2、RGB、 YUV深入讲解3、RGB和YUV的转换4、YUV Stride对齐问题三、视频为什么要做编码四、音频基础概念1、基本概念2、声音的物理性质-频率-音频采样率3、数字声音的表示4、音频…

【数据结构】——顺序表

目录 1.线性表 2.顺序表 2.1概念及结构 3.静态顺序表 4.动态顺序表 1.定义一个顺序表 2.顺序表的初始化和销毁 3.顺序表尾插 4.顺序表打印 5.顺序表尾删 6.顺序表头插 7.顺序表头删 8.在pos(任意)位置的插入 9.在pos(任意&#…

[附源码]计算机毕业设计JAVAjsp美容院业务管理系统

[附源码]计算机毕业设计JAVAjsp美容院业务管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM m…

用DIV+CSS技术设计的体育篮球主题 校园体育网页与实现制作(web前端网页制作课作业)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

SpringBoot(二):基础配置文件、yaml语法、多环境开发配置

目录 一、配置文件 1、配置文件格式 2、自动提示功能失灵解决方案 3、SpringBoot配置文件加载顺序 二、yaml 1、yaml介绍 2、yaml语法规则 3、yaml数组数据 4、yaml数据读取 三、多环境开发配置 1、多环境启动配置 2、多环境启动命令格式 3、多环境开发控制 四、…

VS Code常用操作

文章目录常用快捷键修改VS Code底部状态栏颜色VS Code添加Anaconda的Python源常用快捷键 (1) 对于 行 的操作: 重开一行:光标在行尾的话,回车即可;      不在行尾,Ctrl Enter 向下重开一行;    …

手拉手一起学HTML(下)——表格标签和列表标签,表单标签

🍓个人主页:bit.. 🍒系列专栏:Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 目录 一.表格标签 1.1表格的主要作用 1.2表格的基本语法 1.3表头单元格标签 1.4表格属性 1.5表格结构标签 1.6合并单元格&#xff08…

prometheus 监控

【00】结构原理微服务中的监控分根据作用领域分为三大类,Logging,Tracing,Metrics。* Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。比如我们说的ELK就是基于Logging。* Metrics -…

HTTP协议详解

1.HTTP协议介绍 先来给大家介绍以下HTTP: HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP 是一种…

【网络篇】如何搭建自己的DNS服务器

引言 平时练习域名解析,一般直接修改的/etc/hosts文件。对于服务器数量小的情况完全可以,但是如果服务器数量较多,每个都修改比较麻烦。 DNS是作为域名解析。在实际的生产过程中,尤其是对于内网搭建的情况,DNS不可能…

宝塔面板如何设置301重定向,为什么网站要设置重定向?

大家好,我是Q站小编鹏仔,本次给大家带来的教程是宝塔面板如何设置301重定向。 在设置之前,我们需先明白为什么要设置重定向呢? 在购买域名时,域名本身是不带有www的,由于在以前网站方都会增加一个"ww…

C#项目实战|人脸识别考勤

此文主要通过WinForm来制作的一个人脸识别考勤打卡程序,有兴趣的小伙伴可以接入到打卡机上。 一、实现流程1.1、创建项目1.2、设计页面1.3、创建应用1.4、获取Token及参数解析1.5、与人脸数据比对并展示一、实现流程 1.1、创建项目 打开Visual Studio,右…

HTML+CSS静态网页设计:(房地产网站设计与实现6页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

javascript事件处理二 事件对象event详解及target和currentTarget区别

在处理事件的时候,所有和事件相关的东西都封装到event这个对象里面。所以这个对象非常的重要。这个对象有非常多的内容,我们讨论几个计较常见和以及比较难区别的target和currentTarget。 常见属性 页面就是一个div,然后我们监听他的oclick事…

Python+大数据-Spark技术栈(三) SparkCore加强

Python大数据-Spark技术栈(三) SparkCore加强 重点:RDD的持久化和Checkpoint提高拓展知识:Spark内核调度全流程,Spark的Shuffle练习:热力图统计及电商基础指标统计combineByKey作为面试部分重点,可以作为扩展知识点 …