频域图像恢复——逆滤波与维纳滤波

为什么在频域做恢复

上一篇我们建立了图像退化模型:观测图像 $g(x,y)$ 是原始图像 $f(x,y)$ 经过退化函数 $h(x,y)$ 卷积并叠加噪声 $n(x,y)$ 后的结果:

$$g(x,y) = h(x,y) * f(x,y) + n(x,y)$$

恢复的任务是:已知 $g$ 和 $h$,尽可能还原 $f$。

在空间域里,这要求解一个反卷积问题。反卷积是一个大规模线性方程组,对一张 $512 \times 512$ 的图像来说,方程组有 26 万个未知数,直接求解几乎不可能。

但卷积有一个非常优美的性质:卷积定理。空间域的卷积等价于频域的乘法:

$$g(x,y) = h(x,y) * f(x,y) \quad \Longleftrightarrow \quad G(u,v) = H(u,v) \cdot F(u,v)$$

这里 $G, H, F$ 分别是 $g, h, f$ 的 Fourier 变换。

这个等式告诉我们一件关键的事:在频域里,卷积退化变成了逐点乘法。逐点乘法可以逐点做除法来还原,而除法比解方程组简单太多了。这就是频域恢复的根本动机。

噪声项在频域同样存在:

$$G(u,v) = H(u,v) \cdot F(u,v) + N(u,v)$$

频域恢复的所有困难,都来自这个 $N(u,v)$。

逆滤波:最直接的尝试

原理

既然退化是乘法,那恢复就是除法。最直接的思路是把退化函数 $H(u,v)$ 除掉:

$$\hat{F}(u,v) = \frac{G(u,v)}{H(u,v)}$$

如果噪声为零,$G = H \cdot F$,那么 $\hat{F} = F$,完美还原。这个公式简洁得令人感动。

致命问题

现实中有噪声。把 $G = H \cdot F + N$ 代入逆滤波公式:

$$\hat{F}(u,v) = F(u,v) + \frac{N(u,v)}{H(u,v)}$$

第一项是原始图像,没问题。第二项是噪声除以 $H$。问题就出在这里。

退化函数 $H(u,v)$ 在高频区域往往非常小,甚至接近零。原因是大多数模糊过程(散焦、运动模糊)都是低通滤波器,它们压制高频分量。当 $H(u,v) \to 0$ 时,$N(u,v) / H(u,v) \to \infty$,噪声被无限放大。

图像的能量集中在低频,而噪声的能量分布在所有频率。逆滤波在高频处把微弱的噪声放大到淹没整个图像的程度,恢复结果完全不可用。

mermaid
flowchart TD
    A["输入图像<br/>G = H·F + N"] --> B["除以 H(u,v)<br/>频域逐点除法"]
    B --> C{"H ≈ 0?<br/>高频区域"}
    C -->|否 低频| D["低频分量<br/>恢复良好"]
    C -->|是 高频| E["N/H → ∞<br/>噪声爆炸"]
    D --> F["结果:低频清晰<br/>高频全是噪声"]
    E --> F

    classDef input fill:#2196F3,color:#fff
    classDef proc fill:#9C27B0,color:#fff
    classDef check fill:#FF9800,color:#fff
    classDef good fill:#4CAF50,color:#fff
    classDef bad fill:#f44336,color:#fff
    class A input
    class B proc
    class C check
    class D good
    class E bad
    class F bad

逆滤波的失败揭示了一个深刻的事实:恢复问题本质上是不适定的(ill-posed)。退化过程丢掉的信息无法无条件找回,噪声让高频信息永久损毁。任何实用的恢复方法都必须在恢复信号和抑制噪声之间做权衡。

维纳滤波:信号与噪声的平衡

目标:最小均方误差

维纳滤波(Wiener Filtering)不走逆滤波那条极端路线。它的目标更温和:找到估计 $\hat{F}$,使它与真实图像 $F$ 之间的**均方误差(Mean Square Error, MSE)**最小:

$$\min ; E\left[ |F(u,v) - \hat{F}(u,v)|^2 \right]$$

这是一个统计意义上的优化。它不追求某一张图像的完美还原,而是让期望误差最小。

公式

经过推导(这里省略统计信号处理的细节),频域的维纳滤波器为:

$$\hat{F}(u,v) = \left[ \frac{H^*(u,v)}{|H(u,v)|^2 + K} \right] G(u,v)$$

其中:

  • $H^*(u,v)$ 是退化函数的复共轭
  • $|H(u,v)|^2$ 是退化函数的功率谱
  • $K$ 是噪声功率谱与信号功率谱之比:$K = S_n(u,v) / S_f(u,v)$

可以把 $H^* / (|H|^2 + K)$ 看作一个修正后的逆滤波器。与逆滤波的 $1/H$ 相比,分母多了一个 $K$ 项,这一项是关键。

K 参数的直觉

理解维纳滤波的核心是理解 $K$ 的行为。$K$ 是信噪比的倒数,它控制着滤波器在不同频率下的行为:

当信号远大于噪声($|H|^2 \gg K$,即高信噪比的低频区域):

$$\frac{H^}{|H|^2 + K} \approx \frac{H^}{|H|^2} = \frac{1}{H}$$

此时维纳滤波退化为逆滤波,尽力恢复信号。因为这里信号强、噪声弱,逆滤波的噪声放大问题不严重,可以放心用。

当噪声远大于信号($|H|^2 \ll K$,即低信噪比的高频区域):

$$\frac{H^}{|H|^2 + K} \approx \frac{H^}{K} \to 0$$

此时滤波器输出趋近于零,主动放弃这些频率的恢复。因为这里噪声已经淹没了信号,任何恢复尝试都只会放大噪声。

mermaid
flowchart TD
    A["输入 G(u,v)"] --> B["维纳滤波器<br/>H* / (|H|² + K)"]
    B --> C{"频率区域"}
    C -->|低频 |H|²≫K| D["≈ 1/H<br/>逆滤波<br/>恢复信号"]
    C -->|高频 |H|²≪K| E["≈ H*/K → 0<br/>抑制噪声<br/>放弃恢复"]
    D --> F["低频清晰<br/>高频干净"]
    E --> F

    classDef input fill:#2196F3,color:#fff
    classDef proc fill:#9C27B0,color:#fff
    classDef check fill:#FF9800,color:#fff
    classDef good fill:#4CAF50,color:#fff
    classDef suppress fill:#f44336,color:#fff
    class A input
    class B proc
    class C check
    class D good
    class E suppress
    class F good

这就是维纳滤波的优雅之处:它在低频做恢复,在高频做抑制,切换由数据本身(信噪比)自动决定,不需要人为设定截止频率。

K 的实际取值

理论上 $K = S_n / S_f$ 需要知道噪声和信号的功率谱。实际中这两个量通常未知,所以 $K$ 往往当作一个常数参数来调。$K$ 越大,滤波器越保守,恢复弱但噪声少;$K$ 越小,滤波器越激进,恢复强但噪声多。

典型的调参方式是从小 $K$ 开始,逐步增大,观察恢复结果中噪声水平和清晰度的平衡点。一个常用的经验值是 $K = 0.01 \sim 0.1$(取决于图像动态范围),但这完全取决于具体场景。

为什么维纳滤波最实用

维纳滤波是经典方法中最实用的,原因有三:

  1. 数学上最优:在均方误差意义下是最优线性估计,有理论保证
  2. 计算上高效:频域逐点运算,复杂度 $O(N \log N)$(FFT),远快于空间域迭代方法
  3. 参数简单:只需要一个 $K$ 参数,工程上容易实现

它的局限性在于假设噪声和信号都是平稳随机过程(功率谱与位置无关),实际图像往往不满足这个假设。但作为经典方法,它的效果和效率平衡得非常好。

约束最小二乘:引入先验知识

思路

维纳滤波依赖统计假设(平稳性),这些假设不一定成立。约束最小二乘(Constrained Least Squares, CLS)换了一个角度:不用统计假设,改用关于图像结构的先验知识。

具体的先验是:自然图像是平滑的,梯度不应该太大。把这个约束加到优化目标里:

$$\min_f ; | g - h * f |^2 + \lambda | \nabla f |^2$$

第一项 $|g - h * f|^2$ 是数据保真项,保证恢复结果经过退化后与观测一致。第二项 $\lambda |\nabla f|^2$ 是正则化项,惩罚图像梯度过大,抑制噪声放大引入的剧烈波动。$\lambda$ 是正则化参数,控制两项的权衡。

频域解

梯度惩罚项用 Laplacian 算子 $\nabla^2$ 来近似(Laplacian 是梯度的散度,衡量二阶变化率)。在频域求解后:

$$\hat{F}(u,v) = \frac{H^*(u,v)}{|H(u,v)|^2 + \lambda |P(u,v)|^2} G(u,v)$$

其中 $P(u,v)$ 是 Laplacian 算子的频域表示,$\lambda$ 是正则化参数。

这个公式结构和维纳滤波几乎一样,区别在于正则化项从常数 $K$ 变成了 $\lambda |P(u,v)|^2$。$P(u,v)$ 在高频处值大,低频处值小,这意味着正则化强度随频率自适应变化:高频处强约束(抑制噪声),低频处弱约束(保留信号)。

维纳滤波 vs 约束最小二乘

两种方法的公式形式相似,但设计哲学不同:

  • 维纳滤波的 $K$ 基于信噪比统计,需要估计噪声和信号的功率谱
  • 约束最小二乘的 $\lambda$ 基于图像平滑性假设,需要调节正则化强度

实际选择取决于场景。如果你对噪声水平有较好的估计,维纳滤波更合适。如果你对图像的平滑程度有先验判断,约束最小二乘更灵活。两者在效果上差别通常不大,工程上维纳滤波用得更多,因为参数意义更直观。

三种方法对比

mermaid
flowchart TD
    A["模糊图像 G(u,v)"] --> B["选择恢复策略"]
    B --> C["逆滤波<br/>F̂ = G / H"]
    B --> D["维纳滤波<br/>H* / (|H|² + K)"]
    B --> E["约束最小二乘<br/>H* / (|H|² + λ|P|²)"]
    C --> F["无噪声理论最优<br/>有噪声完全失效"]
    D --> G["MMSE 最优<br/>需估计 K"]
    E --> H["平滑性约束<br/>需调 λ"]

    classDef input fill:#2196F3,color:#fff
    classDef decision fill:#FF9800,color:#fff
    classDef method fill:#9C27B0,color:#fff
    classDef result fill:#4CAF50,color:#fff
    class A input
    class B decision
    class C,D,E method
    class F,G,H result

从图中可以看到三种方法的定位:

  • 逆滤波是理论基准,只在无噪声情况下有效,实际中不可用,但帮助理解退化本质
  • 维纳滤波是工程默认选择,统计最优,参数直观,适合大多数场景
  • 约束最小二乘提供另一种正则化思路,适合对图像结构有明确先验的场景

小结

频域恢复的核心矛盾是:退化过程丢掉的信息和噪声混在一起,你无法只恢复信号而不放大噪声。

逆滤波无视这个矛盾,直接做除法,结果在高频爆炸。维纳滤波承认这个矛盾,用 $K$ 参数在恢复和抑制之间做自适应平衡,低频恢复、高频抑制。约束最小二乘从另一个角度出发,用平滑性约束达到类似效果。

理解这三个方法的关键不是记住公式,而是理解每种方法如何应对"信号恢复 vs 噪声抑制"这个根本权衡。后续的现代方法(如 Tikhonov 正则化、变分法、深度学习恢复)本质上都在解决同一个问题,只是用了更复杂的正则化手段。