拍摄质量如何影响识别结果:几个可量化的观察

2026-10-12

识别效果差的时候,第一反应总是「模型不行」。但实际上大部分失败样本的问题在输入端——图拍得不好,再强的模型也救不回来。这篇记录我用同一张小票重复拍摄、控制变量做对比的观察方法和几个结论。

先说方法:怎么让对比有意义

随手拍几张对比没有意义,因为变量太多。我的做法是:

  1. 固定一张样本票据,用铅笔在某处做微小标记,保证每次拍的确实是同一张。
  2. 每次只改一个条件:只改光照、或只改角度、或只改距离。其他条件尽量保持一致。
  3. 记录字段级准确率而不是字符级。商户、日期、总金额、商品行数这四个字段各自对不对,比「整页字符准确率 96%」有用得多——后者高不代表关键字段没错。
  4. 每类条件至少三张,避免单次偶然。

这套方法土,但能定位问题。用字符准确率做指标经常会掩盖问题:整页三百个字错三个,准确率看着漂亮,但那三个字很可能正好在金额上。

观察一:光照不均比整体偏暗更致命

整体偏暗的图,做一次对比度拉伸基本能救回来,识别率下降有限。真正麻烦的是局部过曝:手机补光或者顶灯直射,小票某一侧变成一片白,那一片的文字信息物理上就没了,任何后处理都补不回来。

处理办法是不要用全局阈值二值化,改用局部自适应阈值(Sauvola 或局部均值),让每个小块自己算阈值。代价是纸面噪点会被放大,所以阈值之后通常还要做一次连通域过滤,把面积过小的噪点清掉。

观察二:透视畸变的代价比想象中高

斜着拍造成的梯形畸变,肉眼看着「还能读」,但 OCR 的检测框会明显变差。原因是训练数据里绝大多数文本是水平排列的,倾斜角度一大,检测的置信度就掉,漏检随之出现。

处理顺序很关键:先做透视矫正,再进识别。矫正靠检测票据的四个角点,做四点透视变换。这里有个细节:角点检测不需要很精确,误差几个像素对最终结果影响不大,但如果检测失败(比如票据边缘和桌面颜色接近),整个矫正就会变形,比不矫正更糟。所以我会加一个判断——检测到的四边形面积和内角明显异常时,直接放弃矫正,走原图。

观察三:热敏纸褪色是可以部分抢救的

放了一两年的热敏纸小票,字迹会发灰、对比度极低。这类图的处理顺序我试下来是这样:

  1. 先转灰度,做对比度拉伸(按分位数截断,不要用最大最小值,否则噪点会被拉爆)。
  2. 再做自适应阈值。如果拉伸后依然二值化失败,说明对比度低到阈值法无效,改用边缘增强。
  3. 实在救不回来就放弃——识别出错误内容比识别不出来更危险,因为后处理无法分辨哪个字段是错的。

预处理的目标不是让图片变好看,是让检测器能框出文字。所以评价预处理是否有效,应该看检测阶段的召回率有没有提升,而不是看人眼看着是否清晰。

几个与分辨率有关的经验值

小结

做下来最大的体会是:预处理阶段每一个操作都会影响后面的环节,顺序错了效果会互相抵消。比如先二值化再矫正,二值化时产生的噪点会在矫正时被插值放大;先做锐化再降噪,锐化放大的噪点又会被降噪抹掉真实笔画。所以流程顺序要固定下来,一次只改一处,用字段级准确率验证,而不是凭感觉调。

← 返回首页