查看全课大纲(第 12 / 93 节)
  1. 1.计算机视觉概述
  2. 2.计算机视觉应用场景
  3. 3.困难与挑战
  4. 4.开源库介绍
  5. 5.图像显示与存储
  6. 6.CLAHE
  7. 7.腐蚀膨胀与开闭运算
  8. 8.滤波与边缘填充
  9. 9.各种滤波
  10. 10.图像金字塔
  11. 11.傅里叶变换
  12. 12.短时傅里叶变换与小波变换
  13. 13.颜色特征与颜色直方图
  14. 14.几何特征_边缘
  15. 15.几何特征-角点与斑点
  16. 16.局部特征-SIFT特征描述子
  17. 17.局部特征-SURF特征描述子
  18. 18.局部特征-ORB特征描述子
  19. 19.其他特征描述子
  20. 20.传统图像分割技术
  21. 21.GraphCut
  22. 22.GrabCut
  23. 23.人脸检测的传统方法
  24. 24.行人检测的传统方法HOG+SVM
  25. 25.行人检测DPM
  26. 26.人工神经网络的架构
  27. 27.目标函数与梯度下降
  28. 28.误差反向传播
  29. 29.可手算的神经网络
  30. 30.改进目标函数与克服梯度消散
  31. 31.神经网络之传统神经网络与深度网络的差异
  32. 32.各种梯度下降算法
  33. 33.如何选择合适的梯度下降算法
  34. 34.避免过适应
  35. 35.CNN的架构
  36. 36.CNN的误差反向传播_卷积层
  37. 37.CNN的误差反向传播_池化层
  38. 38.分类所用的数据集
  39. 39.Alexnet详解
  40. 40.VGG详解
  41. 41.GoogLeNet_v1
  42. 42.BatchNormalization
  43. 43.GoogLeNet_v3v4
  44. 44.ResNet
  45. 45.ResNeXt
  46. 46.CNN设计准则
  47. 47.图像检索与推土机距离
  48. 48.基于颜色相似性
  49. 49.基于形状相似性
  50. 50.基于纹理相似性
  51. 51.基于局部特征相似性
  52. 52.DL的二值哈希编码
  53. 53.高维空间中检索KDTree
  54. 54.高维空间中检索LSH
  55. 55.目标识别任务综述
  56. 56.RCNN
  57. 57.SPP-Net
  58. 58.Fast R-CNN
  59. 59.Faster R-CNN
  60. 60.R-CNN系列模型回顾
  61. 61.R-FCN的设计思路
  62. 62.R-FCN的实现
  63. 63.YOLOv1
  64. 64.YOLOv2_9000
  65. 65.YOLOv3
  66. 66.图像分割应用场景与数据集
  67. 67.上采样的实现方式
  68. 68.FCN网络架构的由来
  69. 69.FCN构建细节
  70. 70.DeepLabv1
  71. 71.CRF
  72. 72.DeepLabv2
  73. 73.DeepLabv3
  74. 74.特定的医学影像分割任务
  75. 75.U-Net
  76. 76.3D U-Net
  77. 77.V-Net
  78. 78.DenseNet
  79. 79.病理切片分析任务及数据集
  80. 80.病理切片分析
  81. 81.图说任务及其传统处理方法
  82. 82.深度语言模型与RNN
  83. 83.LSTM及其变种
  84. 84.NIC模型
  85. 85.SAT模型
  86. 86.图说的性能指标
  87. 87.判别模型与生成模型
  88. 88.KL散度与JS散度
  89. 89.VAE
  90. 90.GAN的基本原理
  91. 91.DCGAN与CGAN
  92. 92.Wasserstein GAN
  93. 93.SRGAN

短时傅里叶变换与小波变换

小象实战讲义 · 基于深度学习的计算机视觉

在上一节中,我们学习了傅里叶变换,它能够将信号从时域转换到频域,揭示信号的频率组成。然而,傅里叶变换有一个根本性的假设:信号是平稳的。但在现实世界,尤其是图像处理中,信号往往是非平稳的——其频率成分会随时间(或空间位置)变化。本节我们将探讨两种旨在克服这一局限性的方法:短时傅里叶变换和小波变换。理解它们,将为我们后续分析图像的局部纹理、进行高效的数据压缩等任务奠定基础。

💡 核心导读

  • 傅里叶变换的局限:假设信号平稳,无法定位频率成分发生的时间和空间位置,对非平稳信号处理困难。
  • 短时傅里叶变换(STFT):通过加窗,分段进行傅里叶变换,试图同时获取时域和频域信息,但面临窗口大小固定的两难选择。
  • 小波变换(Wavelet Transform):从根本上更换了基函数,使用有限长、会衰减的“小波”代替无限长的三角函数,实现了对信号时间和频率的联合定位,更适用于图像等非平稳信号的分析与压缩。

傅里叶变换的不足回顾

傅里叶变换的数学前提是信号平稳。这意味着信号的统计特性(如频率、幅度)不随时间改变。一个典型的平稳信号是持续播放的单一频率正弦波。

然而,实际信号大多是非平稳的。例如一段音乐,不同时刻有不同的音符(频率);一张图像,不同区域有不同的纹理(空间频率)。对于这类信号,傅里叶变换只能告诉我们信号中存在哪些频率成分,却无法告诉我们这些成分发生在什么时间或位置。

让我们通过一个思想实验来理解这个缺陷。假设有两个完全不同的信号:

  1. 信号A:由四个不同频率的平稳正弦波从头到尾叠加而成。
  2. 信号B:开始时是低频振动,随后频率逐渐升高,但整体也由类似的四种频率成分构成。

对这两个信号分别做傅里叶变换,得到的频谱图(幅度-频率图)可能非常相似,都显示出四个主要的频率峰值。仅从频谱图,我们根本无法区分原始信号是A还是B。傅里叶变换丢失了时间定位信息。

在图像中,这对应着:傅里叶变换能告诉我们图像中有哪些方向的条纹(频率),但无法告诉我们这些条纹具体出现在图像的左上角还是右下角。这对于需要定位的分析任务(如边缘检测、特征提取)是致命的。

此外,由于傅里叶变换使用无限长的正弦波和余弦波作为基函数去“拟合”任何信号,这导致对于自然界中大量存在的、具有局部突变(如边缘)和平滑区域混杂的信号(如图像),其频域表示会变得非常“散乱”——能量会散布在很宽的频率范围内。这不利于我们进行有效的数据压缩,因为很难区分哪些频率成分是关键的“主体”,哪些是为了凑出局部突变而引入的“细节”。

短时傅里叶变换:加窗的尝试

为了解决时间定位问题,一个直观的想法是:既然整体信号非平稳,那我们就把信号分成一小段一小段,并假设每一小段内的信号是近似平稳的。然后对每一小段分别进行傅里叶变换。这就是短时傅里叶变换,也称为加窗傅里叶变换。

它的核心操作是引入一个窗函数(例如一个矩形窗、汉宁窗等)。这个窗函数在时间轴上滑动,每次只让一小段信号通过,然后对这段加窗后的信号做傅里叶变换。最终,我们得到一个二维的时频分布图:一个维度是时间(或窗的位置),另一个维度是频率。

import numpy as np

# 模拟一个非平稳信号:前一段是低频,后一段是高频
sample_rate = 1000  # 采样率
t = np.linspace(0, 1, sample_rate, endpoint=False)
# 前0.5秒:5Hz低频;后0.5秒:50Hz高频
signal_stft = np.concatenate([
    np.sin(2 * np.pi * 5 * t[:500]),
    np.sin(2 * np.pi * 50 * t[500:])
])

# 为了演示,我们手动模拟一个简单的加窗分析思想(非标准STFT计算)
window_size = 100  # 窗宽
step = 50         # 滑动步长
num_windows = (len(signal_stft) - window_size) // step + 1

print(f"信号长度: {len(signal_stft)}")
print(f"窗大小: {window_size}, 滑动步长: {step}, 窗口数量: {num_windows}")
print("思想:每个窗口内的信号被近似视为平稳,可独立分析其频率成分。")
信号长度: 1000
窗大小: 100, 滑动步长: 50, 窗口数量: 19
思想:每个窗口内的信号被近似视为平稳,可独立分析其频率成分。

STFT 类似于音乐中的五线谱:五线谱记录了在不同时间片段内应该演奏什么频率的音符。STFT 的时频图也能告诉我们“在哪个时间段,信号主要包含哪些频率”。

然而,STFT 有一个根本性的缺陷:窗函数的大小(宽度)是固定的。这引发了一个不可调和的矛盾——时间分辨率与频率分辨率的权衡:

  • 窄窗口:时间定位准(时间分辨率高),但看到的信号周期数少,难以准确判断其频率(频率分辨率低)。极端情况下,窗口内可能看不到一个完整周期。
  • 宽窗口:能看到更多周期,频率判断准(频率分辨率高),但无法精确定位频率变化发生的具体时刻(时间分辨率低)。

对于非平稳信号,理想的状况是:对于高频成分(变化快),我们用窄窗口去捕捉其快速变化的时间点;对于低频成分(变化慢),我们用宽窗口来准确测量其频率。但 STFT 的固定窗口无法自适应地满足这一需求。这个矛盾在信号处理中类似于量子力学中的“海森堡不确定性原理”。

小波变换:更换基函数的革命

既然固定窗口的 STFT 无法完美解决时频定位问题,那么有没有更根本的解决方法呢?小波变换的提出正是基于这样的思考。它的核心革命在于:不再使用无限长的正弦波作为基函数,而是使用一种有限长的、会衰减的“小波”作为新的基函数。

小波(Wavelet)顾名思义,是一个“小的波浪”。它必须满足两个基本条件:

  1. 均值为0:波形在正负之间震荡,没有直流分量。
  2. 时域与频域都局部化:在时域上,它的能量集中在有限区间内,迅速衰减到零;相应地,在频域上,它也不是一个单频点,而是有一个主瓣(中心频率)的带通特性。

最著名和最简单的小波是 Haar 小波,它的形状像一个阶梯:在一段区间内取正值,在相邻区间内取等长的负值。

小波变换的公式与傅里叶变换形式相似,但内核不同: 傅里叶变换:F(ω)=∫−∞∞f(t)e−iωtdtF(\omega) = \int_{-\infty}^{\infty} f(t) e^{-i\omega t} dt 小波变换:W(a,b)=1∣a∣∫−∞∞f(t)ψ(t−ba)dtW(a, b) = \frac{1}{\sqrt{|a|}} \int_{-\infty}^{\infty} f(t) \psi(\frac{t-b}{a}) dt

这里,ψ(t)\psi(t) 就是小波函数(母小波)。它引入了两个关键参数:

  • 尺度参数 aa:控制小波的拉伸与压缩,对应于频率信息。aa 大,小波被拉伸,频率低;aa 小,小波被压缩,频率高。
  • 平移参数 bb:控制小波在时间轴上的位置,对应于时间定位信息。

通过缩放和平移,一个小波母函数可以生成一整套小波基函数。小波变换就是要将原始信号 f(t)f(t) 分解为这一系列不同尺度、不同位置的小波基的线性组合。

import numpy as np

# 构造一个包含突变的简单一维信号,模拟图像中一个边缘
signal_local = np.array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0], dtype=np.float32)

# 模拟一个类似Haar小波的边检测核 [-1, -1, 1, 1]
# 注意 np.convolve 会翻转核:上升沿响应为 -2,正响应标记下降沿
wavelet_kernel = np.array([-1, -1, 1, 1])

# 使用卷积来模拟在该核尺度下扫描信号(这是一个极其简化的示意,并非真正的小波变换)
# 它演示了“局部化”的核如何定位突变(边缘)的位置
response = np.convolve(signal_local, wavelet_kernel, mode='valid')
print("原始信号 (模拟边缘):", signal_local)
print("模拟小波核 (Haar-like):", wavelet_kernel)
print("卷积响应 (绝对值最大处对应边缘中心):", response)
原始信号 (模拟边缘): [0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 0. 0.]
模拟小波核 (Haar-like): [-1 -1  1  1]
卷积响应 (绝对值最大处对应边缘中心): [ 0. -1. -2. -1.  0.  1.  2.  1.  0.]

从上面的简化示例可以看到,一个局部化的核(类似小波)在信号上滑动时,只在信号发生跳变的位置产生显著响应:0→1 的上升沿给出 -2,1→0 的下降沿给出 +2,两处响应的符号相反,位置恰好对应两个跳变点。绝对值大小说明“这里有一个突变”,符号则指示“跳变的方向”。这直观展示了小波变换同时定位频率(通过核的形状)和时间(通过响应的位置) 的能力。

小波变换的优势:

  1. 多分辨率分析:通过改变尺度参数 aa,可以自然地实现“高频用窄窗,低频用宽窗”的自适应分析,克服了STFT的固定窗口缺陷。
  2. 时频定位:能够有效分析非平稳信号,定位突变发生的位置。
  3. 数据压缩:由于小波基与图像的边缘、纹理等结构有更好的匹配性,通过小波变换后,信号的能量往往集中在少数几个大的小波系数上。丢弃那些接近零的小系数,可以在最小化失真的前提下实现高效的数据压缩(如JPEG2000标准就采用了小波变换)。相比之下,傅里叶变换为了凑出局部突变,需要很多高频分量,导致压缩困难。

除了 Haar 小波,还有一系列常用的小波函数族,如 Daubechies 系列(dbN)、Symlets 系列(symN)、Coiflets 系列(coifN),以及 Morlet、Meyer 等,它们具有不同的数学性质,适用于不同的应用场景。

📝 动手练一练

  1. 概念辨析:短时傅里叶变换(STFT)试图解决傅里叶变换的什么问题?它自身又引入了什么新的矛盾?
  2. 理解小波:小波函数必须满足哪两个基本条件?为什么这两个条件使得小波变换特别适合处理像图像这样的信号?
👉 点击查看参考答案
  1. STFT的改进与矛盾:

    • 解决的问题:STFT试图解决傅里叶变换缺乏时间/空间定位能力的问题。它通过加窗将信号分段,假设每段内平稳,从而获得一个二维的时频表示,既能知道有哪些频率成分,也能知道它们大致出现在哪个时间段。
    • 引入的矛盾:时间分辨率与频率分辨率的不可兼得。窗口窄则时间定位准但频率测不准;窗口宽则频率测准但时间定位模糊。由于STFT使用固定大小的窗口,它无法自适应信号中不同频率成分对时频分辨率的不同需求。
  2. 小波函数的条件:

    • 均值为0:∫−∞∞ψ(t)dt=0\int_{-\infty}^{\infty} \psi(t) dt = 0。这保证了小波是一个震荡的波形,适合描述信号的局部变化(如细节、边缘),而不是整体的平均水平。
    • 时域与频域都局部化:小波函数在时域上快速衰减到零,能量集中在有限范围内;在频域上,它有一个中心频率和有限的带宽。这使得小波变换能够同时提供时间(或空间)和频率的局部信息。
    • 适合图像的原因:图像信号在空间上是非平稳的,包含大量局部突变(边缘)和平滑区域。小波的局部化特性使其能很好地匹配图像的边缘和纹理,从而更紧凑地表示图像,便于进行压缩、去噪、特征提取等操作。

本章小结

本节我们深入探讨了傅里叶变换在处理非平稳信号时的局限性,并学习了两种重要的改进方法:短时傅里叶变换和小波变换。STFT通过引入时间窗提供了初步的时频分析能力,但其固定窗口导致了分辨率权衡的根本限制。小波变换则通过使用局部化的、可伸缩平移的小波基函数,实现了真正的多分辨率时频分析,成为图像处理、数据压缩等领域不可或缺的工具。

📋 行动清单

  • 理解傅里叶变换“平稳信号”假设的局限性,能举例说明何为非平稳信号。
  • 掌握短时傅里叶变换(STFT)的基本思想,并能解释其“时间与频率分辨率矛盾”。
  • 理解小波变换的核心创新(更换基函数为局部化的小波),并了解其两个基本条件(均值为零、时频局部化)。

—— 小象教研组