小波变换:多分辨率分析与图像小波去噪 / 增强 / 融合【计算机视觉】

小波变换:多分辨率分析与图像小波去噪 / 增强【计算机视觉】

小波变换(Wavelet Transform)

小波变换是一种多分辨率、局部化的时/空频分析工具,可将图像从空域拆解为不同尺度的低频近似(轮廓)与高频细节(边缘/纹理/噪声)分量,解决了傅里叶变换"无空间定位"、短时傅里叶变换"固定窗宽"的缺陷,是计算机视觉中图像去噪、增强、融合、压缩、特征提取的核心进阶工具。

注意:本文所有代码均可导入Jupyter Notebook

完整代码仓库地址:🔗 GitHub:https://github.com/KnifeWen007/CV---StudyNotebook


Ⅰ、引言

傅里叶变换虽实现了图像从空域到频域的转换,但仅能反映全局频率分布,无法定位"某一频率出现在图像哪个位置";短时傅里叶变换(STFT)通过滑动窗弥补了空间定位能力,却因窗宽固定,无法兼顾高频细节的空间精度与低频轮廓的频率精度。

小波变换的核心突破在于:用可伸缩、可平移的"小波基" 替代傅里叶变换的"无限长正弦基",对图像实现"高频用窄窗(抓细节/定位)、低频用宽窗(看趋势/频率)"的自适应分析。这种多分辨率特性,让小波成为计算机视觉中处理非平稳图像信号(如边缘、纹理、局部噪声)的最优工具之一。


短时傅里叶变换(STFT):傅里叶到小波的过渡

(1)STFT 的核心定位:解决傅里叶的"空间定位缺失"

傅里叶变换的致命短板是"只知频率、不知位置"------比如一张包含边缘和噪声的图像,傅里叶能检测到二者对应的高频成分,却无法区分"边缘在左上角、噪声在右下角"。

为弥补这一缺陷,短时傅里叶变换(Short-Time Fourier Transform,STFT)提出了核心解决方案:给图像叠加固定大小的滑动窗,对每个窗口内的局部区域单独做傅里叶变换 ,从而获得"频率-窗口位置"的二维信息,实现频率的空间定位。
(2)STFT 数学定义(CV 视角)

对二维图像 I ( x , y ) I(x,y) I(x,y),STFT 的表达式为:
STFT ( τ x , τ y , u , v ) = ∬ − ∞ + ∞ I ( x , y ) ⋅ w ( x − τ x , y − τ y ) ⋅ e − j ( u x + v y ) d x d y \text{STFT}(\tau_x, \tau_y, u, v) = \iint_{-\infty}^{+\infty} I(x,y) \cdot w(x-\tau_x, y-\tau_y) \cdot e^{-j(ux+vy)} dxdy STFT(τx,τy,u,v)=∬−∞+∞I(x,y)⋅w(x−τx,y−τy)⋅e−j(ux+vy)dxdy

  • w ( x − τ x , y − τ y ) w(x-\tau_x, y-\tau_y) w(x−τx,y−τy):二维窗函数(如矩形窗、高斯窗), τ x , τ y \tau_x, \tau_y τx,τy 为窗口中心坐标;
  • u , v u, v u,v:频率分量;
  • 本质:窗口约束下的局部傅里叶变换,窗口滑动遍历整幅图像。
    (3)STFT 的核心缺陷(CV 场景下)

STFT 虽解决了频率定位问题,却因"固定窗宽"陷入新的困境,这也是它在计算机视觉中极少单独使用的核心原因:

  • 窄窗:空间定位精准(能看清边缘位置),但频率分辨率低(无法区分边缘和噪声的高频差异);
  • 宽窗:频率分辨率高(能区分不同高频),但空间定位模糊(无法精准定位边缘);
  • 硬伤:窗宽一旦选定,整幅图像分析过程中全程固定,无法同时兼顾高频细节的定位与低频轮廓的分频。
    (4)STFT 与小波变换的核心对比
特性 短时傅里叶变换(STFT) 小波变换
窗口特性 固定大小、固定形状,全程不可调 可伸缩(宽窄自适应)、可平移,频率适配
基函数 无限长正弦波 + 固定窗 局部化小波基(短、震荡、快速衰减)
分辨率特性 全局统一分辨率,高频/低频无法兼顾 多分辨率:低频高频率分辨率、高频高空间分辨率
CV 应用局限 易产生块伪影,仅辅助分析,极少单独落地 无窗效应,保边性好,广泛用于去噪/融合/压缩

(5)STFT 的 CV 应用价值

STFT 在计算机视觉中虽极少作为核心工具落地,但它的"局部化频率分析"思路为小波变换奠定了基础------小波变换本质是对 STFT 的升级:用"可伸缩的小波基"替代"固定窗 + 正弦基",从根本上解决了窗宽固定的缺陷。


Ⅱ、小波变换原理:从母小波到多分辨率分析

小波变换是对短时傅里叶变换(STFT)的核心升级:放弃固定时间-频率窗 ,改用可伸缩、可平移的小波基函数 ,实现高频信号精确定位、低频信号精细分频的自适应多分辨率分析,完美适配图像边缘、纹理、轮廓等非平稳视觉信号的处理需求,是计算机视觉领域高精度图像处理(去噪/增强/融合)的核心理论基础。


一、母小波(Mother Wavelet):小波变换的基础模板

母小波是生成所有小波基的唯一原始函数,需满足三大核心数学约束:

  1. 零均值约束 : ∫ − ∞ + ∞ ψ ( t ) d t = 0 \int_{-\infty}^{+\infty}\psi(t)dt = 0 ∫−∞+∞ψ(t)dt=0

    物理意义:函数正负震荡且积分和为0,能精准捕捉图像中灰度突变(边缘/纹理);

  2. 能量有限约束 : ∫ − ∞ + ∞ ∣ ψ ( t ) ∣ 2 d t < ∞ \int_{-\infty}^{+\infty}|\psi(t)|^2dt < \infty ∫−∞+∞∣ψ(t)∣2dt<∞

    物理意义:能量集中在局部空域,适配图像局部特征(如人脸眼角、建筑边缘)的分析;

  3. 容许条件约束 : C ψ = ∫ − ∞ + ∞ ∣ ψ ^ ( ω ) ∣ 2 ∣ ω ∣ d ω < ∞ C_\psi = \int_{-\infty}^{+\infty}\frac{|\hat{\psi}(\omega)|^2}{|\omega|}d\omega < \infty Cψ=∫−∞+∞∣ω∣∣ψ^(ω)∣2dω<∞

    物理意义:保证小波变换可逆,处理后的频带分量可重构回原始图像。

(1)计算机视觉常用母小波完整数学表达式
母小波类型 一维数学表达式 二维扩展形式(图像适配) 核心特性(CV 场景) 工程优先级
Haar 小波 ψ ( t ) = { 1 , 0 ≤ t < 1 2 − 1 , 1 2 ≤ t < 1 0 , 其他 \psi(t) = \begin{cases} 1, & 0\leq t < \frac{1}{2} \\ -1, & \frac{1}{2}\leq t < 1 \\ 0, & \text{其他} \end{cases} ψ(t)=⎩ ⎨ ⎧1,−1,0,0≤t<2121≤t<1其他 ψ ( x , y ) = ψ ( x ) ⋅ ψ ( y ) \psi(x,y) = \psi(x) \cdot \psi(y) ψ(x,y)=ψ(x)⋅ψ(y)(张量积) 计算最快、正交,适合快速验证、边缘初检 低(仅测试用)
Daubechies-2(db2) ψ ( t ) = 2 ∑ k = 0 3 g k ϕ ( 2 t − k ) , g k = ( − 1 ) k h 1 − k \psi(t) = \sqrt{2}\sum_{k=0}^{3}g_k\phi(2t-k),\ g_k=(-1)^kh_{1-k} ψ(t)=2 ∑k=03gkϕ(2t−k), gk=(−1)kh1−k 滤波系数: h 0 = 1 + 3 4 2 , h 1 = 3 + 3 4 2 h_0=\frac{1+\sqrt{3}}{4\sqrt{2}},h_1=\frac{3+\sqrt{3}}{4\sqrt{2}} h0=42 1+3 ,h1=42 3+3 h 2 = 3 − 3 4 2 , h 3 = 1 − 3 4 2 h_2=\frac{3-\sqrt{3}}{4\sqrt{2}},h_3=\frac{1-\sqrt{3}}{4\sqrt{2}} h2=42 3−3 ,h3=42 1−3 ψ ( x , y ) = ψ ( x ) ⋅ ψ ( y ) \psi(x,y)=\psi(x)\cdot\psi(y) ψ(x,y)=ψ(x)⋅ψ(y) 正交紧支撑,保边性好,无边界伪影 高(去噪/融合首选)
墨西哥帽小波 ψ ( t ) = 2 3 π − 1 / 4 ( 1 − t 2 ) e − t 2 / 2 \psi(t) = \frac{2}{\sqrt{3}}\pi^{-1/4}(1-t^2)e^{-t^2/2} ψ(t)=3 2π−1/4(1−t2)e−t2/2 ψ ( x , y ) = ψ ( x 2 + y 2 ) \psi(x,y) = \psi(\sqrt{x^2+y^2}) ψ(x,y)=ψ(x2+y2 ) 光滑连续,旋转不变性,适配圆形特征 中(医学影像/特征检测)
Morlet 小波 ψ ( t ) = ( e j ω 0 t − e − ω 0 2 / 2 ) e − t 2 / 2 ( ω 0 ≥ 5 ) \psi(t) = (e^{j\omega_0 t}-e^{-\omega_0^2/2})e^{-t^2/2}\ (\omega_0\geq5) ψ(t)=(ejω0t−e−ω02/2)e−t2/2 (ω0≥5) ψ ( x , y ) = ψ ( x 2 + y 2 ) \psi(x,y) = \psi(\sqrt{x^2+y^2}) ψ(x,y)=ψ(x2+y2 ) 复小波,时频精度均衡,纹理细节分析 中(纹理分类/高频特征)

补充说明:二维图像小波变换通常采用张量积形式 ( ψ ( x , y ) = ψ ( x ) ⋅ ψ ( y ) \psi(x,y) = \psi(x) \cdot \psi(y) ψ(x,y)=ψ(x)⋅ψ(y)),即将一维母小波分别作用于图像的 x 轴(列)和 y 轴(行),实现二维频带分解。


二、小波基:由母小波伸缩+平移生成的自适应窗口

小波基是母小波通过尺度变换(伸缩)+ 平移变换 + 能量归一化生成的函数族,尺度因子控制"分析粒度",平移因子控制"分析位置"。

(1)一维小波基公式

ψ a , b ( t ) = 1 ∣ a ∣ ψ ( t − b a ) \psi_{a,b}(t) = \frac{1}{\sqrt{|a|}} \psi\left( \frac{t - b}{a} \right) ψa,b(t)=∣a∣ 1ψ(at−b)

  • a a a:尺度因子( a > 0 a>0 a>0), a a a 越小小波基越窄(分析高频/细节), a a a 越大越宽(分析低频/轮廓);
  • b b b:平移因子,控制小波基在空域的位置(对应图像像素的行列坐标);
  • 1 ∣ a ∣ \frac{1}{\sqrt{|a|}} ∣a∣ 1:能量归一化系数,保证不同尺度小波基的能量一致。
(2)二维小波基公式(图像专用)

ψ a , b x , b y ( x , y ) = 1 ∣ a ∣ ψ ( x − b x a , y − b y a ) \psi_{a,b_x,b_y}(x,y) = \frac{1}{|a|} \psi\left( \frac{x - b_x}{a}, \frac{y - b_y}{a} \right) ψa,bx,by(x,y)=∣a∣1ψ(ax−bx,ay−by)

  • 适配性优化:将一维平移因子 b b b 拆分为 b x b_x bx(列平移)、 b y b_y by(行平移),直接对应图像像素坐标;归一化系数改为 1 ∣ a ∣ \frac{1}{|a|} ∣a∣1,补偿二维空域的尺度缩放。

三、小波变换:图像与小波基的内积运算

小波变换的本质是"图像信号与小波基的内积",核心作用是将空域图像转换为频域系数,实现"轮廓/边缘/噪声"的分离。

(1)二维连续小波变换(CWT,仅理论参考)

W f ( a , b x , b y ) = ∬ − ∞ + ∞ I ( x , y ) ⋅ ψ a , b x , b y ∗ ( x , y ) d x d y W_f(a,b_x,b_y) = \iint_{-\infty}^{+\infty} I(x,y) \cdot \psi^*_{a,b_x,b_y}(x,y) dxdy Wf(a,bx,by)=∬−∞+∞I(x,y)⋅ψa,bx,by∗(x,y)dxdy

工程说明:CWT 计算量极大,且系数冗余,计算机视觉中完全不使用,仅用于理解小波变换的数学本质。

(2)二维离散小波变换(DWT,工程实用版)

W f ( j , k x , k y ) = 1 2 j ∬ − ∞ + ∞ I ( x , y ) ⋅ ψ ( x − k x ⋅ 2 j 2 j , y − k y ⋅ 2 j 2 j ) d x d y W_f(j,k_x,k_y) = \frac{1}{2^j} \iint_{-\infty}^{+\infty} I(x,y) \cdot \psi\left( \frac{x - k_x\cdot2^j}{2^j}, \frac{y - k_y\cdot2^j}{2^j} \right) dxdy Wf(j,kx,ky)=2j1∬−∞+∞I(x,y)⋅ψ(2jx−kx⋅2j,2jy−ky⋅2j)dxdy

  • 离散化优化:
    1. 尺度因子 a = 2 j a=2^j a=2j( j j j 为分解级数,取整数),仅保留2的幂次尺度,降低计算量;
    2. 平移因子 b x = k x ⋅ 2 j b_x=k_x\cdot2^j bx=kx⋅2j、 b y = k y ⋅ 2 j b_y=k_y\cdot2^j by=ky⋅2j( k x , k y k_x,k_y kx,ky 为整数),与图像像素下采样步长对齐;
    3. 归一化系数 1 2 j \frac{1}{2^j} 2j1,补偿尺度缩放带来的能量变化。

四、图像小波分解:LL、LH、HL、HH 频带的数学定义

图像经一层二维小波变换后,会被分解为 4 个正交频带子带,其数学原型由内积形式定义·:

{ f 2 j 0 ( m , n ) = ⟨ f 2 j − 1 ( x , y ) , ϕ ( x − 2 m , y − 2 n ) ⟩ (LL 低频近似子带) f 2 j 1 ( m , n ) = ⟨ f 2 j − 1 ( x , y ) , ψ 1 ( x − 2 m , y − 2 n ) ⟩ (HL 水平高频子带) f 2 j 2 ( m , n ) = ⟨ f 2 j − 1 ( x , y ) , ψ 2 ( x − 2 m , y − 2 n ) ⟩ (LH 垂直高频子带) f 2 j 3 ( m , n ) = ⟨ f 2 j − 1 ( x , y ) , ψ 3 ( x − 2 m , y − 2 n ) ⟩ (HH 对角高频子带) \begin{cases} f_{2^j}^0(m,n) = \langle f_{2^{j-1}}(x,y),\ \phi(x-2m,y-2n) \rangle \quad &\text{(LL 低频近似子带)} \\ f_{2^j}^1(m,n) = \langle f_{2^{j-1}}(x,y),\ \psi^1(x-2m,y-2n) \rangle \quad &\text{(HL 水平高频子带)} \\ f_{2^j}^2(m,n) = \langle f_{2^{j-1}}(x,y),\ \psi^2(x-2m,y-2n) \rangle \quad &\text{(LH 垂直高频子带)} \\ f_{2^j}^3(m,n) = \langle f_{2^{j-1}}(x,y),\ \psi^3(x-2m,y-2n) \rangle \quad &\text{(HH 对角高频子带)} \end{cases} ⎩ ⎨ ⎧f2j0(m,n)=⟨f2j−1(x,y), ϕ(x−2m,y−2n)⟩f2j1(m,n)=⟨f2j−1(x,y), ψ1(x−2m,y−2n)⟩f2j2(m,n)=⟨f2j−1(x,y), ψ2(x−2m,y−2n)⟩f2j3(m,n)=⟨f2j−1(x,y), ψ3(x−2m,y−2n)⟩(LL 低频近似子带)(HL 水平高频子带)(LH 垂直高频子带)(HH 对角高频子带)

符号与物理意义
符号 含义
f 2 j − 1 ( x , y ) f_{2^{j-1}}(x,y) f2j−1(x,y) 第 j − 1 j-1 j−1 层输入图像(初始为原始图像 I ( x , y ) I(x,y) I(x,y))
⟨ ⋅ , ⋅ ⟩ \langle \cdot,\cdot \rangle ⟨⋅,⋅⟩ 内积运算(等价于卷积+2倍下采样)
ϕ ( x − 2 m , y − 2 n ) \phi(x-2m,y-2n) ϕ(x−2m,y−2n) 二维尺度函数(低通滤波,提取平缓灰度信息)
ψ 1 ( x , y ) = ψ ( x ) ϕ ( y ) \psi^1(x,y)=\psi(x)\phi(y) ψ1(x,y)=ψ(x)ϕ(y) 水平高频小波基(提取行方向突变)
ψ 2 ( x , y ) = ϕ ( x ) ψ ( y ) \psi^2(x,y)=\phi(x)\psi(y) ψ2(x,y)=ϕ(x)ψ(y) 垂直高频小波基(提取列方向突变)
ψ 3 ( x , y ) = ψ ( x ) ψ ( y ) \psi^3(x,y)=\psi(x)\psi(y) ψ3(x,y)=ψ(x)ψ(y) 对角高频小波基(提取对角纹理/噪声)
2 m , 2 n 2m,2n 2m,2n 下采样步长(分解后子带尺寸为原图 1/2×1/2)
f 2 j k ( m , n ) f_{2^j}^k(m,n) f2jk(m,n) 第 j j j 层第 k k k 个频带的小波系数

工程实用版(滤波形式,直接对应代码)

{ L L ( j + 1 ) = 1 2 ∑ m , n h ( m ) h ( n ) ⋅ L L ( j ) ( x − m , y − n ) L H ( j + 1 ) = 1 2 ∑ m , n h ( m ) g ( n ) ⋅ L L ( j ) ( x − m , y − n ) H L ( j + 1 ) = 1 2 ∑ m , n g ( m ) h ( n ) ⋅ L L ( j ) ( x − m , y − n ) H H ( j + 1 ) = 1 2 ∑ m , n g ( m ) g ( n ) ⋅ L L ( j ) ( x − m , y − n ) \begin{cases} LL(j+1) = \frac{1}{2}\sum_{m,n} h(m)h(n) \cdot LL(j)(x-m, y-n) \\ LH(j+1) = \frac{1}{2}\sum_{m,n} h(m)g(n) \cdot LL(j)(x-m, y-n) \\ HL(j+1) = \frac{1}{2}\sum_{m,n} g(m)h(n) \cdot LL(j)(x-m, y-n) \\ HH(j+1) = \frac{1}{2}\sum_{m,n} g(m)g(n) \cdot LL(j)(x-m, y-n) \end{cases} ⎩ ⎨ ⎧LL(j+1)=21∑m,nh(m)h(n)⋅LL(j)(x−m,y−n)LH(j+1)=21∑m,nh(m)g(n)⋅LL(j)(x−m,y−n)HL(j+1)=21∑m,ng(m)h(n)⋅LL(j)(x−m,y−n)HH(j+1)=21∑m,ng(m)g(n)⋅LL(j)(x−m,y−n)

  • L L LL LL:低频近似(图像轮廓,能量占比~80%)
  • L H LH LH:水平高频(水平边缘)
  • H L HL HL:垂直高频(垂直边缘)
  • H H HH HH:对角高频(纹理/噪声,能量占比~2%)
  • h ( n ) h(n) h(n):低通滤波器(db2: [ 0.48296 , 0.83652 , 0.22414 , − 0.12941 ] [0.48296, 0.83652, 0.22414, -0.12941] [0.48296,0.83652,0.22414,−0.12941])
  • g ( n ) g(n) g(n):高通滤波器(db2: [ − 0.12941 , − 0.22414 , 0.83652 , − 0.48296 ] [-0.12941, -0.22414, 0.83652, -0.48296] [−0.12941,−0.22414,0.83652,−0.48296])
  • 1 2 \frac{1}{2} 21:归一化系数,补偿2倍下采样导致的亮度衰减

五、小波逆变换:从频带重构图像

小波逆变换(IDWT)是小波分解的逆过程,核心作用是将处理后的频带分量重新组合为空域图像,实现"精准修改、无损还原"。

(1)核心公式(工程实用版)

L L ( j ) = 1 2 ∑ m , n [ h ( m ) h ( n ) ⋅ L L ( j + 1 ) + h ( m ) g ( n ) ⋅ L H ( j + 1 ) + g ( m ) h ( n ) ⋅ H L ( j + 1 ) + g ( m ) g ( n ) ⋅ H H ( j + 1 ) ] ( x + m , y + n ) LL(j) = \frac{1}{2} \sum_{m,n} \Bigg[ h(m)h(n)\cdot LL(j+1) + h(m)g(n)\cdot LH(j+1) + \\ g(m)h(n)\cdot HL(j+1) + g(m)g(n)\cdot HH(j+1) \Bigg]_{(x+m, y+n)} LL(j)=21m,n∑[h(m)h(n)⋅LL(j+1)+h(m)g(n)⋅LH(j+1)+g(m)h(n)⋅HL(j+1)+g(m)g(n)⋅HH(j+1)](x+m,y+n)

(2)公式关键参数解读
符号/项 含义(图像场景适配) 工程注意事项
L L ( j ) LL(j) LL(j) 第 j j j 层低频近似分量(重构后的上一层低频) 多级分解需从最细层逐层重构
h ( n ) / g ( n ) h(n)/g(n) h(n)/g(n) 重构滤波器(分解滤波器的反转) db2 重构 h = [ − 0.12941 , 0.22414 , 0.83652 , 0.48296 ] h=[-0.12941, 0.22414, 0.83652, 0.48296] h=[−0.12941,0.22414,0.83652,0.48296]
1 2 \frac{1}{2} 21 尺度归一化系数 必须保留,否则重构图像亮度异常
( x + m , y + n ) (x+m, y+n) (x+m,y+n) 滤波器滑动偏移 对应图像像素的行列偏移,避免边界失真
(3)核心逻辑补充
  1. 重构顺序:从最细层级(如3级 LL3)开始,逐层向上重构,最终还原原始图像;
  2. 处理逻辑:重构前对高频分量(LH/HL/HH)做系数调整(去噪:HH 系数置0;增强:LH/HL 系数放大);
  3. 正交性保证:重构滤波器是分解滤波器的反转,确保重构后图像无失真、无伪影。
(4)db2 小波重构实例
  • 分解滤波器: h 分解 = [ 0.48296 , 0.83652 , 0.22414 , − 0.12941 ] h_{分解}=[0.48296, 0.83652, 0.22414, -0.12941] h分解=[0.48296,0.83652,0.22414,−0.12941], g 分解 = [ − 0.12941 , − 0.22414 , 0.83652 , − 0.48296 ] g_{分解}=[-0.12941, -0.22414, 0.83652, -0.48296] g分解=[−0.12941,−0.22414,0.83652,−0.48296];
  • 重构滤波器: h 重构 = r e v e r s e ( h 分解 ) = [ − 0.12941 , 0.22414 , 0.83652 , 0.48296 ] h_{重构}=reverse(h_{分解})=[-0.12941, 0.22414, 0.83652, 0.48296] h重构=reverse(h分解)=[−0.12941,0.22414,0.83652,0.48296], g 重构 = r e v e r s e ( g 分解 ) = [ − 0.48296 , 0.83652 , − 0.22414 , − 0.12941 ] g_{重构}=reverse(g_{分解})=[-0.48296, 0.83652, -0.22414, -0.12941] g重构=reverse(g分解)=[−0.48296,0.83652,−0.22414,−0.12941];

核心说明:重构滤波器反转是保证小波变换正交性的关键,无此操作会导致重构图像失真。


Ⅲ、二维图像小波分解结构:LL、LH、HL、HH

在计算机视觉中,图像本质是二维离散像素信号(像素值随坐标(x,y)变化),一维小波变换无法适配其二维特性,因此需采用二维离散小波变换(2D-DWT) 处理。2D-DWT 的核心逻辑是"分维度分解":先对图像行方向做一维小波变换,再对列方向做一维小波变换,最终将原始图像拆解为4个物理意义明确的频带子图(LL、LH、HL、HH),也是后续图像去噪/增强/融合的操作基础。

一、二维小波分解的完整流程

2D-DWT 分解分为"行滤波+下采样"和"列滤波+下采样"两步,以灰度图像为例,具体流程如下:

  1. 第一步:行方向小波变换

    • 对图像的每一行像素,分别用低通滤波器 h高通滤波器 g 做卷积运算:
      • 低通滤波结果:保留行方向的低频信息(如行内平缓的灰度变化);
      • 高通滤波结果:保留行方向的高频信息(如行内的边缘、灰度突变);
    • 对滤波结果做 2 倍下采样(取偶数位置像素),行方向数据量减半;
    • 最终行变换后,图像分为"行低频矩阵"和"行高频矩阵"两部分,列数不变、行数减半。
  2. 第二步:列方向小波变换

    • 对第一步得到的"行低频矩阵"和"行高频矩阵",分别按列做卷积+下采样:
      • 对"行低频矩阵"列滤波:低通得 LL、高通得 LH;
      • 对"行高频矩阵"列滤波:低通得 HL、高通得 HH;
    • 对列滤波结果做 2 倍下采样,列方向数据量减半;
  3. 最终结果:原始图像被分解为 4 个尺寸为原图 1/4 的子图(LL、LH、HL、HH),4 个子图像素总数与原图一致,无信息丢失。

补充:滤波器选择(以 db2 小波为例)

  • 低通滤波器 h = [0.48296, 0.83652, 0.22414, -0.12941](保留低频、平滑信号);
  • 高通滤波器 g = [-0.12941, -0.22414, 0.83652, -0.48296](保留高频、捕捉突变);
    滤波器长度决定分解精度,db2 是 CV 中最常用的选择(兼顾计算速度与保边效果)。

二、小波二维分解(2D-DWT)的4个分量数学定义

频带名称 分解逻辑 物理意义 能量占比 典型特征(CV 场景) 处理策略
LL 行低频+列低频 图像全局轮廓、背景、主体结构 ~80% 如人脸图像的脸型、建筑图像的整体框架 极少修改,保留核心信息
LH 行低频+列高频 水平方向边缘、线条、灰度突变 ~10% 如地平线、文字的水平笔画、桌面的水平边 增强/保留(提升边缘清晰度)
HL 行高频+列低频 垂直方向边缘、线条、灰度突变 ~8% 如建筑的垂直线条、文字的竖笔画、柱子 增强/保留(提升边缘清晰度)
HH 行高频+列高频 对角纹理、细节、噪声(高斯/椒盐) ~2% 如图像的颗粒感、噪点、对角纹理细节 去噪时抑制、增强时适度保留
python 复制代码
import cv2
import pywt
import numpy as np
import matplotlib.pyplot as plt

# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def wavelet_bands_compare(image_path, wavelet='db2'):
    # 读取图像
    img = cv2.imread(image_path)
    if img is None:
        raise ValueError("无法读取图像!请检查路径或文件格式(jpg/png)")

    # 转灰度图(小波分解用)和RGB图(显示用)
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).astype(np.float64)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    # 1级二维小波分解
    coeffs = pywt.wavedec2(gray_img, wavelet=wavelet, level=1)
    LL, (LH, HL, HH) = coeffs

    # 频带归一化(0-255)
    def normalize_band(band):
        min_val = np.min(band)
        max_val = np.max(band)
        if max_val - min_val == 0:
            return band
        return (band - min_val) / (max_val - min_val) * 255

    # 归一化处理
    LL_norm = normalize_band(LL).astype(np.uint8)
    LH_norm = normalize_band(LH).astype(np.uint8)
    HL_norm = normalize_band(HL).astype(np.uint8)
    HH_norm = normalize_band(HH).astype(np.uint8)

    # 绘制对比图(1行5列)
    plt.figure(figsize=(20, 6))

    # 原始图像
    plt.subplot(1, 5, 1)
    plt.imshow(img_rgb)
    plt.title('原始图像', fontsize=14, pad=10)
    plt.axis('off')

    # LL低频分量
    plt.subplot(1, 5, 2)
    plt.imshow(LL_norm, cmap='gray')
    plt.title('LL 低频近似分量\n(图像骨架)', fontsize=12, pad=10)
    plt.axis('off')

    # LH水平细节分量
    plt.subplot(1, 5, 3)
    plt.imshow(LH_norm, cmap='gray')
    plt.title('LH 水平细节分量\n(水平边缘)', fontsize=12, pad=10)
    plt.axis('off')

    # HL垂直细节分量
    plt.subplot(1, 5, 4)
    plt.imshow(HL_norm, cmap='gray')
    plt.title('HL 垂直细节分量\n(垂直边缘)', fontsize=12, pad=10)
    plt.axis('off')

    # HH对角细节分量
    plt.subplot(1, 5, 5)
    plt.imshow(HH_norm, cmap='gray')
    plt.title('HH 对角细节分量\n(纹理+噪声)', fontsize=12, pad=10)
    plt.axis('off')

    plt.tight_layout()
    plt.show()

    # 输出基础信息
    print("="*50)
    print(f"原始图像尺寸:{gray_img.shape} (高×宽)")
    print(f"各频带尺寸:{LL_norm.shape} (均为原图1/4)")
    print(f"使用小波基:{wavelet}")
    print("="*50)

# 批量处理测试图
if __name__ == "__main__":
    # 测试图像路径(替换为本地路径)
    test_images = [
        "building.jpg",
        "lighthouse.jpg",
        "cat.jpg",
        "lenna_noisy.jpg"
    ]

    # 批量执行
    for img_path in test_images:
        print(f"\n{img_path}")
        try:
            wavelet_bands_compare(image_path=img_path, wavelet='db2')
        except Exception as e:
            print(f"❌ 处理{img_path}失败:{str(e)}")

    print("\n所有图像可视化完成!")

(1)LL 低频近似分量
  • 数学本质 : L L = I ∗ ϕ ( x ) ⊗ ϕ ( y ) LL = I * \phi(x) \otimes \phi(y) LL=I∗ϕ(x)⊗ϕ(y)(图像与二维尺度函数做卷积+下采样);
  • 核心特征:灰度变化平缓,是图像的"骨架",包含图像最核心的视觉信息;
  • 分解特性:可对 LL 继续做 2D-DWT 得到 LL2、LH2、HL2、HH2(二级分解),数学上表示为:
    L L 2 ( m , n ) = ∑ x ′ , y ′ L L ( x ′ , y ′ ) ⋅ ϕ ( x ′ − 2 m ) ⋅ ϕ ( y ′ − 2 n ) LL2(m,n) = \sum_{x',y'} LL(x',y') \cdot \phi(x'-2m) \cdot \phi(y'-2n) LL2(m,n)=x′,y′∑LL(x′,y′)⋅ϕ(x′−2m)⋅ϕ(y′−2n)
    LL2 可继续分解为 LL3 等,形成"多分辨率金字塔";
  • 实例:对一张包含猫的图像,LL 分量能清晰看到猫的整体轮廓,但看不到胡须、花纹等细节。
(2)LH 水平细节分量
  • 数学本质 : L H = I ∗ ϕ ( x ) ⊗ ψ ( y ) LH = I * \phi(x) \otimes \psi(y) LH=I∗ϕ(x)⊗ψ(y)(行方向低通+列方向高通);
  • 核心特征:仅响应列方向的灰度突变(行方向平缓),对应图像中水平走向的边缘;
    物理意义: ϕ ( x ) \phi(x) ϕ(x) 保留行方向的平缓信息, ψ ( y ) \psi(y) ψ(y) 提取列方向的灰度差(突变),因此仅对水平边缘敏感;
  • 实例:对包含海平面的图像,LH 分量会清晰显示海平面的水平边缘,而垂直的灯塔边缘则几乎无响应。
(3)HL 垂直细节分量
  • 数学本质 : H L = I ∗ ψ ( x ) ⊗ ϕ ( y ) HL = I * \psi(x) \otimes \phi(y) HL=I∗ψ(x)⊗ϕ(y)(行方向高通+列方向低通);
  • 核心特征:仅响应行方向的灰度突变(列方向平缓),对应图像中垂直走向的边缘;
    物理意义: ψ ( x ) \psi(x) ψ(x) 提取行方向的灰度差, ϕ ( y ) \phi(y) ϕ(y) 保留列方向的平缓信息,因此仅对垂直边缘敏感;
  • 实例:对包含高楼的图像,HL 分量会清晰显示高楼的垂直轮廓线,而水平的窗户边缘则几乎无响应。
(4)HH 对角细节分量
  • 数学本质 : H H = I ∗ ψ ( x ) ⊗ ψ ( y ) HH = I * \psi(x) \otimes \psi(y) HH=I∗ψ(x)⊗ψ(y)(行+列方向高通);
  • 核心特征:响应行+列方向的灰度突变,对应对角纹理、微小细节,也是图像噪声的主要载体;
    物理意义: ψ ( x ) \psi(x) ψ(x) 和 ψ ( y ) \psi(y) ψ(y) 同时提取行、列方向的灰度差,因此对任意方向的微小突变(噪声/对角纹理)都敏感;
  • 实例:对含高斯噪声的人像图,HH 分量中噪声点会以高亮像素呈现,而人脸的对角纹理(如眼角)也会保留。

三、多级小波分解(多分辨率金字塔)

python 复制代码
import cv2
import pywt
import numpy as np
import matplotlib.pyplot as plt

# 中文显示设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def show_all_level_wavelet(image_path, wavelet='db2'):
    # 读取图像
    img = cv2.imread(image_path)
    if img is None:
        raise ValueError("未找到lighthouse.jpg,请确认文件路径正确!")

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).astype(np.float64)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    h, w = gray.shape
    print(f"原始图像尺寸:{h}×{w}")

    # 归一化函数
    def norm(band):
        return ((band - band.min()) / (band.max() - band.min() + 1e-8) * 255).astype(np.uint8)

    # 存储分解结果
    levels_data = {}

    # 1级分解
    coeffs1 = pywt.wavedec2(gray, wavelet=wavelet, level=1)
    LL1, (LH1, HL1, HH1) = coeffs1
    levels_data[1] = {
        'LL': norm(LL1), 'LH': norm(LH1), 'HL': norm(HL1), 'HH': norm(HH1),
        'shape': LL1.shape
    }
    print(f"1级分解 - LL1尺寸:{LL1.shape}(原图1/4)")

    # 2级分解
    coeffs2 = pywt.wavedec2(LL1, wavelet=wavelet, level=1)
    LL2, (LH2, HL2, HH2) = coeffs2
    levels_data[2] = {
        'LL': norm(LL2), 'LH': norm(LH2), 'HL': norm(HL2), 'HH': norm(HH2),
        'shape': LL2.shape
    }
    print(f"2级分解 - LL2尺寸:{LL2.shape}(原图1/16)")

    # 3级分解
    coeffs3 = pywt.wavedec2(LL2, wavelet=wavelet, level=1)
    LL3, (LH3, HL3, HH3) = coeffs3
    levels_data[3] = {
        'LL': norm(LL3), 'LH': norm(LH3), 'HL': norm(HL3), 'HH': norm(HH3),
        'shape': LL3.shape
    }
    print(f"3级分解 - LL3尺寸:{LL3.shape}(原图1/64)")

    # 可视化多分辨率金字塔
    plt.figure(figsize=(20, 5))
    plt.subplot(1, 4, 1)
    plt.imshow(img_rgb)
    plt.title('0级 - 原始图像', fontsize=12)
    plt.axis('off')

    plt.subplot(1, 4, 2)
    plt.imshow(levels_data[1]['LL'], cmap='gray')
    plt.title(f'1级 - LL1\n{levels_data[1]["shape"][0]}×{levels_data[1]["shape"][1]}', fontsize=10)
    plt.axis('off')

    plt.subplot(1, 4, 3)
    plt.imshow(levels_data[2]['LL'], cmap='gray')
    plt.title(f'2级 - LL2\n{levels_data[2]["shape"][0]}×{levels_data[2]["shape"][1]}', fontsize=10)
    plt.axis('off')

    plt.subplot(1, 4, 4)
    plt.imshow(levels_data[3]['LL'], cmap='gray')
    plt.title(f'3级 - LL3\n{levels_data[3]["shape"][0]}×{levels_data[3]["shape"][1]}', fontsize=10)
    plt.axis('off')

    plt.suptitle('小波分解多分辨率金字塔(LL分量)', fontsize=14)
    plt.tight_layout()
    plt.show()

    # 可视化各层级完整频带
    fig, axes = plt.subplots(3, 4, figsize=(18, 12))
    fig.suptitle('1/2/3级小波分解完整频带', fontsize=16)

    # 1级分解行
    axes[0, 0].imshow(levels_data[1]['LL'], cmap='gray')
    axes[0, 0].set_title('1级 LL(图像骨架)', fontsize=10)
    axes[0, 0].axis('off')
    axes[0, 1].imshow(levels_data[1]['LH'], cmap='gray')
    axes[0, 1].set_title('1级 LH(水平边缘)', fontsize=10)
    axes[0, 1].axis('off')
    axes[0, 2].imshow(levels_data[1]['HL'], cmap='gray')
    axes[0, 2].set_title('1级 HL(垂直边缘)', fontsize=10)
    axes[0, 2].axis('off')
    axes[0, 3].imshow(levels_data[1]['HH'], cmap='gray')
    axes[0, 3].set_title('1级 HH(纹理/噪声)', fontsize=10)
    axes[0, 3].axis('off')

    # 2级分解行
    axes[1, 0].imshow(levels_data[2]['LL'], cmap='gray')
    axes[1, 0].set_title('2级 LL(更粗轮廓)', fontsize=10)
    axes[1, 0].axis('off')
    axes[1, 1].imshow(levels_data[2]['LH'], cmap='gray')
    axes[1, 1].set_title('2级 LH(大尺度水平细节)', fontsize=10)
    axes[1, 1].axis('off')
    axes[1, 2].imshow(levels_data[2]['HL'], cmap='gray')
    axes[1, 2].set_title('2级 HL(大尺度垂直细节)', fontsize=10)
    axes[1, 2].axis('off')
    axes[1, 3].imshow(levels_data[2]['HH'], cmap='gray')
    axes[1, 3].set_title('2级 HH(大尺度纹理)', fontsize=10)
    axes[1, 3].axis('off')

    # 3级分解行
    axes[2, 0].imshow(levels_data[3]['LL'], cmap='gray')
    axes[2, 0].set_title('3级 LL(全局轮廓)', fontsize=10)
    axes[2, 0].axis('off')
    axes[2, 1].imshow(levels_data[3]['LH'], cmap='gray')
    axes[2, 1].set_title('3级 LH(超大尺度水平细节)', fontsize=10)
    axes[2, 1].axis('off')
    axes[2, 2].imshow(levels_data[3]['HL'], cmap='gray')
    axes[2, 2].set_title('3级 HL(超大尺度垂直细节)', fontsize=10)
    axes[2, 2].axis('off')
    axes[2, 3].imshow(levels_data[3]['HH'], cmap='gray')
    axes[2, 3].set_title('3级 HH(超大尺度纹理)', fontsize=10)
    axes[2, 3].axis('off')

    plt.tight_layout()
    plt.subplots_adjust(top=0.92)
    plt.show()

    # 输出应用说明
    print("\n各层级应用价值:")
    print("1级分解:细节最丰富,噪声也最明显 → 适合去噪、精细边缘检测、细节增强")
    print("2级分解:平衡轮廓与细节 → 适合图像融合、特征提取、中等尺度分析")
    print("3级分解:仅保留全局轮廓,细节极少 → 适合图像压缩、轮廓提取、粗粒度分析")

# 执行主函数
if __name__ == "__main__":
    try:
        show_all_level_wavelet(image_path="lighthouse.jpg", wavelet='db2')
    except Exception as e:
        print(f"程序执行错误:{str(e)}")

单次小波分解仅能得到"1级频带",为实现更精细的多尺度分析,可对 LL 分量重复执行 2D-DWT,形成"多级分解金字塔":

  1. 1级分解:原图 → LL1 + LH1 + HL1 + HH1(LL1 为1级低频,保留原图1/4的轮廓);
  1. 2级分解:LL1 → LL2 + LH2 + HL2 + HH2(LL2 为2级低频,保留原图1/16的轮廓);
  1. 3级分解:LL2 → LL3 + LH3 + HL3 + HH3(LL3 为3级低频,保留原图1/64的轮廓);
多级分解的 CV 应用价值
  • 低层级(1级):聚焦图像细节、噪声,适合去噪、细节增强;
  • 高层级(2/3级):聚焦图像全局轮廓,适合图像融合、轮廓提取;
  • 工程建议:CV 中常用 1~3 级分解,超过 3 级后 LL 分量信息过少,无实际应用价值。

四、小波分解的物理意义

  1. 信息解耦:将图像的"轮廓、边缘、噪声"解耦到不同频带,实现"精准处理"------如去噪时仅抑制 HH 分量的噪声系数,不破坏 LL/LH/HL 中的轮廓和边缘;
  2. 能量集中:80%以上的图像能量集中在 LL 分量,仅需保留少量系数即可还原图像主体,适合图像压缩;
  3. 局部化特性:频带中的系数与原图像素位置一一对应,修改某一位置的系数仅影响原图对应位置的特征,无全局失真;
  4. 对比傅里叶/STFT:傅里叶无空间定位,STFT 有固定窗伪影,而小波分解既保留空间定位,又无窗效应,是 CV 中高频处理的最优选择。

Ⅳ、小波图像融合的数学原理

一、小波融合的数学本质

小波图像融合的本质是:在小波变换域中,对多幅图像的分解系数进行加权、选取或组合,再通过逆变换重构得到融合图像

设两幅待融合图像为 f A ( x , y ) f_A(x,y) fA(x,y)、 f B ( x , y ) f_B(x,y) fB(x,y),融合图像为 f F ( x , y ) f_F(x,y) fF(x,y),则数学流程为:
{ W { f A } = 分解 ( f A )    ⟹    { L L A , L H A , H L A , H H A } W { f B } = 分解 ( f B )    ⟹    { L L B , L H B , H L B , H H B } W { f F } = F ( W { f A } , W { f B } ) f F = W − 1 ( W { f F } ) \begin{cases} W\{f_A\} = \text{分解}\big(f_A\big) \implies \{LL_A, LH_A, HL_A, HH_A\} \\ W\{f_B\} = \text{分解}\big(f_B\big) \implies \{LL_B, LH_B, HL_B, HH_B\} \\ W\{f_F\} = F\big(W\{f_A\}, W\{f_B\}\big) \\ f_F = W^{-1}\big(W\{f_F\}\big) \end{cases} ⎩ ⎨ ⎧W{fA}=分解(fA)⟹{LLA,LHA,HLA,HHA}W{fB}=分解(fB)⟹{LLB,LHB,HLB,HHB}W{fF}=F(W{fA},W{fB})fF=W−1(W{fF})

其中:

  • (W{\cdot}):二维离散小波变换(2D‑DWT)
  • (W^{-1}{\cdot}):逆二维离散小波变换(IDWT)
  • (F(\cdot)):频带系数融合算子

二、小波分解的数学表达(融合基础)

对图像 (f(x,y)) 进行一层二维小波分解,得到四个子带:
{ L L ( x , y ) = ( f ∗ ϕ ) ( x , y ) ↓ 2 L H ( x , y ) = ( f ∗ ψ h ) ( x , y ) ↓ 2 H L ( x , y ) = ( f ∗ ψ v ) ( x , y ) ↓ 2 H H ( x , y ) = ( f ∗ ψ d ) ( x , y ) ↓ 2 \begin{cases} LL(x,y) = \big(f * \phi\big)(x,y) \downarrow 2 \\ LH(x,y) = \big(f * \psi^h\big)(x,y) \downarrow 2 \\ HL(x,y) = \big(f * \psi^v\big)(x,y) \downarrow 2 \\ HH(x,y) = \big(f * \psi^d\big)(x,y) \downarrow 2 \end{cases} ⎩ ⎨ ⎧LL(x,y)=(f∗ϕ)(x,y)↓2LH(x,y)=(f∗ψh)(x,y)↓2HL(x,y)=(f∗ψv)(x,y)↓2HH(x,y)=(f∗ψd)(x,y)↓2

  • (\phi):二维尺度函数(低通)
  • (\psih,\psiv,\psi^d):水平、垂直、对角小波函数(高通)
  • (*):卷积运算
  • (\downarrow 2):行列各 2 倍下采样

三、频带融合的数学规则

1. LL 低频融合(加权平均)

LL 代表图像轮廓与结构,采用加权线性融合
L L F ( i , j ) = α ⋅ L L A ( i , j ) + ( 1 − α ) ⋅ L L B ( i , j ) LL_F(i,j) = \alpha \cdot LL_A(i,j) + (1-\alpha)\cdot LL_B(i,j) LLF(i,j)=α⋅LLA(i,j)+(1−α)⋅LLB(i,j)

  • (\alpha\in[0,1]):加权系数,通常取 (\alpha=0.5)
2. LH / HL 边缘融合(绝对值取大)

LH、HL 对应水平、垂直边缘,采用系数绝对值最大准则
L H F ( i , j ) = { L H A ( i , j ) , ∣ L H A ∣ > ∣ L H B ∣ L H B ( i , j ) , else LH_F(i,j)= \begin{cases} LH_A(i,j),&|LH_A|>|LH_B|\\ LH_B(i,j),&\text{else} \end{cases} LHF(i,j)={LHA(i,j),LHB(i,j),∣LHA∣>∣LHB∣else

H L F ( i , j ) = { H L A ( i , j ) , ∣ H L A ∣ > ∣ H L B ∣ H L B ( i , j ) , else HL_F(i,j)= \begin{cases} HL_A(i,j),&|HL_A|>|HL_B|\\ HL_B(i,j),&\text{else} \end{cases} HLF(i,j)={HLA(i,j),HLB(i,j),∣HLA∣>∣HLB∣else

3. HH 细节与噪声融合(取大+阈值)

HH 对应细节与噪声,采用绝对值取大+阈值去噪
H H F ( i , j ) = { H H A , ∣ H H A ∣ > ∣ H H B ∣ , ∣ H H A ∣ > T H H B , ∣ H H B ∣ > ∣ H H A ∣ , ∣ H H B ∣ > T 0 , else HH_F(i,j)= \begin{cases} HH_A,&|HH_A|>|HH_B|,\ |HH_A|>T\\ HH_B,&|HH_B|>|HH_A|,\ |HH_B|>T\\ 0,&\text{else} \end{cases} HHF(i,j)=⎩ ⎨ ⎧HHA,HHB,0,∣HHA∣>∣HHB∣, ∣HHA∣>T∣HHB∣>∣HHA∣, ∣HHB∣>Telse

  • (T):噪声阈值

四、小波逆变换(重构数学原理)

由融合系数 (LL_F, LH_F, HL_F, HH_F) 重构图像:
f F ( x , y ) = W − 1 { L L F , L H F , H L F , H H F } f_F(x,y) = W^{-1}\big\{LL_F, LH_F, HL_F, HH_F\big\} fF(x,y)=W−1{LLF,LHF,HLF,HHF}

其离散形式为:
f F ( x , y ) = ∑ m , n L L F ( m , n ) ϕ ( x − 2 m ) ϕ ( y − 2 n ) + ∑ m , n L H F ( m , n ) ϕ ( x − 2 m ) ψ ( y − 2 n ) + ∑ m , n H L F ( m , n ) ψ ( x − 2 m ) ϕ ( y − 2 n ) + ∑ m , n H H F ( m , n ) ψ ( x − 2 m ) ψ ( y − 2 n ) \begin{aligned} f_F(x,y) =& \sum_{m,n} LL_F(m,n)\phi(x-2m)\phi(y-2n) \\ &+ \sum_{m,n} LH_F(m,n)\phi(x-2m)\psi(y-2n) \\ &+ \sum_{m,n} HL_F(m,n)\psi(x-2m)\phi(y-2n) \\ &+ \sum_{m,n} HH_F(m,n)\psi(x-2m)\psi(y-2n) \end{aligned} fF(x,y)=m,n∑LLF(m,n)ϕ(x−2m)ϕ(y−2n)+m,n∑LHF(m,n)ϕ(x−2m)ψ(y−2n)+m,n∑HLF(m,n)ψ(x−2m)ϕ(y−2n)+m,n∑HHF(m,n)ψ(x−2m)ψ(y−2n)


python 复制代码
import cv2
import pywt
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 读取图像
img = cv2.imread('cat.jpg')
if img is None:
    raise ValueError("未找到cat.jpg!请确认路径正确")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
h, w = img.shape[:2]
mid = w // 2

# 生成高模糊图
img1 = img.copy()
img1[:, :mid] = cv2.GaussianBlur(img1[:, :mid], (35, 35), 15)
img2 = img.copy()
img2[:, mid:] = cv2.GaussianBlur(img2[:, mid:], (35, 35), 15)

# 转灰度
gray1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_RGB2GRAY)

# 小波融合
def wavelet_fusion(im1, im2, wavelet='db2', level=1):
    coeffs1 = pywt.wavedec2(im1, wavelet=wavelet, level=level)
    coeffs2 = pywt.wavedec2(im2, wavelet=wavelet, level=level)
    fused_coeffs = []
    for c1, c2 in zip(coeffs1, coeffs2):
        if isinstance(c1, np.ndarray):
            fused = 0.5 * c1 + 0.5 * c2
            fused_coeffs.append(fused)
        else:
            fused_sub = tuple(np.where(np.abs(x) > np.abs(y), x, y) for x, y in zip(c1, c2))
            fused_coeffs.append(fused_sub)
    fused_img = pywt.waverec2(fused_coeffs, wavelet=wavelet)
    return np.clip(fused_img, 0, 255).astype(np.uint8)

# 执行融合
fused_gray = wavelet_fusion(gray1, gray2)

# 可视化
plt.figure(figsize=(20, 7))
plt.subplot(1, 3, 1)
plt.imshow(img1)
plt.title('左侧高模糊图', fontsize=16)
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(img2)
plt.title('右侧高模糊图', fontsize=16)
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(fused_gray, cmap='gray')
plt.title('小波融合后清晰图', fontsize=16)
plt.axis('off')
plt.tight_layout()
plt.show()

五、小波融合的数学意义

  1. 变换域最优融合:在小波域完成结构、边缘、细节的分离式处理,比像素域更合理。
  2. 能量保持与信息互补:LL 保持能量,LH/HL/HH 补充细节与边缘。
  3. 完全重构保证:正交小波满足完全重构条件,保证融合图像无失真。

Ⅴ、小波图像压缩的数学原理与工程实现

小波图像压缩是基于"小波变换能量集中特性"的高效压缩方案,核心优势是:在大幅降低数据量的同时,最大限度保留图像核心视觉信息(远优于传统JPEG的DCT压缩),是医学影像、遥感图像、高清图像压缩的主流技术。

一、小波压缩的数学本质

图像经小波分解后,80%以上的能量集中在LL低频分量 ,LH/HL/HH高频分量仅包含边缘/细节/噪声,且大部分高频系数绝对值趋近于0。

小波压缩的本质是:
压缩 = 小波分解 + 高频系数阈值量化 + 稀疏编码 \text{压缩} = \text{小波分解} + \text{高频系数阈值量化} + \text{稀疏编码} 压缩=小波分解+高频系数阈值量化+稀疏编码
解压 = 稀疏解码 + 逆小波变换 \text{解压} = \text{稀疏解码} + \text{逆小波变换} 解压=稀疏解码+逆小波变换

二、小波压缩的核心数学规则

设图像 f ( x , y ) f(x,y) f(x,y) 经1级小波分解得到系数 { L L , L H , H L , H H } \{LL, LH, HL, HH\} {LL,LH,HL,HH},压缩流程的数学表达:

1. 系数阈值量化(核心步骤)

保留LL分量全部系数,对高频分量按阈值过滤:
L H Q ( i , j ) = { L H ( i , j ) , ∣ L H ( i , j ) ∣ > T 0 , ∣ L H ( i , j ) ∣ ≤ T LH_Q(i,j) = \begin{cases} LH(i,j), & |LH(i,j)| > T \\ 0, & |LH(i,j)| \leq T \end{cases} LHQ(i,j)={LH(i,j),0,∣LH(i,j)∣>T∣LH(i,j)∣≤T
H L Q ( i , j ) = { H L ( i , j ) , ∣ H L ( i , j ) ∣ > T 0 , ∣ H L ( i , j ) ∣ ≤ T HL_Q(i,j) = \begin{cases} HL(i,j), & |HL(i,j)| > T \\ 0, & |HL(i,j)| \leq T \end{cases} HLQ(i,j)={HL(i,j),0,∣HL(i,j)∣>T∣HL(i,j)∣≤T
H H Q ( i , j ) = { H H ( i , j ) , ∣ H H ( i , j ) ∣ > T 0 , ∣ H H ( i , j ) ∣ ≤ T HH_Q(i,j) = \begin{cases} HH(i,j), & |HH(i,j)| > T \\ 0, & |HH(i,j)| \leq T \end{cases} HHQ(i,j)={HH(i,j),0,∣HH(i,j)∣>T∣HH(i,j)∣≤T

  • T T T:压缩阈值( T T T 越大,压缩比越高,细节丢失越多)
  • 工程常用阈值: T = k ⋅ mean ( ∣ L H ∣ + ∣ H L ∣ + ∣ H H ∣ ) T = k \cdot \text{mean}(|LH|+|HL|+|HH|) T=k⋅mean(∣LH∣+∣HL∣+∣HH∣)( k k k 取1~3)
2. 压缩比计算

压缩比 = 原始数据量 保留系数数量 \text{压缩比} = \frac{\text{原始数据量}}{\text{保留系数数量}} 压缩比=保留系数数量原始数据量

  • 1级小波压缩:保留LL(1/4数据)+ 少量高频系数,压缩比可达4:1~10:1;
  • 2级小波压缩:保留LL2(1/16数据),压缩比可达16:1~50:1。

三、小波压缩的工程流程

  1. 小波分解:对图像做1~2级db2小波分解,得到LL/LH/HL/HH;
  2. 阈值量化:保留LL全部系数,对LH/HL/HH按阈值过滤(置零小系数);
  3. 稀疏编码:仅存储非零系数的位置和值(大幅减少数据量);
  4. 解压重构:恢复系数矩阵→逆小波变换→还原图像。
python 复制代码
import cv2
import pywt
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 读取图像
img = cv2.imread('lenna.jpg', 0)
if img is None:
    raise ValueError("未找到lenna.jpg!请确认图片路径正确")

# 计算原始数据量(字节)
h, w = img.shape
original_size = h * w * 1  # 灰度图1字节/像素
original_size_mb = original_size / 1024 / 1024  # 转换为MB

# 小波压缩核心函数
def wavelet_compress(img, wavelet='db2', level=1, k=2):
    # 小波分解
    coeffs = pywt.wavedec2(img, wavelet=wavelet, level=level)
    LL, (LH, HL, HH) = coeffs

    # 计算阈值
    threshold = k * np.mean(np.abs(LH) + np.abs(HL) + np.abs(HH))

    # 高频系数阈值量化
    LH_q = np.where(np.abs(LH) > threshold, LH, 0)
    HL_q = np.where(np.abs(HL) > threshold, HL, 0)
    HH_q = np.where(np.abs(HH) > threshold, HH, 0)

    # 计算压缩后非零系数数量 & 压缩后数据量(仅存储非零系数,模拟实际存储)
    non_zero_LL = np.count_nonzero(LL)
    non_zero_LH = np.count_nonzero(LH_q)
    non_zero_HL = np.count_nonzero(HL_q)
    non_zero_HH = np.count_nonzero(HH_q)
    total_non_zero = non_zero_LL + non_zero_LH + non_zero_HL + non_zero_HH
    compress_size = total_non_zero * 1  # 非零系数1字节/个
    compress_size_mb = compress_size / 1024 / 1024

    # 计算压缩比
    compress_ratio = original_size / total_non_zero

    # 逆变换解压
    coeffs_q = (LL, (LH_q, HL_q, HH_q))
    img_recon = pywt.waverec2(coeffs_q, wavelet=wavelet)
    img_recon = np.clip(img_recon, 0, 255).astype(np.uint8)

    return img_recon, compress_ratio, original_size_mb, compress_size_mb

# 执行压缩(k=2,压缩比约8:1)
img_recon, cr, ori_mb, com_mb = wavelet_compress(img, k=2)

# 打印数据对比
print(f"===== 小波压缩数据对比 =====")
print(f"原始图像数据量:{ori_mb:.4f} MB")
print(f"压缩后数据量:{com_mb:.4f} MB")
print(f"压缩比:{cr:.1f}:1")
print(f"数据量减少:{((ori_mb - com_mb)/ori_mb)*100:.1f}%")

# 可视化对比
plt.figure(figsize=(15, 7))
plt.subplot(1, 2, 1)
plt.imshow(img, cmap='gray')
plt.title(f'原始Lenna图({ori_mb:.4f} MB)', fontsize=14)
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(img_recon, cmap='gray')
plt.title(f'小波压缩后({com_mb:.4f} MB,压缩比{cr:.1f}:1)', fontsize=14)
plt.axis('off')

plt.tight_layout()
plt.show()

四、小波压缩的核心优势(对比JPEG)

  1. 无方块效应:JPEG的DCT变换有8×8块效应,小波压缩是全局变换,视觉效果更自然;
  2. 可分级压缩:支持"先传LL轮廓,再补高频细节",适配不同带宽场景;
  3. 能量保持好:80%能量集中在LL分量,低压缩比下仍能保留图像主体;
  4. 适合CV处理:压缩后仍可直接做边缘检测/特征提取,无需完全解压。

五、典型应用场景

  1. 医学影像(CT/MRI):低压缩比(4:1)下保留病灶细节,满足诊断需求;
  2. 遥感图像:高压缩比(20:1)下保留地形轮廓,降低传输/存储成本;
  3. 高清图片传输:分级压缩,弱网环境先传模糊轮廓,网络恢复后补细节。

Ⅵ、总结

本文系统介绍了二维离散小波变换(2D‑DWT)的数学原理、分解结构、以及在图像融合与图像压缩中的典型应用。

  1. 小波分解 将图像拆分为低频轮廓分量 L L LL LL 与水平、垂直、对角高频分量 L H LH LH、 H L HL HL、 H H HH HH,实现了图像信息的多尺度、分频带解析,为后续处理提供基础。
  2. 小波图像融合通过在变换域对不同图像的系数进行选取与加权,再经逆变换重构,能够将多张互补图像的清晰区域、结构与细节有效合并,得到整体清晰的融合结果,适合同一场景、已对齐图像的信息增强。
  3. 小波图像压缩利用小波系数能量集中于低频、高频系数大量趋近于0的特点,通过阈值量化实现稀疏化,在显著降低数据量的同时,较好保留图像主体信息,且无明显方块效应。

整体来看,小波变换具有多分辨率分析、局部化特性和完全重构能力,在图像特征提取、多源信息融合、数据压缩与传输等计算机视觉任务中结构清晰、效果稳定,是经典且实用的图像处理方法。


上一章

傅里叶变换:从空域到频域的图像分析【计算机视觉】https://blog.csdn.net/R_Feynman_/article/details/158626321?spm=1001.2014.3001.5502

下一章

图像去雾:从直方图增强到暗通道先验【计算机视觉】https://blog.csdn.net/R_Feynman_/article/details/158807328?spm=1001.2014.3001.5501

相关推荐
AI大法师2 小时前
品牌IP工程化落地:9步流程+6类线上故障排查
人工智能
飞Link2 小时前
概率图模型的基石:隐马可夫模型 (HMM) 深度解析
开发语言·python·算法
AAA小肥杨2 小时前
OpenClaw 和 GitHub 自动化,用于 PR 审核和 CI 监控
人工智能·ci/cd·自动化·大模型·github·openclaw
UCloud_TShare2 小时前
优刻得发布面向投研机构的OpenClaw安全解决方案
人工智能
AMxiaohua2 小时前
AI时代,传统企业如何用“一瓶水”的逻辑重塑竞争力?
人工智能·安盟智能·安盟ai
IT 行者2 小时前
每天了解几个MCP SERVER:提供语音合成和语音识别能力 AllVoiceLab
人工智能·语音识别
creaDelight2 小时前
编写你的第一个 Django 应用(官网demo)
python·django·sqlite
喵手2 小时前
Python 爬虫实战:利用 Playwright 攻克 Canva 动态设计模板库
爬虫·python·爬虫实战·playwright·canva·零基础python爬虫教学·搭建动态设计模版库
智能工业品检测-奇妙智能2 小时前
SpringBoot整合FFmpeg的方法
人工智能·ffmpeg·springboot·deepseek·openclaw