什么是多尺度分解
1. 什么是多尺度分解
-
为什么要分解?
直观地讲,信号或特征序列往往同时包含“低频信息”(整体趋势)和“高频信息”(细节或噪声)。多尺度分解的目的,就是把原始信号拆成若干“尺度”上的成分,分别表示不同频段(粗细程度)的信息。 -
小波变换中的“近似”和“细节”
-
每做一次小波变换,我们都通过一对滤波器(低通滤波器 Low‐pass,和高通滤波器 High‐pass)来把信号分成两部分:
- 近似系数(Approximation):对应低频(粗略、整体)的信息。
- 细节系数(Detail):对应高频(细节、边缘、突变)的信息。
-
结果是:
原始信号 → 高通滤波 / ↓ 低通滤波 / ↓ ( 近似系数 ⏟ 低频 , 细节系数 ⏟ 高频 ) \text{原始信号} \;\xrightarrow[\text{高通滤波}\,/\,\downarrow]{\text{低通滤波}\,/\,\downarrow}\; \bigl(\underbrace{\text{近似系数}}_{\text{低频}},\,\underbrace{\text{细节系数}}_{\text{高频}}\bigr) 原始信号低通滤波/↓高通滤波/↓(低频 近似系数,高频 细节系数)
-
-
多尺度:迭代分解
-
第一次分解:对原始序列做一次小波变换,得到第1层的“近似 a1”和“细节 d1”。
-
第二次分解:再把第1层的“近似 a1”当做新的“原始序列”,对它再次做小波变换,得到第2层的“近似 a2”和“细节 d2”。
-
依次迭代,就能得到 “多尺度” 里的各层近似和细节。例如:
原始 x → (a1, d1) a1 → (a2, d2) a2 → (a3, d3) ……
-
这样每一层的近似 a_k 都只保留更低频的“粗糙趋势”,而这一层对应的细节 d_k 其实就是介于 a_k−1 和 a_k 之间那段“高频差异”。
-
2. 以 Haar 小波为例的手算思路
Haar 小波变换是最简单的一种离散小波变换(DWT),当长度为 2 n 2^n 2n 时,可以全程用“相邻两点求和和差”的方式分解。假设信号长度是 8,则第一层操作步骤(不考虑归一化)像这样:
-
信号: x 0 , x 1 , x 2 , x 3 , x 4 , x 5 , x 6 , x 7 x_0, x_1, x_2, x_3, x_4, x_5, x_6, x_7 x0,x1,x2,x3,x4,x5,x6,x7
-
低通+高通:
- 近似系数 a 1 [ i ] = x 2 i + x 2 i + 1 2 , i = 0 , 1 , 2 , 3 a_1[i] = \frac{x_{2i} + x_{2i+1}}{\sqrt{2}},\quad i=0,1,2,3 a1[i]=2x2i+x2i+1,i=0,1,2,3
- 细节系数 d 1 [ i ] = x 2 i − x 2 i + 1 2 , i = 0 , 1 , 2 , 3 d_1[i] = \frac{x_{2i} - x_{2i+1}}{\sqrt{2}},\quad i=0,1,2,3 d1[i]=2x2i−x2i+1,i=0,1,2,3
这里 2 \sqrt{2} 2 只是为了能让变换是“正交归一化”的形式;如果不用 2 \sqrt{2} 2,概念上是不变的,只是比例不同。
-
结果:得到长度各为 4 的序列 a 1 a_1 a1 和 d 1 d_1 d1。
-
第2层分解:再把 a 1 a_1 a1 当成“原始序列”,对它同样做“相邻两点求和差”的操作,就能得到 a 2 a_2 a2(长度 2)和 d 2 d_2 d2(长度 2)。
3. 代码示例(Haar 小波手工实现)
下面用一个非常简单的例子来演示。我们令原始序列:
x = [3, 7, 1, 1, 2, 8, 5, 9]
长度正好是 8,第一次分解后得到 “近似 a1” 和 “细节 d1”;再对 a1 做第二次分解,得到 a2、d2。
以下代码手算了二维级联的 Haar DWT 并打印结果:
import numpy as np# 定义一个简单的示例序列
x = np.array([3, 7, 1, 1, 2, 8, 5, 9], dtype=float)def haar_dwt(signal):"""对长度为 2^n 的信号进行一级 Haar 小波变换,返回 (近似系数, 细节系数),都是长度为 len(signal)/2。"""n = len(signal)approx = [(signal[2*i] + signal[2*i+1]) / np.sqrt(2) for i in range(n // 2)]detail = [(signal[2*i] - signal[2*i+1]) / np.sqrt(2) for i in range(n // 2)]return np.array(approx), np.array(detail)# 第1层分解
a1, d1 = haar_dwt(x)# 第2层分解:对 a1 再做一次 Haar 小波变换
a2, d2 = haar_dwt(a1)# 打印所有结果
print("原始序列 x:")
print(x)
print("\n第1层分解结果:")
print(" 近似系数 a1:", a1)
print(" 细节系数 d1:", d1)
print("\n第2层分解结果(对 a1 再分解):")
print(" 近似系数 a2:", a2)
print(" 细节系数 d2:", d2)
上面代码打印的输出如下:
原始序列 x:
[3. 7. 1. 1. 2. 8. 5. 9.]第1层分解结果:近似系数 a1: [ 7.07106781 1.41421356 7.07106781 9.89949494]细节系数 d1: [-2.82842712 0. -4.24264069 -2.82842712]第2层分解结果(对 a1 再分解):近似系数 a2: [ 6. 12.]细节系数 d2: [ 4. -2.]
- 第1层 a1 大体保留了原信号的“粗略趋势”(低频聚合),而 d1 则是各对相邻点之间的“差异”(高频细节)。
- 再把 a1 看作新“信号”进行第二次分解,得到第二层的 a2(更低频的整体趋势)和 d2(再进一步的高频成分)。
4. 如何理解这个多尺度结果
-
第1层近似 a1
- 数值 [ 7.07 , 1.41 , 7.07 , 9.90 ] [7.07,\,1.41,\,7.07,\,9.90] [7.07,1.41,7.07,9.90] 可以看作把原来 8 个点「配对求和后除以 2 \sqrt{2} 2」的结果,每个位置都代表原来一对邻点的整体值。
-
第1层细节 d1
- 数值 [ − 2.83 , 0 , − 4.24 , − 2.83 ] [-2.83,\,0,\,-4.24,\,-2.83] [−2.83,0,−4.24,−2.83] 是「相邻两个点相减后再除以 2 \sqrt{2} 2」,代表每一对点之间的“差异”——也就是高频信息。
-
第2层分解
- 把 a1 看成新的信号,其长度为 4,再次“配对求和差”。
- a2=[6,12] 进一步是对 a1[:2] 和 a1[2:] 这两对低频成分做求和的结果,变得更“粗”;
- d2=[4,−2] 则是它们之间的差异,属于更高阶的“细节”。
-
多尺度重构
- 如果把 a2、d2、d1 还原回去,可以逐层“逆变换”(Inverse DWT),重构出原始 x。
- 这种分解的好处在于——如果你只关心“整体轮廓”(低频),就可以只保留 a2 或 a1;如果你要做目标检测、物体边缘提取等“看高频”的任务,往往会关注各层的 d1、d2……。
小结
- 多尺度小波分解 将一个原始序列分解成多层的“近似”和“细节”,每层对应不同频段的特征。
- 其中“近似系数”代表该层的低频信息,“细节系数”代表对应的高频信息。
- 对于视觉特征序列,也可依样画葫芦:先用某种小波(如 Daubechies、Haar 等)对特征图或序列做滤波与下采样,就能获得不同尺度的特征图,用于检测、匹配和定位。
- 上面给出的数值示例展示了最简单的 Haar 小波如何把 8 个实数分解成一层又一层的“粗”和“细”。
1. 为什么要分解?从“粗糙→细节”的视角看信号
-
把信号想象成一张照片
- 比如你手里有一张照片,上面既有远处的大山轮廓(低频、整体趋势),也有近处的树叶纹理(高频、细节)。
- 如果你的任务只是“判断大概这是一座什么山”,那么看看大山的整体形状和颜色就够了,不需要去看每片树叶。
- 如果任务是“检测照片里有没有裂缝”或“提取细小纹理”,那就得关注高频细节——树叶的边缘、岩石的缝隙等。
-
在信号分解中,“低频=模糊大图”“高频=清晰细节”
- 把原图模糊一些,就能反映整体走势,把高频细节(纹理、边缘)削掉;这就是“近似系数”(低频)所在的那一层。
- 把原图和模糊图对比——差值恰好就是被模糊掉的那些细节;这些差值组成的就是“细节系数”(高频)。
-
多尺度:先模糊一次,再对模糊图再模糊
-
第一次模糊(低通滤波+下采样),留下「模糊版」和「被模糊掉的细节」。
-
把这张“已经模糊过的照片”再去模糊一次,就得到“更模糊的整体”和“第一次模糊时没有看见的次级细节”。
-
一层层地往下模糊,就能把照片拆成:
- 最模糊→粗略的轮廓
- 中间几层→中等程度的纹理信息
- 最后一层→细到最细的边缘/噪声
-
2. “多尺度分解”用在数值序列时如何理解
下面我们用一个简单的“一维数字序列”来做类比。把它想象成:一排排灯泡,高亮度表示“高”,低亮度表示“低”。我们想对这排灯泡做多尺度分解,就像对照片分辨率做“逐级下采样和提取差异”。
- 原始序列 [ 3 , 7 , 1 , 1 , 2 , 8 , 5 , 9 ] [3, 7, 1, 1, 2, 8, 5, 9] [3,7,1,1,2,8,5,9]
你可以把它看成 8 个灯泡,每个灯泡亮度分别是 3、7、1、1、2、8、5、9。
第1步:把相邻两盏灯“组合”一次(求平均 + 求差异)
-
组合思想:两两一组,把它们看成一个“大灯泡”
- 每两个数字 ( x 2 i , x 2 i + 1 ) (x_{2i}, x_{2i+1}) (x2i,x2i+1),合并成“一个低频信号”(把它们的亮度加起来/平均一下),让你看到粗略的亮度;
- 同时,也把“这对灯泡之间的差值”当作“高频细节”,表示它们互相不一样的那部分。
-
具体操作(第1层分解)
-
近似(模糊/低频):
a 1 [ i ] = x 2 i + x 2 i + 1 2 a_1[i] \;=\;\frac{x_{2i} + x_{2i+1}}{\sqrt{2}} a1[i]=2x2i+x2i+1
这样做的目的:把两个相邻亮度合并,做一个“模糊平均”。除以 2 \sqrt{2} 2 只是为了算是标准化,不会让数值过大。
-
细节(差异/高频):
d 1 [ i ] = x 2 i − x 2 i + 1 2 d_1[i] \;=\;\frac{x_{2i} - x_{2i+1}}{\sqrt{2}} d1[i]=2x2i−x2i+1
这对应“两个数字相差有多大”,就是“高频信息”——比如第一个灯泡和第二个灯泡之间如果相差很多,就说明这里有急剧的变化(高频)。
-
-
基于我们例子算一遍
原始序列 x = [ 3 , 7 , 1 , 1 , 2 , 8 , 5 , 9 ] x = [3,\,7,\,1,\,1,\,2,\,8,\,5,\,9] x=[3,7,1,1,2,8,5,9]。-
第1对: x 0 = 3 , x 1 = 7 x_0=3,\;x_1=7 x0=3,x1=7
- 模糊结果 ( 3 + 7 ) / 2 ≈ 10 / 1.414 ≈ 7.07 (3+7)/\sqrt2 \approx 10/\!1.414\approx 7.07 (3+7)/2≈10/1.414≈7.07
- 差异结果 ( 3 − 7 ) / 2 ≈ − 4 / 1.414 ≈ − 2.83 (3-7)/\sqrt2 \approx -4/\!1.414\approx -2.83 (3−7)/2≈−4/1.414≈−2.83
-
第2对: x 2 = 1 , x 3 = 1 x_2=1,\;x_3=1 x2=1,x3=1
- 模糊 ( 1 + 1 ) / 1.414 ≈ 2 / 1.414 ≈ 1.41 (1+1)/1.414\approx 2/1.414\approx1.41 (1+1)/1.414≈2/1.414≈1.41
- 差异 ( 1 − 1 ) / 1.414 = 0 (1-1)/1.414=0 (1−1)/1.414=0
-
第3对: x 4 = 2 , x 5 = 8 x_4=2,\;x_5=8 x4=2,x5=8
- 模糊 ( 2 + 8 ) / 1.414 ≈ 10 / 1.414 ≈ 7.07 (2+8)/1.414\approx10/1.414\approx7.07 (2+8)/1.414≈10/1.414≈7.07
- 差异 ( 2 − 8 ) / 1.414 ≈ − 6 / 1.414 ≈ − 4.24 (2-8)/1.414\approx -6/1.414\approx -4.24 (2−8)/1.414≈−6/1.414≈−4.24
-
第4对: x 6 = 5 , x 7 = 9 x_6=5,\;x_7=9 x6=5,x7=9
- 模糊 ( 5 + 9 ) / 1.414 ≈ 14 / 1.414 ≈ 9.90 (5+9)/1.414\approx14/1.414\approx9.90 (5+9)/1.414≈14/1.414≈9.90
- 差异 ( 5 − 9 ) / 1.414 ≈ − 4 / 1.414 ≈ − 2.83 (5-9)/1.414\approx -4/1.414\approx -2.83 (5−9)/1.414≈−4/1.414≈−2.83
最终得到两组长度各为 4 的序列:
a1 (近似模糊值) = [7.07, 1.41, 7.07, 9.90] d1 (高频差异值) = [-2.83, 0.00, -4.24, -2.83]
- a1:告诉你“如果把原来两两灯泡合并成一个灯泡,看它们大致亮度是多少”,所以只有 4 个数,变得更粗糙(低频)了。
- d1:告诉你“这对灯泡里面,谁更亮/谁更暗,它们之间差多少”。
-
第2步:对“模糊后的结果 a1”再做一次同样操作
-
把 a1 看作一道“新的灯泡序列”,再分两两一组:
a 1 = [ 7.07 , 1.41 , 7.07 , 9.90 ] a1 = [7.07,\;1.41,\;7.07,\;9.90] a1=[7.07,1.41,7.07,9.90]
-
第1对: 7.07 , 1.41 7.07,\,1.41 7.07,1.41
- 模糊 ( 7.07 + 1.41 ) / 1.414 ≈ 8.48 / 1.414 ≈ 6 (7.07+1.41)/1.414\approx 8.48/1.414\approx6 (7.07+1.41)/1.414≈8.48/1.414≈6
- 差异 ( 7.07 − 1.41 ) / 1.414 ≈ 5.66 / 1.414 ≈ 4 (7.07-1.41)/1.414\approx5.66/1.414\approx4 (7.07−1.41)/1.414≈5.66/1.414≈4
-
第2对: 7.07 , 9.90 7.07,\,9.90 7.07,9.90
- 模糊 ( 7.07 + 9.90 ) / 1.414 ≈ 16.97 / 1.414 ≈ 12 (7.07+9.90)/1.414\approx16.97/1.414\approx12 (7.07+9.90)/1.414≈16.97/1.414≈12
- 差异 ( 7.07 − 9.90 ) / 1.414 ≈ − 2.83 / 1.414 ≈ − 2 (7.07-9.90)/1.414\approx-2.83/1.414\approx-2 (7.07−9.90)/1.414≈−2.83/1.414≈−2
得到:
a2 (第二层近似) = [6, 12]
d2 (第二层细节) = [ 4, -2]
- a2:告诉你“如果再把 a1 截断再两两合并一次,这次得到的更粗、更模糊的值是多少”。
- d2:告诉你“这两对 a1 之间还有多大差异(其实是比 d1 更高一级的‘细节’)”。
所以,整个分解完之后,我们有:
- 最底层的“最粗模糊” a 2 = [ 6 , 12 ] a_2 = [6,\,12] a2=[6,12]
- 第二层的“细节” d 2 = [ 4 , − 2 ] d_2 = [4,\, -2] d2=[4,−2]
- 第一层的“细节” d 1 = [ − 2.83 , 0 , − 4.24 , − 2.83 ] d_1 = [-2.83,\, 0,\, -4.24,\, -2.83] d1=[−2.83,0,−4.24,−2.83]
如果你要完全复原到最原始的 [ 3 , 7 , 1 , 1 , 2 , 8 , 5 , 9 ] [3,7,1,1,2,8,5,9] [3,7,1,1,2,8,5,9],只要按“反向合并”把 ( a 2 , d 2 ) (a_2,d_2) (a2,d2) 还原成 a1,再把 ( a 1 , d 1 ) (a_1, d_1) (a1,d1) 还原成 x,就行了。这就是小波分解/重构的思想。
3. 为什么叫“多尺度”?
-
“尺度”可以理解为“看东西看得有多模糊”:
- 尺度 0(或原始):没做任何模糊,你看到细节丰富的原图/原序列。
- 尺度 1(第一层):用 2 合 1 的办法,粗略模糊一次。这时你“像把眼睛拉远一些”,整体趋势(a1)更明显,细节(d1)变成了额外信息。
- 尺度 2(第二层):在尺度 1 的基础上再模糊一次,就更模糊了,只剩下特别粗的轮廓(a2),而“更高频的差别”成为 d2。
-
在视觉定位/目标检测等任务中:
- 低层尺度(高分辨率):能看清小细节,适合提取局部边缘、纹理。
- 高层尺度(低分辨率):只剩下大体轮廓(房屋、山脉、大物体),适合粗略定位、语义理解。
- 小波分解正好让你同时保留了「各个尺度的轮廓(a 层)」和「各个尺度的细节(d 层)」,这样你就可以在做检测或匹配时,灵活地选取“只看粗的”或“同时看粗和细”,大大提升鲁棒性。
4. 小结
-
核心概念:把一个序列(或图像)想象成“多层模糊后再看差异”的过程。
- 第一次:把相邻两个数据点“合并”——得到低频(看上去更模糊的整体)和高频(这一对里的细节差异)。
- 第二次:再对第一次的“模糊结果”做同样合并——得到更模糊的整体与比第一层更细一点的差异。
- …以此类推,就分成了很多“层次”,每层都能告诉你“这一粗糙水平下的轮廓”和“区别上一层的高频细节”。
-
为什么有用?
-
任意一层的“低频近似”(a_k)都能告诉你“在第 k 层模糊程度下,这个序列/图像是什么样子”;
-
任意一层的“高频细节”(d_k)都告诉你“在从第 k−1 层到第 k 层模糊之间,哪里发生了快速变化”。
-
目标检测/定位时:
- 粗尺度帮助快速锁定大致区域。
- 细尺度帮助校正边缘、提取关键纹理。
-
如果用在不需要微调(fine‐tuning)的视觉定位模型上,只要把各层 a_k 与 d_k 拼凑好,每层喂给模型就能同时让它“看到粗到细”的信息,不用专门再做网络结构调整。
-
再举一个“生活化”的比喻
-
“看照片看远景” ≈ 第2层近似 a 2 a_2 a2
- 你走得很远,把照片拉得很小,只能看到一块很模糊的大山。
-
“看照片中景” ≈ 第1层近似 a 1 a_1 a1
- 你离近一些,能看到大山上有些树丛和草地,但叶子、石缝还不清楚。
-
“看照片远近”过程中被丢掉的“树叶纹理”“裂缝小径”
- 就对应着第2层差异 d 2 d_2 d2(你第一次拉远再拉近之间,那些忽然看不清的轮廓差别)。
- 以及第1层差异 d 1 d_1 d1(你从中景再看近处,当你把大山局部放大到每棵树时,那些最细碎的枝叶差别)。
这样一想,就明白:
- 多尺度分层看: 能让你在“拿捏整体和细节”上更灵活。
- 小波分解: 就是把“连续的曝光(拼凑大范围→缩放中景→聚焦特写)”用数学工具一次性拆开,得到每个层次上到底保留了什么“模糊图”(近似)和丢掉了什么“细节图”(差异)。
5. 关键要点
-
不用背复杂公式就能理解:
- 先把信号「两两合并」,得到“合并后模糊的值”(近似)
- 再把这两两个数字之间的“差距”当成“剩下的细节”(细节)
- 然后把上一步的“模糊结果”再来一次上述过程,就完成了“第二次更模糊 + 第二层细节”
-
每一层都很有用:
- 最模糊的低频,让你抓住整体轮廓;
- 最细微的高频,让你捕捉边缘变化;
- 中间层次(比如第1层的 a1、d1),则介于粗和细之间,既能看结构也能看纹理。
-
在视觉定位/匹配里怎么用:
- 你可以把“小波分解后每一层的近似 a_k”当作不同分辨率的特征图;
- 把“小波分解后每一层的细节 d_k”当作“高频边缘图”喂给模型。
- 这样不用去专门微调模型就能同时利用“粗尺度的定位”和“细尺度的匹配”,提高泛化和对齐能力。
总结
- 多尺度分解的精髓:先模糊,剩下差;再模糊,剩下差……。
- 每一步你都是“把画变得更模糊”+“把此刻模糊前后丢掉的细节”两件事同时做完。
- 这样做出来的各层 a_k(不同程度的模糊)和 d_k(不同程度的细节)能够让模型兼顾全局和局部,既能看大趋势也能抓小变化。
- 上面给你的数字例子就演示了最简单的 Haar 小波:“两两相加/相减后再除 2 \sqrt{2} 2” 算出一层层的粗糙值与细节值。只要记住“合并→求差→重复”这三个关键词,就能把多尺度分解这个看似复杂的技术理解透彻。