下采样 Kernel Research

July 30

问题背景

  1. 高斯模糊通过 下采样 -> 小卷积核模糊 -> 上采样 的方式来优化大半径模糊的性能
  2. 经过 Box2x2 卷积核下采样后,图像高频信号在运动过程中会在时域出现闪烁。
用于演示下采样混叠的 sinc 函数、坐标轴和网格图像

效果对照

Box2x2 单阶段(GPU 双线性)
1/4
1/4
1/4
1/4
Box2x2 三阶段(GPU 双线性)
1/4
1/4
1/4
1/4
CrossBox 三阶段
0
1/4
0
1/4
0
1/4
0
1/4
0

问题定义

设完整的“下采样 → 模糊 → 上采样”算子为 P\mathcal P。令 p=p(t)\mathbf p=\mathbf p(t) 表示图像在时刻 tt 相对初始位置的位移,并定义原图坐标中的平移算子

(Tpf)(x)=f(xp).(\mathcal T_{\mathbf p}f)(\mathbf x) = f(\mathbf x-\mathbf p).

于是第 tt 帧为 ft(x)=(Tp(t)f)(x)f_t(\mathbf x)=(\mathcal T_{\mathbf p(t)}f)(\mathbf x)。“平移过程中不发生闪烁”所要求的命题是

P(Tpf)=Tp(Pf),p\boxed{ \mathcal P(\mathcal T_{\mathbf p}f) = \mathcal T_{\mathbf p}(\mathcal P f), \qquad \forall\mathbf p }

左边是“先移动原图,再执行完整处理”,右边是“先执行完整处理,再移动结果”。

先移动,再模糊
𝒫(Tf)
正在读取图像…
先模糊,再移动
T(𝒫f)
正在读取图像…

问题分析

先看模糊流程。流程存在两个不同的坐标系,这里用 x\mathbf x 表示原图坐标,用 k\mathbf k 表示低分辨率图像的离散坐标:

f(x) D d(x) III ⁣M ds(x) M d[k] G g[k] M gs(x) U f(x).f(\mathbf x) \xrightarrow{\ D\ } d(\mathbf x) \xrightarrow{\ \operatorname{III}\!\downarrow_M\ } d_s(\mathbf x) \xrightarrow{\ \downarrow_M\ } d[\mathbf k] \xrightarrow{\ G\ } g[\mathbf k] \xrightarrow{\ \uparrow_M\ } g_s(\mathbf x) \xrightarrow{\ U\ } f'(\mathbf x).

上面的符号分别表示:

  • DD 是抽取前使用核 hh 完成的下采样卷积;
  • III ⁣M\operatorname{III}\!\downarrow_M 是间隔为 MM 的冲激采样,结果仍位于原图坐标中;
  • M\downarrow_M 把稀疏冲激的权重紧凑地重排为低分辨率图像;
  • GG 是低分辨率图像上的高斯模糊;
  • M\uparrow_M 把低分辨率像素放回原图坐标,在样本之间插入空值;
  • UU 使用重建核 τ\tau 完成上采样卷积。

上面的信号如下图



原图

原图 f(x)f(\mathbf x)

原图与三阶段 Box2x2 等效卷积核的卷积结果

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

卷积结果与间隔为八像素的二维梳状函数相乘后的稀疏冲激;冲激在图中被放大以便观察

冲激采样 ds(x)d_s(\mathbf x)

丢掉梳状采样中间的空像素并重排为六十四乘六十四低分辨率图像

向下重排列 d[k]d[\mathbf k]

六十四乘六十四低分辨率图像经过七乘七、标准差一点五的高斯模糊

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

把高斯模糊后的低分辨率像素放回原图坐标并在样本之间补零

向上重排列 gs(x)g_s(\mathbf x)

插零后的稀疏图像与三角核卷积得到的上采样重建结果

重建卷积 f(x)=(Ugs)(x)f'(\mathbf x)=(Ug_s)(\mathbf x)

为了方便,后面推导过程里原图坐标中的信号省略自变量 (x)(\mathbf x),直接写成 f,d,ds,gs,ff,d,d_s,g_s,f';只有低分辨率图像显式写出离散坐标 d[k]d[\mathbf k]g[k]g[\mathbf k]

拆解算子 P\mathcal P

回来看我们的命题

P(Tpf)=Tp(Pf),p\mathcal P(\mathcal T_{\mathbf p}f) = \mathcal T_{\mathbf p}(\mathcal P f), \qquad \forall\mathbf p

我们需要把 P\mathcal P 完整展开,再尝试让平移算子 Tp\mathcal T_{\mathbf p} 从右向左依次穿过每个处理步骤。按照前面的流水线,P\mathcal P

P=UMGM(III ⁣M)D.\mathcal P = U \circ\uparrow_M \circ G \circ\downarrow_M \circ\bigl(\operatorname{III}\!\downarrow_M\bigr) \circ D.

因此,把移动后的图像送进这条链路就是

P(Tpf)=UMGM(III ⁣M)D(Tpf),PTp=UMGM(III ⁣M)DTp.\begin{aligned} \mathcal P(\mathcal T_{\mathbf p}f) &= U\circ\uparrow_M\circ G\circ\downarrow_M \circ\bigl(\operatorname{III}\!\downarrow_M\bigr) \circ D(\mathcal T_{\mathbf p}f),\\ \mathcal P\circ\mathcal T_{\mathbf p} &= U\circ\uparrow_M\circ G\circ\downarrow_M \circ\bigl(\operatorname{III}\!\downarrow_M\bigr) \circ D\circ\mathcal T_{\mathbf p}. \end{aligned}

我们的目标是判断最右边的 Tp\mathcal T_{\mathbf p} 能否一路移到最左边,最终得到 TpP\mathcal T_{\mathbf p}\circ\mathcal P。现在可以检查 Tp\mathcal T_{\mathbf p} 能否依次穿过这些算子。首先,卷积 DD 与原图坐标中的平移严格交换:

DTp=TpD.D\circ\mathcal T_{\mathbf p} = \mathcal T_{\mathbf p}\circ D.

冲激采样和向下重排列会把信号从原图坐标转换到低分辨率坐标,因此这两个操作需要放在一起检查。经过 MM 倍下采样,原图中的位移 p\mathbf p 应对应低分辨率坐标中的位移 p/M\mathbf p/M。下面用 Tp/M()\mathcal T^{(\ell)}_{\mathbf p/M} 表示低分辨率坐标中的理想连续平移。

低分辨率卷积 GG 同样与其坐标系中的平移严格交换:

GTp/M()=Tp/M()G.G\circ\mathcal T^{(\ell)}_{\mathbf p/M} = \mathcal T^{(\ell)}_{\mathbf p/M}\circ G.

最后,M\uparrow_MUU 共同把信号送回原图坐标。所需的交换关系是

UMTp/M() =? TpUMU \circ \uparrow_M \circ \mathcal T^{(\ell)}_{\mathbf p/M} \ \stackrel{?}{=}\ \mathcal T_{\mathbf p} \circ U \circ \uparrow_M

因此,整条链路中平移算子的移动过程可以概括为

PTp=UMGM(III ⁣M)DTp=UMGM(III ⁣M)TpD=?UMGTp/M()M(III ⁣M)D=UMTp/M()GM(III ⁣M)D=?TpUMGM(III ⁣M)D=TpP.\begin{aligned} \mathcal P\circ\boxed{\mathcal T_{\mathbf p}} &= U\circ\uparrow_M\circ G\circ\downarrow_M \circ\bigl(\operatorname{III}\!\downarrow_M\bigr) \circ D\circ\boxed{\mathcal T_{\mathbf p}}\\ &= U\circ\uparrow_M\circ G\circ\downarrow_M \circ\bigl(\operatorname{III}\!\downarrow_M\bigr) \circ\boxed{\mathcal T_{\mathbf p}}\circ D\\ &\stackrel{?}{=} U\circ\uparrow_M\circ G \circ\boxed{\mathcal T^{(\ell)}_{\mathbf p/M}} \circ\downarrow_M \circ\bigl(\operatorname{III}\!\downarrow_M\bigr) \circ D\\ &= U\circ\uparrow_M \circ\boxed{\mathcal T^{(\ell)}_{\mathbf p/M}}\circ G \circ\downarrow_M \circ\bigl(\operatorname{III}\!\downarrow_M\bigr) \circ D\\ &\stackrel{?}{=} \boxed{\mathcal T_{\mathbf p}} \circ U\circ\uparrow_M\circ G\circ\downarrow_M \circ\bigl(\operatorname{III}\!\downarrow_M\bigr) \circ D\\ &= \boxed{\mathcal T_{\mathbf p}}\circ\mathcal P. \end{aligned}

先把 GGM\uparrow_MUU 放到一边,集中分析第一个问号:

M(III ⁣M)DTp =? Tp/M()M(III ⁣M)D.\boxed{ \downarrow_M \circ\bigl(\operatorname{III}\!\downarrow_M\bigr) \circ D\circ\mathcal T_{\mathbf p} \ \stackrel{?}{=}\ \mathcal T^{(\ell)}_{\mathbf p/M} \circ\downarrow_M \circ\bigl(\operatorname{III}\!\downarrow_M\bigr) \circ D. }

也就是,需要让 先下采样再移动 和 先移动再下采样 的结果恒等。

进入频域

二维图像只是在水平和垂直两个方向上重复同一件事,下面暂时把 dd 看成一维信号,并相应地把位移 p\mathbf p 简写为 pp。接下来统一用帽子表示傅里叶变换,即 f^=F{f}\widehat f=\mathcal F\{f\}

继续分析需要依赖频域的3个特性:

  1. 信号 dd 平移 pp 之后,频谱只增加一个相位:
F{Tpd}(ω)=eiωpd^(ω).\mathcal F\{\mathcal T_p d\}(\omega) = e^{-i\omega p}\widehat d(\omega).
  1. 间隔为 MM 的梳状函数在频域中仍然是梳状函数,频谱副本之间的距离为 2π/M2\pi/M
F{IIIM}(ω)=2πMrZδ(ω2πrM).\mathcal F\{\operatorname{III}_M\}(\omega) = \frac{2\pi}{M} \sum_{r\in\mathbb Z} \delta\left(\omega-\frac{2\pi r}{M}\right).
  1. MM 倍下采样后,低分辨率图像在原图频率坐标中能够无混叠表示的范围是中心频带 ω<π/M|\omega|< \pi/M

因此,“先平移,再采样”得到的频谱是

d^s,p(ω)=eiωpMrZei2πrMpd^(ω2πrM).\widehat d_{s,p}(\omega) = \frac{e^{-i\omega p}}{M} \sum_{r\in\mathbb Z} e^{i\frac{2\pi r}{M}p} \widehat d\left(\omega-\frac{2\pi r}{M}\right).

如果是“先采样,再平移”,那么每一份频谱应该得到同一个相位:

d^s,pideal(ω)=eiωpMrZd^(ω2πrM).\widehat d_{s,p}^{\,\mathrm{ideal}}(\omega) = \frac{e^{-i\omega p}}{M} \sum_{r\in\mathbb Z} \widehat d\left(\omega-\frac{2\pi r}{M}\right).

两者的差别只在一个地方:

ei2πrMp.\boxed{ e^{i\frac{2\pi r}{M}p}. }

对于中心频谱 r=0r=0,这个因子永远等于 11

当位移刚好是 MM 的整数倍时,所有额外相位都等于 11

ei2πrM(mM)=ei2πrm=1.e^{i\frac{2\pi r}{M}(mM)} = e^{i2\pi rm} =1.

要让等式对任意位移 pp 都成立,就必须让中心频带中只剩下 r=0r=0 这一项。也就是说,下采样卷积后的信号必须满足

d^(ω)=0,ωπM.\boxed{ \widehat d(\omega)=0, \qquad |\omega|\geq\frac{\pi}{M}. }

π/M\pi/M 就是以 MM 为采样间隔时的奈奎斯特频率。在二维图像中,对应的无混叠区域是

NM={(ωx,ωy)  |  ωx<πM,  ωy<πM}.\mathcal N_M = \left\{ (\omega_x,\omega_y) \;\middle|\; |\omega_x|<\frac{\pi}{M}, \; |\omega_y|<\frac{\pi}{M} \right\}.

因此,下采样阶段对任意连续平移保持一致的条件是

d^(ω)=0,ωNM.\boxed{ \widehat d(\boldsymbol\omega)=0, \qquad \boldsymbol\omega\notin\mathcal N_M. }

又因为

d=hfd^=h^f^,d=h\ast f \qquad\Longleftrightarrow\qquad \widehat d=\widehat h\,\widehat f,

所以对于当前这张图像,真正需要满足的条件是

h^(ω)f^(ω)=0,ωNM.\boxed{ \widehat h(\boldsymbol\omega) \widehat f(\boldsymbol\omega)=0, \qquad \boldsymbol\omega\notin\mathcal N_M. }

如果希望这个结论对任意输入图像都成立,那么只能要求下采样核本身满足

h^(ω)=0,ωNM.\widehat h(\boldsymbol\omega)=0, \qquad \boldsymbol\omega\notin\mathcal N_M.

也就是说最理想的下采样卷积核是理想低通滤波器。虽然这无法在工程上实现,但是也得到了误差分析的方法,即只要让奈奎斯特频率限外的部分能量尽可能为0,就能降低混叠带来的视觉瑕疵。

问题就进一步变成了:找到一个足够好的低通滤波器(降采样卷积核),削弱奈奎斯特频率限外的能量。

在频谱图中检查奈奎斯特区域

青色方框标出了总计 88 倍下采样时的奈奎斯特区域:

N8={(ωx,ωy)  |  ωx<π8,  ωy<π8}.\mathcal N_8 = \left\{ (\omega_x,\omega_y) \;\middle|\; |\omega_x|<\frac{\pi}{8}, \; |\omega_y|<\frac{\pi}{8} \right\}.

方框内是低分辨率图像能够唯一表示的频率;方框外仍然存在的能量,会在抽取后折叠回方框内。

原图的傅里叶振幅频谱,中心用青色方框标出八倍下采样的奈奎斯特区域

原图频谱 f^|\widehat f|

原图经过单次二乘二 Box 卷积后的傅里叶振幅频谱,标出八倍下采样的奈奎斯特区域

单阶段 Box2x2:h^Box(1)f^|\widehat h_{\mathrm{Box}}^{(1)}\widehat f|

原图经过三次二乘二 Box 卷积后的傅里叶振幅频谱,标出八倍下采样的奈奎斯特区域

三阶段 Box2x2:h^Box(3)f^|\widehat h_{\mathrm{Box}}^{(3)}\widehat f|

原图经过三阶段 CrossBox 卷积后的傅里叶振幅频谱,标出八倍下采样的奈奎斯特区域

三阶段 CrossBox:h^Cross(3)f^|\widehat h_{\mathrm{Cross}}^{(3)}\widehat f|

单阶段 Box2x2 在方框边缘附近几乎保留了原图的全部频率能量;三阶段 Box2x2 已经明显压低了方框外的能量,但仍能看到规则的旁瓣。CrossBox 产生了更多穿过混叠区域的零线,对靠近奈奎斯特边界的多个方向衰减更强,同时仍保留少量具有方向性的旁瓣。

这四张图直接对应前面得到的判断条件:

h^(ω)f^(ω)0,ωN8.\widehat h(\boldsymbol\omega) \widehat f(\boldsymbol\omega) \approx0, \qquad \boldsymbol\omega\notin\mathcal N_8.

方框外越暗,能够带着位移相关相位折叠回中心频带的能量越少,运动中的闪烁也就越弱。

其他问题

当前实现存在的 Bug

只进行了单阶段 GPU 双线性插值,对奈奎斯特区域外几乎没有抑制作用。下采样层级越高,混叠现象越严重。

Box2x2 单阶段等效 Kernel
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
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
原图经过单次二乘二 Box 卷积后的频谱,标出八倍下采样奈奎斯特区域原图经过单次二乘二 Box 卷积后的频谱,标出八倍下采样奈奎斯特区域

还有更好的吗

每一行从左到右依次是:

  1. 三阶段卷积合成后的等效空间权重;
  2. 等效核自身的频率响应 h^K(3)|\widehat h_K^{(3)}|
  3. 原图经过等效核卷积后的频谱 h^K(3)f^|\widehat h_K^{(3)}\widehat f|

等效空间核按实际支持范围绘制:固定 2×22\times23×33\times35×55\times5 矩阵三阶段展开后分别为 8×88\times815×1515\times1529×2929\times29;两个程序化 Lanczos 则分别为 78×7878\times78134×134134\times134。暖色表示正权重,蓝色表示负权重;每张空间图按自身最大绝对权重归一化颜色,只用于观察权重的形状和正负分布。后两列中的青色方框仍然是总计 88 倍下采样的奈奎斯特区域,所有卷积结果继续使用与前文相同的对数亮度范围。

固定矩阵行画的是预设权重自身的离散响应;Lanczos 行画的是渲染器针对 22 倍比例和半像素相位实际生成的离散权重。边界寻址模式不进入这组无限平移不变的频率分析。CrossBox 这一行与前文的三阶段 CrossBox 使用完全相同的卷积核。

等效空间核
等效响应 h^K(3)|\widehat h_K^{(3)}|
卷积频谱 h^K(3)f^|\widehat h_K^{(3)}\widehat f|

Box2x2

NodeForge Box2x2 预设连续用于三次二倍下采样后的等效空间权重NodeForge Box2x2 预设连续用于三次二倍下采样后的等效频率响应,标出八倍下采样奈奎斯特区域原图经过三阶段 NodeForge Box2x2 等效核卷积后的频谱

Box3x3

NodeForge Box3x3 预设连续用于三次二倍下采样后的等效空间权重NodeForge Box3x3 预设连续用于三次二倍下采样后的等效频率响应,标出八倍下采样奈奎斯特区域原图经过三阶段 NodeForge Box3x3 等效核卷积后的频谱

CrossBox

NodeForge CrossBox 预设连续用于三次二倍下采样后的等效空间权重NodeForge CrossBox 预设连续用于三次二倍下采样后的等效频率响应,标出八倍下采样奈奎斯特区域原图经过三阶段 NodeForge CrossBox 等效核卷积后的频谱

Gaussian3x3

NodeForge Gaussian3x3 预设连续用于三次二倍下采样后的等效空间权重NodeForge Gaussian3x3 预设连续用于三次二倍下采样后的等效频率响应,标出八倍下采样奈奎斯特区域原图经过三阶段 NodeForge Gaussian3x3 等效核卷积后的频谱

Gaussian5x5

NodeForge Gaussian5x5 预设连续用于三次二倍下采样后的等效空间权重NodeForge Gaussian5x5 预设连续用于三次二倍下采样后的等效频率响应,标出八倍下采样奈奎斯特区域原图经过三阶段 NodeForge Gaussian5x5 等效核卷积后的频谱

Lanczos3

NodeForge Lanczos3 预设连续用于三次二倍下采样后的等效空间权重NodeForge Lanczos3 预设连续用于三次二倍下采样后的等效频率响应,标出八倍下采样奈奎斯特区域原图经过三阶段 NodeForge Lanczos3 等效核卷积后的频谱

Lanczos5

NodeForge Lanczos5 预设连续用于三次二倍下采样后的等效空间权重,其中蓝色格表示负权重NodeForge Lanczos5 预设连续用于三次二倍下采样后的等效频率响应,标出八倍下采样奈奎斯特区域原图经过三阶段 NodeForge Lanczos5 等效核卷积后的频谱

这些图直接比较了七个预设在同一条三阶段、总计 88 倍下采样链路中的等效行为。修正后的 Lanczos3/5 已经呈现出预期的近似砖墙低通:青色方框内保持接近平坦,过渡集中在边界附近,方框外大部分区域接近黑色。

在水平截止边界 ωx=π/8\omega_x=\pi/8 上,Lanczos3 与 Lanczos5 的三阶段幅度约为 0.5100.5100.5000.500。到了明显属于阻带的 ωx=3π/8\omega_x=3\pi/8,它们分别只剩约 0.00470.00470.00240.0024。Lanczos5 的过渡更陡、阻带更干净。

因此判断标准仍然是:方框外越暗,抽取后能够折叠回中心频带的能量越少;但不能把“整张图越暗”当作更好,因为低通同时必须保住方框内的通带。预设的名称本身不能说明抗混叠能力,真正需要比较的是三个尺度叠乘后的响应与输入频谱共同形成的 h^K(3)f^|\widehat h_K^{(3)}\widehat f|

CrossBox 的限制

卷积核决定每个频率会被衰减多少,但真正进入抽取步骤的是 h^(ω)f^(ω)\widehat h(\boldsymbol\omega)\widehat f(\boldsymbol\omega)。因此,即使使用同一个核,不同原始信号也会因为频率能量的分布不同而产生不同程度的混叠。

下面三列使用完全相同的 FFT、对数亮度范围和 88 倍下采样奈奎斯特方框。每列上方是原图,下方是对应的振幅频谱 f^|\widehat f|

带坐标轴和网格的 sinc 原始信号带坐标轴和网格的 sinc 信号频谱,标出八倍下采样奈奎斯特区域
带对角网格的 sinc 原始信号带对角网格的 sinc 信号频谱,标出八倍下采样奈奎斯特区域
替换后的 App 文件夹界面原始截图替换后的 App 文件夹界面截图频谱,标出八倍下采样奈奎斯特区域
带坐标轴和网格的 sinc 信号经过三阶段 CrossBox 滤波后的频谱
带对角网格的 sinc 信号经过三阶段 CrossBox 滤波后的频谱
替换后的 App 文件夹界面经过三阶段 CrossBox 滤波后的频谱

坐标轴与网格信号

对角网格信号

替换后的 UI 截图

UI 界面中高频信号主要是横竖方向的,CrossBox 正好对这两个方向的削减更强一些,效果更好。

结论

  1. CrossBox 是平衡开销和效果,在 UI 场景中比较好的下采样卷积核。
  2. CrossBox 也有局限,对角线高频信号消除能力较弱;静态场景 Box2x2 也足够,性能会更好。
  3. Lanczos 效果最好,但卷积核过大,甚至不如直接跑全量高斯。