CoderXL's Blog

Back

项目与实验 →

动机#


在原实现 ↗中,Dewarping 的模型输出会先加上基础坐标,再经过 15 次 3×3 均值滤波,得到效果较好的去扭曲图像。

这里被平滑的是完整的反向采样坐标图:它记录修复后每个位置应该从原图的哪里采样。平滑发生在 256×256 的预测网格上,之后才上采样到原图分辨率。

推测原实现采用多次平滑,可能有以下原因:

  1. 模型直接输出的坐标图存在局部不规则波动,对于文档类图片可能造成文字扭曲。
  2. 逐像素回归坐标并不直接保证相邻位置的变换一致,需要平滑补充这种约束。
  3. 纸张延展性差,除折痕等区域外,纸面的形变通常连续,邻近位置的采样关系也应平缓变化。

实验与分析#


为了观察平滑次数对去扭曲效果的影响,我测试了 [0, 1, 3, 5, 10, 15, 30, 60, 100] 这几种选项。

原图:

使用原版代码修复后:

修复效果较好,但是局部字句仍存在可见扭曲,且整张纸仍存在未展平的弯曲。

使用上述不同平滑次数,测试局部去扭曲效果:


可以看到,未经过平滑的输出极其扭曲,而经过 1 次平滑,字母级别的不规则扭曲大幅减轻。但即便到第 15 次,部分单词和句子仍然不直。

这支持了刚才 1. 的猜测:模型输出中存在可以被平滑有效抑制的局部波动。

此外,在这个样例中,进一步增加平滑次数到 100,局部字形仍有改善。当尝试到 1000 次时,边缘出现了明显的拉伸、放大:

要解释这种现象,可将均值滤波看作随机游走:对采样坐标图的每个分量,想象它的取值是一种可以流动的物质,每次均值滤波,相当于让物质向相邻位置扩散。这里的 3×3 均值滤波配合 cv2.BORDER_REPLICATE,可以理解为粒子如果试图离开网格,就留在对应的边缘位置。

这类似于一个有反射边界的离散扩散过程,其连续极限与热方程密切相关:

∂u∂t=D∇2u\boxed{ \frac{\partial u}{\partial t} =D\nabla^2u }

其中:

  • u(x,y,t)u(x,y,t) 表示采样坐标图中某个分量的取值;
  • DD 是扩散系数;
  • ∇2\nabla^2 是拉普拉斯算子。

反射边界对应零通量(Neumann)边界条件:

∂u∂n=0\frac{\partial u}{\partial n}=0

意思是物质不能从边界流出。对于这里采用的滤波方式,各坐标分量的均值保持不变,但坐标之间的差异会逐渐减小。

在这个过程中,边缘的坐标梯度先趋于平缓,影响再逐渐向内部扩展。相邻的输出位置从原图中越来越接近的位置采样,就会把原图的一小段内容铺展到更大的输出区域,表现为局部拉伸、放大。

这里还有一个关键:平滑完整坐标图,与只平滑位移并不相同。

令 xx 表示基础坐标,d(x)d(x) 表示模型预测的位移,则采样映射为:

ϕ(x)=x+d(x)\phi(x)=x+d(x)

记一次均值滤波为 BB,那么原实现得到的是 Bn(x+d)B^n(x+d),而只平滑位移得到的是 x+Bndx+B^n d。两者之差为:

Bn(x+d)−(x+Bnd)=Bnx−x\boxed{B^n(x+d)-(x+B^n d)=B^n x-x}

在内部区域,对称均值滤波可以保持线性的基础坐标;但在复制边界处,这种线性变化会被改变。因此,即使位移为零,平滑完整坐标图也会在边界引入变形。

这说明,边缘异常不仅涉及模型的预测,也涉及平滑对象与边界条件的选择。若一直平滑下去,各坐标分量最终会趋于常数,整个输出便会采样到原图的同一位置。

一个推论:收敛速度

对于长度为 NN 的一维数组,采用 33 点均值滤波和 REPLICATE,滤波矩阵的特征值为:

λk=1+2cos⁡(kπ/N)3\boxed{ \lambda_k=\frac{1+2\cos(k\pi/N)}3 }

其中 k=0,…,N−1k=0,\ldots,N-1.

最大的特征值:

λ0=1\lambda_0=1

对应常数坐标分量。

第二大的特征值:

λ1=1+2cos⁡(π/N)3\lambda_1=\frac{1+2\cos(\pi/N)}3

当 NN 很大时:

λ1≈1−π23N2\lambda_1\approx1-\frac{\pi^2}{3N^2}

因此,低频的不均匀部分衰减的时间尺度大约正比于:

N2\boxed{N^2}

也就是说,滤波网格宽度扩大 10 倍,要达到相似的均匀程度,通常需要大约 100 倍的滤波次数。

这里的 NN 是实际进行滤波的网格宽度。原实现固定在 256×256 的网格上平滑,因此,原始照片分辨率增加并不直接要求增加滤波次数。

思考#

我认为,均值滤波补充了模型输出中缺少的局部一致性约束,但是又未能纠正图像中的一些长程低频扭曲。它不仅抑制局部波动,也可能改变正确的采样关系,在边缘引入新的几何偏差。

因此,需要关心的不只是模型能否摆脱平滑,还包括平滑应该保留什么、消除什么。 真实折痕也可能包含高频变化,错误的整页弯曲也可能十分平滑,仅靠增加平滑次数无法区分二者。

进一步的工作可探讨增强模型自身输出的局部一致性,同时利用文档结构约束长程变形。这里的一致性也不能仅用“足够平滑”衡量:一个常数坐标图虽然极其平滑,却完全无法完成去扭曲。我们需要的是局部缩放、剪切合理,文字与页面结构都得到恢复的采样映射。

一些可以探索的方向:

  1. 利用文档排版的先验知识,约束同一文本行的基线平直、同一文本块的排版方向一致,为长程纠正提供目标。字母间距则应保留字体和排版本身的差异。
  2. 利用纸张延展性差的先验知识,通过共享控制点、连续网格或样条表示变形,增强邻近区域的联系。纸面的物理约束需要结合透视投影考虑,不能直接等同于图像平面上的局部刚性。
  3. 在训练中关注坐标场的局部导数,约束异常缩放、剪切和折叠,使逐像素的坐标精度与最终字形质量更一致。
  4. 根据区域特点调整平滑强度和边界处理方式,在抑制预测波动的同时保留真实形变。

可以留到未来进行的实验:

  1. 对恒等映射、已知仿射映射执行相同平滑,观察后处理自身引入的几何偏差。
  2. 对比平滑完整坐标图与只平滑位移的效果,并比较不同边界处理方式,分析边缘拉伸的来源。
  3. 在已知真实映射上加入不同尺度的误差,比较平滑消除了哪些误差,又改变了哪些正确变形。
  4. 在更多样例上比较不同平滑次数,分别观察页面中央和边缘,结合文本直线度、局部缩放、内容保留范围和 OCR 错误率评价结果。

这些实验可留到后续工作中进行,本文先记录不同平滑次数带来的现象及其分析。

Comment seems to stuck. Try to refresh?✨