4、基于重建的超分辨率:频域方法、空域方法、迭代反投影、凸集投影、正则化方法、最大后验概率估计

超分辨率重建,说白了就是「无中生有」地把低分辨率图像变清晰。但这里的「无中生有」是有数学依据的,不是凭空想象。

我个人习惯把基于重建的方法分成两大类:频域派和空域派。频域派玩的是傅里叶变换,空域派则直接在像素空间里做文章。今天咱们就把这两条路都走一遍。

4.1 频域方法:从频谱里找线索

频域方法的思路很直接——低分辨率图像丢失的高频信息,其实在频域里是有迹可循的。我记得刚接触这个方向时,导师跟我说:「你去看看图像的频谱,高频部分被截断了,但低频部分还保留着混叠的信息。」

核心思想是这样的:

  • 低分辨率图像是高频信息被「砍掉」的结果
  • 但不同低分辨率图像之间,丢失的高频信息是互补的
  • 通过多帧图像的频谱混叠关系,可以反推出高频成分

具体来说,频域方法基于傅里叶变换的移位性质。假设我们有 K 帧低分辨率图像,每帧之间存在亚像素位移。那么它们的频谱之间就存在一个线性方程组:

Y_k(u,v) = H(u,v) * X(u,v) * exp(-j*2π*(u*δx_k + v*δy_k)) + N_k(u,v)

其中 Y_k 是第 k 帧的频谱,X 是原始高分辨率图像的频谱,H 是光学传递函数,δx_k、δy_k 是亚像素位移。

关键点:频域方法要求亚像素位移足够精确。如果位移估计偏差超过 0.1 像素,重建质量会断崖式下降。我在项目中吃过这个亏,后来改用空域方法才稳住。

频域方法的优点是计算快,适合实时处理。但缺点也很明显——它假设全局运动是平移,对旋转、缩放无能为力。说白了,适用范围有限。

4.2 空域方法:直接在像素空间里较劲

空域方法是我在实际项目中用得最多的。它不绕弯子,直接在像素空间里建立观测模型,然后求解逆问题。

观测模型可以写成:

y_k = D * B * M_k * x + n_k

其中:

  • x 是待求的高分辨率图像
  • M_k 是运动矩阵(仿射变换)
  • B 是模糊核(点扩散函数)
  • D 是下采样矩阵
  • n_k 是噪声

这个模型看着简单,但求解起来并不容易。因为 D 是降采样操作,信息已经丢失了,这是个病态问题。

4.2.1 迭代反投影(IBP)

迭代反投影是我最早接触的空域方法。思路很朴素:

  1. 先猜一个高分辨率图像(比如直接插值放大)
  2. 模拟降采样过程,得到模拟的低分辨率图像
  3. 计算模拟图像和真实图像的误差
  4. 把误差「反投影」回去,修正高分辨率图像
  5. 重复直到收敛

代码实现起来也不复杂:

def ibp_sr(lr_images, upscale_factor, iterations=50):
    # 初始化:取第一帧做双三次插值
    hr_est = cv2.resize(lr_images[0], None, 
                        fx=upscale_factor, fy=upscale_factor, 
                        interpolation=cv2.INTER_CUBIC)
    
    for i in range(iterations):
        # 模拟降采样
        lr_sim = simulate_downsample(hr_est, lr_images[0].shape)
        
        # 计算误差
        error = lr_images[0] - lr_sim
        
        # 反投影修正
        hr_est += back_project(error, upscale_factor)
    
    return hr_est

避坑指南:我曾经在 IBP 里踩过一个坑——迭代次数设太大,结果图像反而变模糊了。后来发现 IBP 没有显式的正则化约束,迭代多了会过拟合噪声。建议迭代次数控制在 20-50 次之间,具体看噪声水平。

4.2.2 凸集投影(POCS)

凸集投影是另一种思路。它把超分辨率问题看成「找满足所有约束条件的解」。每个约束条件对应一个凸集,解就是这些凸集的交集。

常见的约束包括:

  • 数据保真度约束:降采样后要和观测图像一致
  • 非负性约束:像素值不能为负
  • 能量有界约束:图像总能量有限
  • 平滑性约束:相邻像素变化不能太剧烈

POCS 的迭代过程就是不断往这些凸集上投影:

def pocs_sr(hr_init, constraints, max_iter=100):
    hr = hr_init.copy()
    
    for i in range(max_iter):
        for constraint in constraints:
            # 投影到当前约束的凸集上
            hr = constraint.project(hr)
        
        # 检查是否收敛
        if check_convergence(hr):
            break
    
    return hr

POCS 的好处是约束可以灵活添加。你想想看,如果知道图像里某些区域是平滑的,就加个平滑约束;如果知道边缘是锐利的,就加个边缘保持约束。这种灵活性在实际项目中非常实用。

4.3 正则化方法:给病态问题戴上「紧箍咒」

前面提到超分辨率是个病态问题。什么叫病态?就是解不唯一,而且对噪声极其敏感。正则化方法就是给这个问题加一些「先验知识」,让解朝着合理的方向走。

数学上,正则化方法求解的是:

x_hat = argmin_x || y - D*B*M*x ||^2 + λ * R(x)

第一项是数据保真项,保证重建结果和观测数据一致。第二项是正则化项,约束解的性质。λ 是平衡系数。

常见的正则化项有:

正则化项 数学形式 效果
Tikhonov ||∇x||² 平滑整体,但会模糊边缘
TV(全变分) ||∇x||₁ 保持边缘,去除噪声
稀疏正则化 ||Ψx||₁ 利用稀疏先验,效果好但计算慢

注意:λ 的选择很关键。λ 太大,图像过于平滑;λ 太小,噪声会被放大。我一般用 L-curve 方法或者交叉验证来选 λ。如果项目时间紧,就先用 λ=0.01 试试,再根据结果微调。

4.4 最大后验概率估计(MAP)

MAP 方法从概率角度理解超分辨率问题。它要找到的是:在已知低分辨率图像 y 的条件下,最可能的高分辨率图像 x 是什么。

用贝叶斯公式写出来:

x_MAP = argmax_x P(x|y) = argmax_x P(y|x) * P(x)

其中:

  • P(y|x) 是似然项,描述观测模型
  • P(x) 是先验项,描述我们对高分辨率图像的「期待」

取负对数后,MAP 就变成了一个优化问题:

x_MAP = argmin_x [-log P(y|x) - log P(x)]

你看,这和正则化方法的形式是不是很像?实际上,正则化方法可以看作是 MAP 的一种特例。不同的先验分布对应不同的正则化项:

  • 高斯先验 → L2 正则化(Tikhonov)
  • 拉普拉斯先验 → L1 正则化(TV)
  • 稀疏先验 → 稀疏编码

我个人习惯用 MAP 框架来设计超分辨率算法,因为它提供了一个统一的视角。你可以自由地设计先验模型,比如结合深度学习的先验,或者利用自相似性的先验。

经验之谈:在实际项目中,我通常把 MAP 和迭代反投影结合起来用。先用 MAP 得到一个初始解,再用 IBP 做精细调整。这样既保证了先验约束,又保证了数据保真度。效果比单独用任何一种都好。

4.5 本章知识体系

下面这张图总结了基于重建的超分辨率方法的核心脉络:

基于重建的超分辨率方法体系 超分辨率重建 频域方法 空域方法 傅里叶变换 + 混叠解耦 迭代反投影 (IBP) 凸集投影 (POCS) 正则化方法 最大后验概率 (MAP) 等价 核心思想 利用多帧低分辨率图像的互补信息 结合先验知识,求解病态逆问题

从这张图可以看得很清楚:频域方法和空域方法各有侧重。频域方法适合全局平移的场景,计算快但局限大。空域方法更灵活,能处理复杂运动,但计算量也更大。

在实际工程中,我建议这样选:

  • 如果只有 2-4 帧图像,且运动近似平移 → 试试频域方法,速度快
  • 如果有 5 帧以上,或者运动复杂 → 用空域方法,特别是 MAP + 正则化
  • 如果对边缘保持要求高 → TV 正则化或 POCS 加边缘约束
  • 如果计算资源有限 → IBP 简单粗暴,效果也还行

嗯,以上就是基于重建的超分辨率方法的核心内容。每种方法都有它的用武之地,关键是要理解它们的假设和局限。下一章咱们会聊聊基于学习的方法,那又是另一番天地了。


公众号:蓝海资料掘金营,微信deep3321