你拿到一张扫描件,发给在线 OCR 工具,出来一堆错字——「3」认成「8」、「O」认成「0」、表格完全乱掉。这不是工具不行,是图片本身没准备好

OCR 引擎(Tesseract / PaddleOCR / 云服务)背后是字符识别模型,吃的是像素——你喂进去的是糊的、低分辨率的、带水印的、歪斜的图,它只能给你糊的输出。

实测一组数据(来自 OpenBenchmarking 和 ExpertBeacon 2025 年的对比测试):

引擎整体准确率价格
Google Cloud Vision96.7%按调用付费
Amazon Textract95.8%按调用付费
Microsoft Azure93.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 度基本不可用。

手动矫正

  1. 用任意编辑器旋转,0.5 度为单位微调,直到文字行完全水平
  2. 或者用 OpenCV 的 HoughLinesP 自动检测倾斜角

自动化方案Adobe ScanMicrosoft 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 的三个工具可以全部在浏览器本地跑——图片从头到尾不出你的电脑。

工作流

  1. 图片裁剪:把无关区域(水印、签名、印章、多余白边)切掉,留核心文字区域。
  2. 图片压缩:把图重新编码一次(Quality 80、宽度限制 1920px),去旧压缩伪影 + 控制大小。
  3. 批量图片转文字:.zip 上传或多图拖拽,逐张识别后打包下载,每张图一个 .txt + 合并文本 + CSV 索引。

为什么这套组合有效

  • 裁剪去干扰——水印、印章、多余边距不参与识别
  • 压缩去伪影——旧 JPEG 噪点被新编码覆盖
  • 批量 OCR 本地化——Tesseract.js 在浏览器里跑,数据不上传,适合发票、证件、内部文档

适合什么场景

  • 纸质合同 / 发票电子化:批量处理几十张扫描件
  • 书籍 / 论文摘录:把一段段截图批量转成可编辑文本
  • 会议白板、PPT 截图:拍照后批量转文字做会议纪要

不适合

  • 手写体(准确率低,需要云服务)
  • 复杂表格(行列错乱,需要专用结构化识别工具)
  • 公式、代码截图(识别率 50% 以下,不建议走 OCR)

图片转文字这件事,80% 的功夫在预处理,20% 在引擎调参。把上面五个步骤(分辨率、对比度、去噪、去倾斜、参数选型)做扎实,开源 Tesseract 也能跑出 95%+ 的准确率。

需要批量处理扫描件?打开 Piick 批量图片转文字工具,.zip 上传或拖几十张图进去,喝杯咖啡的功夫就能拿到合并好的文本文件。