【youcans 的 OpenCV 学习课】21. Haar 小波变换与 Haar 特征检测(上)

news2024/11/17 13:18:42

专栏地址:『youcans 的图像处理学习课』
文章目录:『youcans 的图像处理学习课 - 总目录』


【youcans 的 OpenCV 学习课】21. Haar 小波变换与 Haar 特征检测(上)

    • 1. 小波变换
      • 1.1 小波变换基本概念
        • 例程 17_1:常用小波族的图像
      • 1.2 连续小波变换
      • 1.3 离散小波变换(Discrete wavelet transform, DWT)
      • 1.4 二维离散小波变换
        • 例程 17_3:图像的小波变换
    • 2. Haar 小波变换
      • 2.1 Haar 小波变换的基本概念
        • 例程 17_4:一维信号的 Haar 小波分解
        • 例程 17_5:图像的 Haar 小波分解
      • 2.2 小波变换在图像处理中的应用


1. 小波变换

1.1 小波变换基本概念

信号变换是为了分析时间和频率之间的相互关系。

傅里叶变换(FFT)将信号表示为无限三角函数的叠加,从而将信号从时域转换到频域,可以分析信号的频谱,但不能反映信号的时频特征,丢失了局部信息。

短时傅里叶变换(STFT)通过引入时间窗获得信号的时频谱图,但窗口尺寸是固定的,不能兼顾频域信息与时域信息,即不能同时对高频和低频进行精确分析。

小波变换以尺度函数(scaling)和小波函数(wavelet function)作为基函数进行信号分解。缩放母小波的宽度获得信号的频域特征,通过平移母小波获得信号的时间信息。

小波函数是定义在有限间隔且均值为0的一种函数。使用有限长的衰减的小波基, 既包含了频率的信息,也包含了时间的信息 。小波函数的尺度对应于频率,控制小波函数的伸缩,平移量对应于时间,控制小波函数的平移。

小波族类的产生只需要满足两个条件:归一化约束和正交化约束。因此小波有很多族类, 每个小波族在小波的紧凑性和平滑性做出了不同的权衡,对应着不同的形状、光滑度和紧密型,应用于不同的场景和状况。


例程 17_1:常用小波族的图像

import pywt
print(pywt.families(short=False))

# 显示的结果
['Haar', 'Daubechies', 'Symlets', 'Coiflets', 'Biorthogonal', 'Reverse biorthogonal', 
'Discrete Meyer (FIR Approximation)', 'Gaussian', 'Mexican hat wavelet', 'Morlet wavelet', 
'Complex Gaussian wavelets', 'Shannon wavelets', 'Frequency B-Spline wavelets', 'Complex Morlet wavelets']

运行结果:

[‘Haar’, ‘Daubechies’, ‘Symlets’, ‘Coiflets’, ‘Biorthogonal’, ‘Reverse biorthogonal’, ‘Discrete Meyer (FIR Approximation)’, ‘Gaussian’, ‘Mexican hat wavelet’, ‘Morlet wavelet’, ‘Complex Gaussian wavelets’, ‘Shannon wavelets’, ‘Frequency B-Spline wavelets’, ‘Complex Morlet wavelets’]

在这里插入图片描述


1.2 连续小波变换

傅里叶变换将信号 f ( t ) f(t) f(t)分解为一系列不同频率的正弦信号的叠加,傅里叶系数对应于不同正弦信号的幅值。小波变换将信号 f ( t ) f(t) f(t)分解为一系列小波信号的叠加,产生一系列小波信号的基本小波可以根据需要来选择或设计。

连续小波变换为:
γ ( s , τ ) = ∫ f ( t ) Ψ s , τ ∗ ( t ) d t \gamma (s,\tau) = \int f(t) \Psi ^* _{s,\tau} (t) dt γ(s,τ)=f(t)Ψs,τ(t)dt
连续小波变换的逆变换为:
f ( t ) = ∫ ∫ γ ( s , τ ) Ψ s , τ ( t ) d s d t f(t) = \int \int \gamma (s,\tau) \Psi _{s,\tau} (t) dsdt f(t)=∫∫γ(s,τ)Ψs,τ(t)dsdt
其中,* 表示复共轭, Ψ s , τ ( t ) \Psi _{s,\tau} (t) Ψs,τ(t)为小波基函数(basic wavelet)。

不同小波基函数,都是由同一个基本小波(母小波) Ψ ( t ) \Psi (t) Ψ(t) 经过缩放和平移产生。
Ψ s , τ ( t ) = 1 s Ψ ( t − τ s ) \Psi _{s,\tau} (t) = \frac{1}{\sqrt {s}} \Psi (\frac {t-\tau}{s}) Ψs,τ(t)=s 1Ψ(stτ)
离散小波变换,通过二进小波变换(缩放因子取为2)把由基本小波生成小波基函数的方法表示为:
Ψ j , k ( x ) = 2 j / 2 ∗ Ψ ( 2 j x − k ) , k = 0 , . . . 2 j − 1 \Psi_{j,k}(x) = 2^{j/2} * \Psi(2^j x-k) , \quad k=0,...2^j-1 Ψj,k(x)=2j/2Ψ(2jxk),k=0,...2j1
其中j决定缩放系数,k决定平移幅度。

在图像处理中,离散小波变换将图像分解为大小、位置和方向都不同的分量。对图像进行小波分解后,可以得到一系列不同分辨率的子图像,构造出图像金字塔。

小波变换中,缩放因子scale越小,表示小波越窄,对应的信号频率越高,反映的是信号的细节变化;缩放因子越大,表示小波越宽,对应的信号频率越低,反映的是信号的轮廓变化。


1.3 离散小波变换(Discrete wavelet transform, DWT)

双通道子带编码通过两个互补的滤波器组:

  • 低通滤波器,得到信号的近似值A,相当于小波伸展,获得当前信号的低频特征,反映轮廓特征;
  • 高通滤波器,得到信号的细节值D,相当于小波伸缩,获得当前信号的高频特征,反映细节特征。

实际应用中,信号的低频特征最重要,高频分量只起细化修饰的作用。

小波变换可以表示为由低通滤波器和高通滤波器组成的一棵树。原始信号经过一对互补的滤波器组进行的分解称为一级分解,继续下去可以进行多级分解。

如果对信号的高频分量不再分解,而对低频分量进行连续分解,可以得到信号在不同分辨率下的低频分量。

在这里插入图片描述


1.4 二维离散小波变换

图像是典型的二维离散信号。将一维离散小波变换开展到二维函数,就能实现图像的二维离散小波变换。

在二维情况下,每个二维小波都是两个一维小波的积,产生 4 个可分离的尺度函数:
φ ( x , y ) = φ ( x ) φ ( y ) Ψ H ( x , y ) = Ψ ( x ) φ ( y ) Ψ V ( x , y ) = φ ( x ) Ψ ( y ) Ψ D ( x , y ) = Ψ ( x ) Ψ ( y ) \varphi (x,y) = \varphi (x) \varphi (y)\\ \varPsi ^H(x,y) = \varPsi (x) \varphi (y)\\ \varPsi ^V(x,y) = \varphi (x) \varPsi (y) \\ \varPsi ^D(x,y) = \varPsi (x) \varPsi (y) φ(x,y)=φ(x)φ(y)ΨH(x,y)=Ψ(x)φ(y)ΨV(x,y)=φ(x)Ψ(y)ΨD(x,y)=Ψ(x)Ψ(y)
这些小波度量图像中灰度沿不同方向的变化:

  • Ψ H ( x , y ) \varPsi ^H(x,y) ΨH(x,y) 响应列的变化(水平边缘)。
  • Ψ V ( x , y ) \varPsi ^V(x,y) ΨV(x,y) 响应行的变化(垂直边缘)。
  • Ψ D ( x , y ) \varPsi ^D(x,y) ΨD(x,y) 响应对角线的变化。

在这里插入图片描述


例程 17_3:图像的小波变换

import numpy as np
import pywt
import cv2
import matplotlib.pyplot as plt

if __name__ == '__main__':
    # (3) 图像的二维小波变换
    img = cv.imread("../images/Fig0515a.tif", flags=0)
    img = cv.resize(img, (512, 512)).astype(np.float32)

    coeffs = pywt.dwt2(img, 'haar')
    cA, (cH, cV, cD) = coeffs  # 低频分量,(水平高频,垂直高频,对角线高频)

    # 拼接子图
    AH = np.concatenate([cA, cH], axis=1)
    VD = np.concatenate([cV, cD], axis=1)
    dwt1 = np.concatenate([AH, VD], axis=0)
    print(img.shape, dwt1.shape)

    # 显示为灰度图
    plt.imshow(dwt1, 'gray')
    plt.title('DWT'), plt.xticks([]), plt.yticks([])
    plt.show()

在这里插入图片描述


2. Haar 小波变换

2.1 Haar 小波变换的基本概念

Haar 变换又称 Haar 小波变换,由 Alfred Haar于1910年提出,是最早提出的正交小波,也是唯一既具有对称性又是有限支撑的正交小波。

Haar 小波函数是最简单的基函数,是一组分段的常值函数组成的函数集合。这个函数集定义在半开区间[0,1)上,每个分段常值函数的数值在一个小范围为 1 而在其它区域为 0。

Haar小波的母小波(mother wavelet)表示为:

Ψ ( x ) = { 1 , 0 ≤ x < 1 / 2 − 1 , 1 / 2 ≤ x < 1 0 , o t h e r w i s e \Psi(x) = \begin{cases} \begin{aligned} 1 , \quad &0 \le x \lt 1/2\\ -1 , \quad &1/2 \le x \lt 1\\ 0 , \quad & otherwise \end{aligned} \end{cases} Ψ(x)= 1,1,0,0x<1/21/2x<1otherwise

对应的尺度函数(scaling function)表示为:

ϕ ( x ) = { 1 , 0 ≤ t < 1 0 , o t h e r w i s e \phi(x) = \begin{cases} \begin{aligned} 1 , \quad &0 \le t \lt 1\\ 0 , \quad & otherwise \end{aligned} \end{cases} ϕ(x)={1,0,0t<1otherwise

其滤波器 h[n]定义为:

h [ n ] = { 1 / 2 , n = 0 , 1 0 , o t h e r w i s e h[n] = \begin{cases} \begin{aligned} 1 / \sqrt{2} , \quad & n=0,1\\ 0 , \quad & otherwise \end{aligned} \end{cases} h[n]={1/2 ,0,n=0,1otherwise

因此,

Ψ ( t / 2 ) = 2 ∑ n = − ∞ ∞ ( − 1 ) 1 − n ∗ h [ 1 − n ] ∗ ϕ ( t − n ) = ϕ ( t − 1 ) − ϕ ( t ) \begin{aligned} \Psi (t/2) &= \sqrt{2} \sum _{n=-\infty} ^{\infty} (-1)^{1-n}*h[1-n]*\phi (t-n)\\ &= \phi (t-1) - \phi (t) \end{aligned} Ψ(t/2)=2 n=(1)1nh[1n]ϕ(tn)=ϕ(t1)ϕ(t)

即:

Ψ i j ( x ) = Ψ ( 2 j ∗ x − i ) , i = 0 , . . . ( 2 j − 1 ) \Psi_i^j(x) = \Psi(2^j*x-i) , i=0,...(2^j-1)\\ Ψij(x)=Ψ(2jxi),i=0,...(2j1)

Ψ ( x ) = ϕ ( 2 x ) − ϕ ( 2 x − 1 ) \Psi(x) = \phi(2x) - \phi(2x-1) Ψ(x)=ϕ(2x)ϕ(2x1)

Haar 基函数可以获取信号的尺度信息,而 Haar 小波函数可以表示信号的细节信息。
Haar 小波具有如下特点:
(1)Haar 小波在时域是紧支撑的,即其非零区间为 [0,1)
(2)Haar 小波属于正交小波。
(3)Haar 小波是对称的。
(4)Haar 小波仅取 +1 和 -1,计算简单。
(5)Haar 小波是不连续小波,在实际的信号分析与处理中受到了限制。


例程 17_4:一维信号的 Haar 小波分解

对一维 Chirp 信号进行 Haar 小波变换的例程和结果如下。

import numpy as np
import pywt
import cv2
import matplotlib.pyplot as plt

if __name__ == '__main__':
   # (4) Chirp 信号的 Haar 小波分解
    x = np.linspace(0, 1, num=2048)
    chirp_signal = np.sin(250 * np.pi * x ** 2)

    fig, ax = plt.subplots(figsize=(8, 2))
    ax.set_title("Original Chirp Signal")
    ax.plot(chirp_signal)
    plt.show()

    data = chirp_signal
    waveletname = 'haar'

    fig, axarr = plt.subplots(nrows=5, ncols=2, figsize=(8, 6))
    for ii in range(5):
        (data, coeff_d) = pywt.dwt(data, waveletname)
        axarr[ii, 0].plot(data, 'r')
        axarr[ii, 1].plot(coeff_d, 'g')
        axarr[ii, 0].set_ylabel("Level {}".format(ii + 1), fontsize=14, rotation=90)
        axarr[ii, 0].set_yticklabels([])
        if ii == 0:
            axarr[ii, 0].set_title("Approximation coefficients", fontsize=14)
            axarr[ii, 1].set_title("Detail coefficients", fontsize=14)
        axarr[ii, 1].set_yticklabels([])
    plt.tight_layout()
    plt.show()

在这里插入图片描述


例程 17_5:图像的 Haar 小波分解

对二维图像进行 Haar 小波变换的例程和结果如下。

import numpy as np
import pywt
import cv2
import matplotlib.pyplot as plt
from pywt._doc_utils import wavedec2_keys, draw_2d_wp_basis

if __name__ == '__main__':
# (5) 图像的 Haar 小波分解
    x = pywt.data.camera().astype(np.float32)
    shape = x.shape
    max_lev = 3  # 要绘制多少级分解
    label_levels = 3  # 图上要显式标注多少层

    fig, axes = plt.subplots(2, 4, figsize=[14, 8])
    for level in range(0, max_lev + 1):
        if level == 0:
            # 显示原始图像
            axes[0, 0].set_axis_off()
            axes[1, 0].imshow(x, cmap=plt.cm.gray)
            axes[1, 0].set_title('Image')
            axes[1, 0].set_axis_off()
            continue

        # 绘制标准DWT基的子带边界
        draw_2d_wp_basis(shape, wavedec2_keys(level), ax=axes[0, level], label_levels=label_levels)
        axes[0, level].set_title('{} level\ndecomposition'.format(level))

        # 计算二维 DWT
        c = pywt.wavedec2(x, 'haar', mode='periodization', level=level)

        # 独立规范化每个系数数组以获得更好的可见性
        c[0] /= np.abs(c[0]).max()
        for detail_level in range(level):
            c[detail_level + 1] = [d / np.abs(d).max() for d in c[detail_level + 1]]

        # 显示归一化系数 (normalized coefficients)
        arr, slices = pywt.coeffs_to_array(c)
        axes[1, level].imshow(arr, cmap=plt.cm.gray)
        axes[1, level].set_title('Coefficients\n({} level)'.format(level))
        axes[1, level].set_axis_off()
    plt.tight_layout()
    plt.show()

在这里插入图片描述


2.2 小波变换在图像处理中的应用

小波变换在图像处理中的应用与傅里叶变换类似,基本方法是:
(1)计算一幅图像的二维小波变换,并得到小波系数
(2)对小波系数进行修改,保留有效成分,过滤不必要成分
(3)使用修改后的小波系数进行图像重建

基于小波变换的图像去噪步骤:
(1)图像小波变换。选择一个小波,计算噪声图像的小波系数。
(2)对细节系数通过阈值进行过滤。选择一个细节系数阈值,并对所有细节系数进行阈值化操作。
(3)基于阈值化过滤后的细节系数及原始近似系数,使用小波变换对图像进行重建。


版权声明:

youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/130320033)
Copyright 2022 youcans, XUPT
欢迎关注 『youcans 的 OpenCV 学习课』 系列,持续更新

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

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

相关文章

学会这几个Word技巧,让你办公省时又省力(一)

如果在学习&#xff0c;或者工作上&#xff0c;你经常需要用到Word文档&#xff0c;那下面这几个Word技巧一定要学习收藏&#xff0c;提升工作效率不是一点点。 ​1. 快速定位对象 有时候文档的内容很长&#xff0c;涉及很多表格、图片、图表&#xff0c;想要检查一下所有的图…

linux从入门到精通 第一章centos7里tomcat,jdk,httpd,mysql57,mysql80的安装

配置centos运行环境 一 安装httpd,tomcat,jdk,mysql1 安装httpd2 安装tomcat3 安装jdk 三 MySql的安装1 克隆出来两台虚拟机2 配置虚拟机3 链接xhsell4 链接xftp5 mysql8的安装6 mysql5.7的安装 一 安装httpd,tomcat,jdk,mysql 1 安装httpd 下载httpd yum -y install httpd关…

微信小程序php+vue校园达达互助平台快递代取系统

校园快递互助平台所要实现的功能分析&#xff0c;对于现在网络方便&#xff0c;校园快递互助平台要实现管理员、学生、兼职者可以直接在平台上进行查看自己所需数据信息&#xff0c;这样既能节省管理的时间&#xff0c;不用再像传统的方式&#xff0c;如果用户想要进行交流信息…

精读《利用 GPT 解读 PDF》

hatPDF 最近比较火&#xff0c;上传 PDF 文件后&#xff0c;即可通过问答的方式让他帮你总结内容&#xff0c;比如让它帮你概括核心观点、询问问题&#xff0c;或者做观点判断。 背后用到了几个比较时髦的技术&#xff0c;还好有 ChatGPT for YOUR OWN PDF files with LangCha…

【Java实战篇】Day11.在线教育网课平台--RBAC

文章目录 一、用户授权1、RBAC2、资源服务授权流程3、授权相关的数据模型4、查询用户权限5、细粒度授权 二、找回密码与注册1、找回密码2、注册 三、需求&#xff1a;学生选课1、添加选课需求分析2、数据模型设计2、查询课程信息接口3、添加选课接口4、完善controller 一、用户…

每日一个小技巧:1招教你手机消除笔怎么用

在日常生活中&#xff0c;我们经常需要在手机上进行编辑和涂改&#xff0c;但是由于各种原因&#xff0c;我们可能会做出错误或者不满意的修改。这时候&#xff0c;消除笔就派上用场了。消除笔可以帮助我们在不影响其他内容的前提下&#xff0c;对错误或者不满意的修改进行撤销…

java实现大气无风环境污染物扩散模拟

一、扩散公式整理 二、编写java代码实现 String strJson InterpolationUtils.calGaussPlumePoints0(z,height,q,lon,lat, size,scale,airStable); return strJson.replaceAll("NaN","0").replaceAll("Infinity",String.valueOf(q)); String st…

【机器学习】P23 决策树、熵和信息增益

决策树、熵与信息增益 决策树熵信息增益Python 与 决策树 决策树 决策树&#xff08;Decision Tree&#xff09; 是一种基于树形结构的分类算法&#xff0c;它通过一系列的询问&#xff08;也称为测试或判定条件&#xff09;来判断一个数据实例属于哪个类别。 以一个案例贯穿…

Go | 一分钟掌握Go | 2 - 集成开发工具

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 工具介绍 编码是一门传统手艺活&#xff0c;手艺好不好很重要&#xff0c;器…

高精度气象模拟软件WRF实践技术

【原文链接】&#xff1a;高精度气象模拟软件WRF(Weather Research Forecasting)实践技术及案例应用https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247538149&idx3&sn3890c3b29f34bcb07678a9dd4b9947b2&chksmfe68938fc91f1a99bbced2113b09cad822711e7f…

开发者必读!常用的二维码生成器 API 推荐

引言 二维码是一种能够存储信息的图形码&#xff0c;它在现代社会中扮演着越来越重要的角色。生成二维码的过程通常需要使用二维码生成器&#xff0c;而现在有很多二维码生成器 API 可以供开发者使用。 在本文中&#xff0c;我们将讨论二维码生成器 API 的工作原理、应用场景…

CHAPTER 6: 《DESIGN A KEY-VALUE STORE》 第6章 《设计一个键值存储》

CHAPTER 6: DESIGN A KEY-VALUE STORE 键值存储(也称为键值数据库)是一种非关系数据库。每一个唯一标识符存储为与其关联值的键。这种数据配对称为“键-值”对。 在一个键-值对中&#xff0c;键必须是唯一的&#xff0c;与该键相关联的值可以是通过密钥访问。键可以是纯文本或…

编译原理个人作业--第五章——基于 编译原理 国防工业出版社 第三版

1 文法 G 1 G_1 G1​为 E → E T ∣ T T → T ∗ F ∣ F F → ( E ) ∣ i E\rightarrow ET|T\\ T\rightarrow T*F|F\\ F\rightarrow(E)|i E→ET∣TT→T∗F∣FF→(E)∣i 请证明 E T ∗ F ET*F ET∗F是他的一个句型(课本写的是ET*T感觉是印错了)&#xff0c;指出它的所有短语…

这份最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,你看过没?

互联网大厂新入职员工各职级薪资对应表(技术线)~ 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比 上面的表格不排除有很极端的收入情况&#xff0c;但至少能囊括一部分同职级的收入。这个表是“技术线”新入职员工的职级和薪资情况&#xff0c;非技术线(如产品、运营、…

pbootcms自动配图出图插件

pbootcms文章无图自动出图配图插件的优点 1、提高文章的可读性和吸引力&#xff1a;插入图片可以丰富文章的内容和形式&#xff0c;增强读者的阅读体验和吸引力&#xff0c;提高文章的点击率和转化率。 2、节省时间和精力&#xff1a;手动添加图片需要花费大量时间和精力去寻找…

【LeetCode: 1416. 恢复数组 | 暴力递归=>记忆化搜索=>动态规划 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【花雕学AI】超级提问模型大全!150个ChatGPT神奇示例,让你的聊天更有趣!

引言 你是否想要成为聊天高手&#xff0c;让你的对话更加有趣和深入&#xff1f;你是否想要掌握一些超级提问模型&#xff0c;让你的聊天更加有创意和挑战&#xff1f;你是否想要借助人工智能的力量&#xff0c;生成一些适合你的超级提问模型&#xff1f; 如果你的答案是肯定…

浅谈新能源电动汽与汽车传感器充电桩的影响

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;随着我国能源战略发展以及低碳行动的实施&#xff0c;电动汽车已逐步广泛应用&#xff0c;而电动汽车的应用非常符合当今社会对环保意识的要求&#xff0c;以及有效节省化石燃料的消耗。由于其无污染…

Flutter+YesAPI 快速构建零运维的APP

前言 移动互联网经过多年的发展&#xff0c;已经进入一个成熟的阶段&#xff0c;几乎每个公司都有自己的移动应用程序或移动网站。随着5G技术的不断发展&#xff0c;也带来了更高效的数据传输速度和更稳定的网络连接&#xff0c;这使得更多的应用程序和服务能够在互联网上运行&…

NFT介绍及监管规则

什么是NFT NFT是Non-Fungible Token&#xff08;非同质化代币&#xff09;的缩写。 NFT是“Non-Fungible Token”的缩写&#xff0c;即非同质化代币。不同于FT&#xff08;Fungible Token&#xff0c;同质化代币&#xff09;&#xff0c;每一个NFT都是独一无二且不可相互替代的…