你拿到一张扫描件,发给在线 OCR 工具,出来一堆错字——「3」认成「8」、「O」认成「0」、表格完全乱掉。这不是工具不行,是图片本身没准备好。
OCR 引擎(Tesseract / PaddleOCR / 云服务)背后是字符识别模型,吃的是像素——你喂进去的是糊的、低分辨率的、带水印的、歪斜的图,它只能给你糊的输出。
实测一组数据(来自 OpenBenchmarking 和 ExpertBeacon 2025 年的对比测试):
| 引擎 | 整体准确率 | 价格 |
|---|---|---|
| Google Cloud Vision | 96.7% | 按调用付费 |
| Amazon Textract | 95.8% | 按调用付费 |
| Microsoft Azure | 93.5% | 按调用付费 |
| Tesseract(开源) | ~90% | 免费,本地运行 |
注意那个 ~90% 是「理想输入」下的数字。如果你直接拿手机翻拍屏幕、拿 PDF 转的低分辨率图丢进去,准确率掉到 60-70% 是常态。
本文讲清楚怎么把这 60% 拉到 95%——五个预处理步骤,每一个都附「怎么做、做到什么程度」的实操阈值,最后给一套纯前端的工作流(图片压缩 + 图片裁剪 + 批量 OCR)。
第一步:分辨率——DPI 不能低于 300
OCR 模型是在 300 DPI 的扫描件上训练出来的。你给它 800×600 的截图,它认不出小字;给它 4000×3000 的原图,它能慢慢推但浪费算力。
经验阈值:
- 印刷体正文:长边至少 2000 像素(约 A4 纸 300 DPI)
- 表格、收据、票据:长边至少 2400 像素(细节更多)
- 手写体:长边 3000+ 像素(字符变化大,需要更多上下文)
- 手机翻拍:长边至少 2500 像素,且保持平整
低于这个阈值,再强的引擎也救不回来。手机拍文档专用 App(Adobe Scan、Microsoft Lens)会自动切边 + 矫正 + 拉到合适分辨率,强烈推荐装一个。
但如果原始素材已经是低分辨率扫描件,别用插值放大——会糊得更厉害。重新扫描是唯一出路。
第二步:对比度——黑够黑、白够白
OCR 模型靠像素灰度差判断字和背景。对比度拉满的字最容易认。
具体做法:
- 白底黑字最佳。彩色字、灰底字、反白字(白字黑底)都会显著降低准确率。
- 如果原图是淡蓝底灰字,用任意图片编辑器把饱和度降到 0、对比度拉到 +50——OCR 准确率能涨 10-20 个百分点。
- 扫描老旧文档有「纸面发黄」问题——把色温往冷调拉一点(去黄),或者直接转灰度(Grayscale),OCR 模型更擅长灰度。
快速验证:图片放大到 100%,肉眼能不能 1 秒内读出每个字?如果不能,OCR 大概率也不能。
第三步:去噪——摩尔纹、压缩伪影、水印
三类噪声最伤 OCR:
| 噪声类型 | 来源 | 解决 |
|---|---|---|
| 摩尔纹 | 屏幕翻拍 | 用专用 App(Adobe Scan),或换角度重拍 |
| JPEG 压缩伪影 | 反复保存的 JPG | 重新转 PNG 后再 OCR |
| 水印、印章、批注 | 原始文件就有 | 先用 图片裁剪 把非文字区域切掉 |
实测中,带半透明水印的发票会让 OCR 把水印字符也认进去,跟正文混在一起,输出完全没法用。
最稳的做法:OCR 之前,先用 图片压缩 重新转一次格式(PNG → JPG 或反之),既能去掉旧的压缩伪影,又能控制最终文件大小。
第四步:去倾斜——超过 3 度准确率就掉
Tesseract 对倾斜角度非常敏感。倾斜 0-3 度影响不大,超过 5 度准确率断崖式下跌,超过 10 度基本不可用。
手动矫正:
- 用任意编辑器旋转,0.5 度为单位微调,直到文字行完全水平
- 或者用 OpenCV 的
HoughLinesP自动检测倾斜角
自动化方案:Adobe Scan、Microsoft Lens、百度网盘扫描 这类 App 都内置自动切边 + 矫正——拍完就是正的、方的,直接喂 OCR 就行。
如果素材是从 PDF 导出的,PDF 阅读器自带的旋转功能就够用。
第五步:选对引擎和参数
做好上面四步预处理后,最后一步是引擎 + 参数选择。
引擎选型:
| 场景 | 推荐引擎 |
|---|---|
| 英文印刷体 | Tesseract eng(开源、免费、本地) |
| 中文印刷体 | Tesseract chi_sim + eng(组合) |
| 表格、票据 | 专用结构化识别(PaddleOCR、Amazon Textract) |
| 手写体 | 云服务(Google ML Kit、百度手写体识别) |
Tesseract 关键参数:
--psm 6:假设是统一的文本块(大多数文档场景)--psm 11:稀疏文本(菜单、收据、招牌)--psm 12:配合 OSD(Orientation and Script Detection)自动检测方向preserve_interword_spaces=1:保留词间空格(中文不要开)
跑批量之前,先用单张图测试 5 分钟,调好参数再批量。批量场景下,参数不对浪费的是几十分钟。
实操:纯前端三件套工作流
不想装软件、不想上传文件到云端(涉及隐私)?Piick 的三个工具可以全部在浏览器本地跑——图片从头到尾不出你的电脑。
工作流
- 图片裁剪:把无关区域(水印、签名、印章、多余白边)切掉,留核心文字区域。
- 图片压缩:把图重新编码一次(Quality 80、宽度限制 1920px),去旧压缩伪影 + 控制大小。
- 批量图片转文字:.zip 上传或多图拖拽,逐张识别后打包下载,每张图一个 .txt + 合并文本 + CSV 索引。
为什么这套组合有效
- 裁剪去干扰——水印、印章、多余边距不参与识别
- 压缩去伪影——旧 JPEG 噪点被新编码覆盖
- 批量 OCR 本地化——Tesseract.js 在浏览器里跑,数据不上传,适合发票、证件、内部文档
适合什么场景
- 纸质合同 / 发票电子化:批量处理几十张扫描件
- 书籍 / 论文摘录:把一段段截图批量转成可编辑文本
- 会议白板、PPT 截图:拍照后批量转文字做会议纪要
不适合
- 手写体(准确率低,需要云服务)
- 复杂表格(行列错乱,需要专用结构化识别工具)
- 公式、代码截图(识别率 50% 以下,不建议走 OCR)
图片转文字这件事,80% 的功夫在预处理,20% 在引擎调参。把上面五个步骤(分辨率、对比度、去噪、去倾斜、参数选型)做扎实,开源 Tesseract 也能跑出 95%+ 的准确率。
需要批量处理扫描件?打开 Piick 批量图片转文字工具,.zip 上传或拖几十张图进去,喝杯咖啡的功夫就能拿到合并好的文本文件。