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)
迭代反投影是我最早接触的空域方法。思路很朴素:
- 先猜一个高分辨率图像(比如直接插值放大)
- 模拟降采样过程,得到模拟的低分辨率图像
- 计算模拟图像和真实图像的误差
- 把误差「反投影」回去,修正高分辨率图像
- 重复直到收敛
代码实现起来也不复杂:
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 本章知识体系
下面这张图总结了基于重建的超分辨率方法的核心脉络:
从这张图可以看得很清楚:频域方法和空域方法各有侧重。频域方法适合全局平移的场景,计算快但局限大。空域方法更灵活,能处理复杂运动,但计算量也更大。
在实际工程中,我建议这样选:
- 如果只有 2-4 帧图像,且运动近似平移 → 试试频域方法,速度快
- 如果有 5 帧以上,或者运动复杂 → 用空域方法,特别是 MAP + 正则化
- 如果对边缘保持要求高 → TV 正则化或 POCS 加边缘约束
- 如果计算资源有限 → IBP 简单粗暴,效果也还行
嗯,以上就是基于重建的超分辨率方法的核心内容。每种方法都有它的用武之地,关键是要理解它们的假设和局限。下一章咱们会聊聊基于学习的方法,那又是另一番天地了。
公众号:蓝海资料掘金营,微信deep3321