OCR 最危险的错误不是识别出一堆乱码 —— 乱码你一眼就能发现。危险的是识别出一个看起来很合理的错字:合同编号里的 O 变成 0,手机号里的 1 变成 l,金额里的 8 变成 B 少了一半。你带着它填进系统,直到提交失败或者更晚才暴露。

为什么会有这类错

识别模型判断的是字形,而很多字符在小尺寸下本来就长一样:无衬线字体里 0 和 O、1 和 l 和大写的 I、2 和 Z、5 和 S、8 和 B、6 和 G,笔画差异只在一个开口方向或一小段倾斜。

放大到 40 像素高,这些差别清晰可见;压到 12 像素,开口只有 1 个像素宽,加上压缩噪点,人和机器都无从判断。

三个会放大这个现象的操作:远拍后再缩小(最常见)、转发时被压缩、深色底浅色字。

五类必须逐字核对的内容

按出错代价排序:

  1. 编号类:身份证号、订单号、合同号、发票号、统一社会信用代码。规则明确、位数固定,错一位就完全无效
  2. 金额:小数点前后的数字、大写金额那一行。注意小数点本身可能被识别成逗号或直接丢失
  3. 联系方式:手机号、固话分机号、邮箱(尤其含数字和点的)
  4. 日期:年份里的 0、月份里的 1
  5. 专有名词:人名、公司名、地名里的形近字(「未/末」「己/已」「戊/戌/戎」)

前三类的共同点是无法靠语感发现错误 —— 「13810001234」和「l38l000l234」看起来都像手机号。

三个实用的检查动作

用位数规则筛。 身份证 18 位、手机号 11 位、统一社会信用代码 18 位。识别结果粘进表格后,先用 LEN 函数算长度,长度不对的直接标红。这一步能在 1 分钟内挑出一半问题,方法参见 #REF!、#DIV/0!、#VALUE!、#NAME? 分别代表什么、怎么修 里对文本长度的处理思路。

用字符集规则筛。 编号里不该出现字母、手机号里不该出现 l 和 O。文本框里做一次查找替换,把可疑字母逐个定位。TXT 文本处理 支持启用正则的查找替换并显示命中次数,比在记事本里 Ctrl+F 快。

对照原图读,而不是对照识别结果读。 校对时最容易犯的错是只盯着文本看 —— 大脑会自动把错字「读对」。正确做法是原图和文本并排放,逐字段点读,两个都看过的字段才算核过。

一个减少错误的取图习惯

同一份内容,宁可多花 30 秒截一张大一点、只含目标区域的图,也不要拿整页缩略图去识别。单行文字高度低于 10 像素时,形近字错的概率明显上升;把关键区域放大到 25~40 像素高再识别,是投入产出比最高的一步。

最后必须说清的事

识别接口是阿里云读光与百度智能云提供的,没有任何 OCR 能保证全对,形近字符尤其如此 —— 这是能力边界,不是操作问题。重要内容请人工校对;如果一段文本的准确性直接决定能不能付款、能不能提交材料,那么它就只能靠人核,靠换工具解决不了。