有次同事拿着一份合同照片给我:"帮我把里面的条款抠出来,我要做对比表。" 合同 12 页,每页 800-1000 字。我用 OCR 工具识别,出来的结果一塌糊涂: 标点错位、表格变文字流、"0" 和 "O" 混杂、行尾的字号小的字直接漏掉。 最后我花了 1 小时手动校对,基本等于自己重打了一遍。
那次之后我研究了一下 OCR 怎么工作的。原理搞懂了,90% 的识别失败都能解释, 也能反推怎么拍照才能让识别率从 60% 提到 95% 以上。这篇就是这个逆向工程的结果。
OCR 在做的 3 件事(顺序很重要)
OCR 不是"看图认字"这么简单。它实际上是三个独立步骤串起来的:
- 图像预处理:把原图旋转摆正、去除噪点、调对比度,变成模型适合处理的标准格式
- 文字检测:在图里找出"哪些区域是文字"(画出文字行的边界框),哪里是图片 / 表格 / 空白
- 字符识别:把检测到的每一行文字,一个字一个字识别出来
多数人以为 OCR 重点是第 3 步("字符识别"够不够准),其实第 1 步和第 2 步出问题, 第 3 步再准也救不回来。这是 OCR 工具效果好坏的核心。
第 1 步出错:图像预处理
预处理失败最常见的 3 种:
问题 1:倾斜超过 5°,文字检测全错
文字检测算法假设文字"水平排列"。原图倾斜 5° 以内,模型可以校正过来; 倾斜 10° 以上,模型可能把同一行的左右两半识别成两行,识别结果完全乱套。
怎么避免:拍照时手机水平方向跟纸张水平方向对齐(俯拍时,手机长边对齐纸张长边)。 用 iOS / 现代 Android 的"扫描文档"功能,系统会自动检测纸张边缘并修正倾斜。
问题 2:光线不均匀,半张图变暗
你头顶有灯,纸张右半亮、左半暗。OCR 的预处理算法默认全图统一对比度, 右半的高亮区域可能被算法当成"过曝白纸",左半的暗区文字 OCR 当成"低对比度淡化文字"扔掉。
怎么避免:拍照前先看纸张表面有没有阴影。让光源在前方而不是头顶。 实在不行,在背景白纸下方塞张白纸做漫反射,光线就匀了。
问题 3:分辨率太低,字符分辨不出来
手机摄像头默认拍 4000×3000 像素的图,看起来很清楚。 但有些 OCR 工具会先把图缩放到 1024px 处理,这一缩,小字号的字直接糊成一团。
怎么避免:拍照时只拍重要内容,把不需要识别的部分裁掉。 原图就是"主要文字 + 极少空白"的话,工具缩放后仍然清晰。如果整张 A4 纸只用了中间 1/4 的内容, OCR 缩放后中间那块就只有 1/16 的有效像素了。
第 2 步出错:文字检测
第 2 步是"画文字边界框",它的失败模式比较微妙:
问题 4:多列排版被压成单列
报纸 / 杂志 / 学术论文经常 2 列或 3 列排版。没有"版面分析"功能的 OCR 工具 会把同一行从左到右扫一遍,把第 1 列第 1 行 + 第 2 列第 1 行连成一句话, 整篇看起来全乱了。
解决:用支持"自动版面分析"的 OCR(高端 OCR 默认带,免费的版本可能不带)。 实在没有,识别前手动把多列图裁成单列单独识别。
问题 5:表格被识别成文字流
表格的每个单元格是独立内容,但没有表格识别能力的 OCR 会把整张表格当文字段读,所有单元格内容混排,结构丢失。
解决:用带"表格识别"功能的 OCR 工具,它会输出结构化数据(可导出 Excel / CSV)。 如果你拿到的工具不支持表格识别,接受文本流后手动重建表格。
第 3 步出错:字符识别
字符识别的错误率受 3 个因素影响:
问题 6:相似字符混淆
- 0 / O / o:数字零和字母大小写 O 在多数字体下几乎相同
- 1 / l / I:数字一、小写 L、大写 I 在某些字体下完全相同
- "己 / 已 / 巳":中文里也有大量形近字
- "未 / 末"、"未 / 来"、"己 / 巳 / 已"
OCR 靠"上下文"区分:身份证号场景里 0 必然是数字,合同里"已签字"和"己签字"前者更可能。 但当上下文不明显时(如商品编码 A1B2C3),错误率上升。
问题 7:小字号被忽略
OCR 模型训练时主要用大字号文本,字号小于 8pt(图像中实际像素 < 20px 高)的字识别率明显下降。 合同里的"批注小字"、"页脚法律声明"经常被识别错。
解决:拍照时让小字部分占图的更大比例。如果整张 A4 上只关心页脚, 就单独拍页脚,小字也能放大到 OCR 容易识别的尺寸。
怎么拍照让识别率从 60% 提到 95%
综合上面 7 个错误模式,我现在拍要 OCR 的图片都按这套来:
- 用"扫描文档"模式(iOS Notes / Microsoft Lens / 印象笔记扫描),自动校正倾斜和透视
- 光线从前方过来(不要头顶光),纸张上没有阴影
- 距离 30-40cm,让纸张占满取景框 80% 以上
- 对焦在文字密集区域,等画面停下来再按快门
- 多页文档分页拍,不要一次拍两页(同时拍两页的话,两边的文字都不够清晰)
做这 5 件事,即便用普通 OCR 工具,中文印刷体识别率也能稳定在 95% 以上。
识别完了别忘了校对
OCR 永远做不到 100% 准确。识别完后必须人工校对的 3 个地方:
- 数字 / 字母混排:商品编号、身份证号、银行卡号 —— 这些位置 OCR 错一个字就报废
- 标点符号:OCR 经常把"。"识别成"."、","识别成"、",合同里这种错容易导致歧义
- 句末漏字:文字行右边缘的字符识别率比中间低,经常漏最后一两个字
总结
OCR 不是黑盒。它的 3 步处理流程决定了你拍照阶段就要做哪些事, 做好预处理 + 用对版面分析功能 + 知道哪些字符容易错,90% 的失败可以避免。
站里的图片识字 OCR 工具 内置自动倾斜校正 + 版面分析,中文识别率 96%+。识别后想保留排版可以直接导出富文本格式, 或者用PDF 转 Word 不乱码这篇里的流程二次加工。