问题背景
- 高斯模糊通过 下采样 -> 小卷积核模糊 -> 上采样 的方式来优化大半径模糊的性能
- 经过 Box2x2 卷积核下采样后,图像高频信号在运动过程中会在时域出现闪烁。
效果对照
CrossBox 三阶段0
1/16
1/16
0
1/16
2/16
2/16
1/16
1/16
2/16
2/16
1/16
0
1/16
1/16
0
CrossBox 在 shader 中仍然只有四次纹理采样,但每个 tap 都落在上一层四个 texel 之间。把 GPU 双线性插值展开到离散 texel 后,单阶段等效核是
hCross(1)=1610110122112210110.
后续所有 CrossBox 图表都使用这个已经包含线性 sampler footprint 的核。
问题定义
设完整的“下采样 → 模糊 → 上采样”算子为 P。令 p=p(t) 表示图像在时刻 t 相对初始位置的位移,并定义原图坐标中的平移算子
(Tpf)(x)=f(x−p).
于是第 t 帧为 ft(x)=(Tp(t)f)(x)。“平移过程中不发生闪烁”所要求的命题是
P(Tpf)=Tp(Pf),∀p
左边是“先移动原图,再执行完整处理”,右边是“先执行完整处理,再移动结果”。
问题分析
先看模糊流程。流程存在两个不同的坐标系,这里用 x 表示原图坐标,用 k 表示低分辨率图像的离散坐标:
f(x) D d(x) III↓M ds(x) ↓M d[k] G g[k] ↑M gs(x) U f′(x).
上面的符号分别表示:
- D 是抽取前使用核 h 完成的下采样卷积。本文后续的 h 都指纹理采样真正作用到上一层离散像素上的等效权重:如果一个采样位置落在像素之间,就先把 GPU 线性插值展开到相邻像素,再把各次采样的权重相加;
- III↓M 是间隔为 M 的冲激采样,结果仍位于原图坐标中。它包含实际采样网格的固定相位,后文会显式写出;
- ↓M 把稀疏冲激的权重紧凑地重排为低分辨率图像;
- G 是低分辨率图像上的高斯模糊;
- ↑M 把低分辨率像素放回原图坐标,在样本之间插入空值;
- U 使用重建核 τ 完成上采样卷积。
上面的信号如下图

原图 f(x)

下采样卷积 d(x)=(Df)(x)

冲激采样 ds(x)

向下重排列 d[k]

低分辨率模糊 g[k]=(Gd)[k]

向上重排列 gs(x)

重建卷积 f′(x)=(Ugs)(x)
为了方便,后面推导过程里原图坐标中的信号省略自变量 (x),直接写成 f,d,ds,gs,f′;只有低分辨率图像显式写出离散坐标 d[k] 和 g[k]。
拆解算子 P
回来看我们的命题
P(Tpf)=Tp(Pf),∀p
我们需要把 P 完整展开,再尝试让平移算子 Tp 从右向左依次穿过每个处理步骤。按照前面的流水线,P 是
P=U∘↑M∘G∘↓M∘(III↓M)∘D.
因此,把移动后的图像送进这条链路就是
P(Tpf)P∘Tp=U∘↑M∘G∘↓M∘(III↓M)∘D(Tpf),=U∘↑M∘G∘↓M∘(III↓M)∘D∘Tp.
我们的目标是判断最右边的 Tp 能否一路移到最左边,最终得到 Tp∘P。现在可以检查 Tp 能否依次穿过这些算子。这里的 D 使用前面定义的实际等效核 h,GPU 线性插值已经包含在 h 中,因此 D 仍然是一个卷积算子,与原图坐标中的平移严格交换:
D∘Tp=Tp∘D.
冲激采样和向下重排列会把信号从原图坐标转换到低分辨率坐标,因此这两个操作需要放在一起检查。经过 M 倍下采样,原图中的位移 p 应对应低分辨率坐标中的位移 p/M。下面用 Tp/M(ℓ) 表示低分辨率坐标中的理想连续平移。
低分辨率卷积 G 同样与其坐标系中的平移严格交换:
G∘Tp/M(ℓ)=Tp/M(ℓ)∘G.
最后,↑M 和 U 共同把信号送回原图坐标。所需的交换关系是
U∘↑M∘Tp/M(ℓ) =? Tp∘U∘↑M
因此,整条链路中平移算子的移动过程可以概括为
P∘Tp=U∘↑M∘G∘↓M∘(III↓M)∘D∘Tp=U∘↑M∘G∘↓M∘(III↓M)∘Tp∘D=?U∘↑M∘G∘Tp/M(ℓ)∘↓M∘(III↓M)∘D=U∘↑M∘Tp/M(ℓ)∘G∘↓M∘(III↓M)∘D=?Tp∘U∘↑M∘G∘↓M∘(III↓M)∘D=Tp∘P.
先把 G、↑M 和 U 放到一边,集中分析第一个问号:
↓M∘(III↓M)∘D∘Tp =? Tp/M(ℓ)∘↓M∘(III↓M)∘D.
也就是,需要让 先下采样再移动 和 先移动再下采样 的结果恒等。
进入频域
二维图像只是在水平和垂直两个方向上重复同一件事,下面暂时把 d 看成一维信号,并相应地把位移 p 简写为 p。接下来统一用帽子表示傅里叶变换,即 f=F{f}。
继续分析需要依赖频域的3个特性:
- 信号 d 平移 p 之后,频谱只增加一个相位:
F{Tpd}(ω)=e−iωpd(ω).
- 间隔为 M 的梳状函数在频域中仍然是梳状函数,频谱副本之间的距离为 2π/M。实际 GPU 下采样还有固定的采样相位:单次二倍下采样的输出像素中心位于上一层的 2k+0.5;连续进行 L 次后,M=2L,采样位置在原图坐标中是
xk=kM+aM,aM=2M−1.
例如三次二倍下采样时 M=8,采样网格是 8k+3.5。因此使用带相位的梳状函数
IIIM,aM(x)=k∈Z∑δ(x−aM−kM),
它的傅里叶变换是
F{IIIM,aM}(ω)=M2πr∈Z∑e−iM2πraMδ(ω−M2πr).
- M 倍下采样后,低分辨率图像在原图频率坐标中能够无混叠表示的范围是中心频带 ∣ω∣<π/M
因此,“先平移,再采样”得到的频谱是
ds,p(ω)=Me−iωpr∈Z∑e−iM2πraMeiM2πrpd(ω−M2πr).
如果是“先采样,再平移”,那么每一份频谱应该得到同一个相位:
ds,pideal(ω)=Me−iωpr∈Z∑e−iM2πraMd(ω−M2πr).
固定采样相位 e−i2πraM/M 同时出现在两条路径中,因此不会改变它们是否相等。两者的差别仍然只在由输入位移产生的因子:
eiM2πrp.
对于中心频谱 r=0,这个因子永远等于 1。
当位移刚好是 M 的整数倍时,所有额外相位都等于 1:
eiM2πr(mM)=ei2πrm=1.
要让等式对任意位移 p 都成立,就必须让中心频带中只剩下 r=0 这一项。也就是说,下采样卷积后的信号必须满足
d(ω)=0,∣ω∣≥Mπ.
π/M 就是以 M 为采样间隔时的奈奎斯特频率。在二维图像中,对应的无混叠区域是
NM={(ωx,ωy)∣ωx∣<Mπ,∣ωy∣<Mπ}.
因此,下采样阶段对任意连续平移保持一致的条件是
d(ω)=0,ω∈/NM.
又因为
d=h∗f⟺d=hf,
所以对于当前这张图像,真正需要满足的条件是
h(ω)f(ω)=0,ω∈/NM.
如果希望这个结论对任意输入图像都成立,那么只能要求下采样核本身满足
h(ω)=0,ω∈/NM.
也就是说最理想的下采样卷积核是理想低通滤波器。虽然这无法在工程上实现,但是也得到了误差分析的方法,即只要让奈奎斯特频率限外的部分能量尽可能为0,就能降低混叠带来的视觉瑕疵。
问题就进一步变成了:找到一个足够好的低通滤波器(降采样卷积核),削弱奈奎斯特频率限外的能量。
在频谱图中检查奈奎斯特区域
青色方框标出了总计 8 倍下采样时的奈奎斯特区域:
N8={(ωx,ωy)∣ωx∣<8π,∣ωy∣<8π}.
方框内是低分辨率图像能够唯一表示的频率;方框外仍然存在的能量,会在抽取后折叠回方框内。

原图频谱 ∣f∣

单阶段 Box2x2:∣hBox(1)f∣

三阶段 Box2x2:∣hBox(3)f∣

三阶段 CrossBox:∣hCross(3)f∣
单阶段 Box2x2 在方框边缘附近几乎保留了原图的全部频率能量;三阶段 Box2x2 已经明显压低了方框外的能量,但仍能看到规则的旁瓣。CrossBox 的真实响应还包含每阶段 GPU 双线性 footprint,并额外乘上方向相关的 (cosωx+cosωy)/2,所以方框外整体更暗,但通带也比 Box2x2 衰减得更多。
这四张图直接对应前面得到的判断条件:
h(ω)f(ω)≈0,ω∈/N8.
方框外越暗,能够带着位移相关相位折叠回中心频带的能量越少,运动中的闪烁也就越弱。
其他问题
当前实现存在的 Bug
只进行了单阶段 GPU 双线性插值,对奈奎斯特区域外几乎没有抑制作用。下采样层级越高,混叠现象越严重。
Box2x2 单阶段等效 Kernel0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1/4
1/4
0
0
0
0
0
0
1/4
1/4
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0


还有更好的吗
每一行从左到右依次是:
- 三阶段卷积合成后的等效空间权重;
- 等效核自身的频率响应 ∣hK(3)∣;
- 原图经过等效核卷积后的频谱 ∣hK(3)f∣。
等效空间核按实际支持范围绘制:固定 2×2 偶数核的 tap 落在 texel 中心,三阶段展开后为 8×8;固定 3×3、5×5 奇数核的 tap 落在半 texel 位置,先经过 GPU 双线性插值展开为 4×4、6×6,三阶段等效支持范围分别为 22×22、36×36;两个程序化 Lanczos 则分别为 78×78、134×134。暖色表示正权重,蓝色表示负权重;每张空间图按自身最大绝对权重归一化颜色,只用于观察权重的形状和正负分布。后两列中的青色方框仍然是总计 8 倍下采样的奈奎斯特区域,所有卷积结果继续使用与前文相同的对数亮度范围。
所有行都画渲染器真正作用到上一层离散 texel 的权重。对于奇数尺寸固定矩阵,这包含硬件线性 sampler 的 2×2 footprint;Lanczos 行则使用渲染器针对 2 倍比例和半像素相位实际生成的离散权重。边界寻址模式不进入这组无限平移不变的频率分析。CrossBox 这一行与前文的三阶段 CrossBox 使用完全相同的 4×4 单阶段等效核。
等效空间核
等效响应
∣hK(3)∣卷积频谱
∣hK(3)f∣
Box2x2
Box3x3
CrossBox
Gaussian3x3
Gaussian5x5
Lanczos3
Lanczos5
这些图直接比较了七个预设在同一条三阶段、总计 8 倍下采样链路中的等效行为。修正后的 Lanczos3/5 已经呈现出预期的近似砖墙低通:青色方框内保持接近平坦,过渡集中在边界附近,方框外大部分区域接近黑色。
在水平截止边界 ωx=π/8 上,Lanczos3 与 Lanczos5 的三阶段幅度约为 0.510、0.500。到了明显属于阻带的 ωx=3π/8,它们分别只剩约 0.0047、0.0024。Lanczos5 的过渡更陡、阻带更干净。
因此判断标准仍然是:方框外越暗,抽取后能够折叠回中心频带的能量越少。
CrossBox 的限制
卷积核决定每个频率会被衰减多少,但真正进入抽取步骤的是
h(ω)f(ω)。因此,即使使用同一个核,不同原始信号也会因为频率能量的分布不同而产生不同程度的混叠。
下面三列使用完全相同的 FFT、对数亮度范围和 8 倍下采样奈奎斯特方框。每列上方是原图,下方是对应的振幅频谱 ∣f∣。
CrossBox 的方向性并不是“横竖方向削减更强”。在频率轴上,例如 ωy=0,额外因子是 cos2(ωx/2);在对角线上 ωx=ωy,额外因子是 cosωx,后者在低频附近下降更快,并在 ωx=π/2 先出现零点。因此它对对角频率通常更强,对沿频率轴的分量相对更弱。实际闪烁仍要由这个方向响应与输入频谱共同决定,不能仅凭“UI 以横竖边缘为主”推出 CrossBox 更合适。
结论
- CrossBox 的四个 shader tap 在本实现中都是双线性采样;单阶段真实离散核是 4×4,三阶段等效支持范围是 22×22。
- 与三阶段 Box2x2 相比,CrossBox 用额外的通带衰减换取更强的阻带抑制,而且响应具有方向性:对角频率更强,频率轴方向相对更弱。
- Lanczos 的频率选择性最好,但卷积核较大,需要结合目标半径、带宽和采样指令成本决定是否值得使用。