如何从图片里提取文字(截图、扫描件、照片)
一段文字的截图,在你眼里是文字,在计算机眼里是一片彩色像素。你选不中它、搜不到它、也没法粘进文档。信息就在那儿,只是被锁在图片里。
光学字符识别(OCR)就是把它解锁的过程——读那张图,把它代表的字符重建出来。这活儿以前得靠专用软件加一台扫描仪。现在它跑在一个浏览器标签页里,跑在你手上这台设备上。
OCR 到底做了什么
它不是一步,而是一条流水线。搞清楚这几步,你就能明白为什么有些图转得干干净净,有些却出来一堆乱码。
预处理。 引擎把图片转成灰度,再转成黑白,选一个阈值把墨迹和背景分开。它可能还会修正轻微的旋转,并估算文字所在的基线。
版面分析。 在读任何字之前,引擎先判断页面上有什么:哪块是文字、哪块是图、行是怎么排的、有没有分栏。这一步判断错了,输出就会把不相关的块搅在一起。
行与词切分。 在一个文字区域里,引擎先找到行,再把行切成词,再把词切成单个字符。
字符识别。 这才是大家心目中“OCR”的部分。像 Tesseract 这样的现代引擎用的是在数百万文字样本上训练过的神经网络。它不是一次匹配一个字符,而是读一整行像素,预测最可能的字符序列——这就是它处理粘连字母和奇怪字体时,比老引擎强得多的原因。
语言模型。 最后,引擎用词典和语言规则修掉明显的错误。这就是为什么告诉工具正确的语言如此重要:rn 和 m 在识别器看来几乎一样,只有词典知道哪个才是真的词。
什么决定了结果的好坏
准确率不是工具的属性,是你喂给它的那张图的属性。
分辨率。 文字需要足够的像素才能有清晰的字形。经验法则是:一个大写字母至少要有 20 像素高。扫描件 300 DPI 是长期以来的标准,这不是没道理的——低于这个值,细笔画就开始粘连。
对比度。 白底黑字最理想。灰字配米色背景,或者文字压在照片上,都会逼着阈值那一步去猜,而它总会在某些地方猜错。
倾斜。 斜着拍的一页是真问题。引擎能自动修正几度,但偏轴 15 度拍出来的照片会退化得很厉害。把照片或扫描件摆正。
字体。 干净、常见的字体——Arial、Helvetica、Times 和标准网页字体——转出来近乎完美。装饰字体、窄体,以及任何字母快要贴在一起的字体,都会丢字符。
语言。 这是最被低估的一个设置。英文模型去读中文,出来的是噪音;中文模型去读英文,出来的字符看着对、意思全无。选对真实语言,如果文档混排就选双语模式。
从一张糟糕的图片里榨出最好结果
大部分让人失望的 OCR 结果,在你跑工具之前就能救回来。
裁到只剩文字。 边框、阴影、背景杂物都在消耗准确率。把图裁到只剩文字区域,等于把它们整个从问题里拿掉。
放大。 文字小的话,识别前先把图放大有帮助——一张低分辨率截图放大 2 倍,往往比原图效果更好。引擎需要像素,而插值给它的东西比一张又细又有锯齿的原图更多。
提高对比度。 一张褪色的手机拍小票照片,如果在识别前拉高对比度,效果会大幅改善。阈值那一步要猜的东西少了。
摆正。 把斜的拍摄转回水平。哪怕只是几度也有差别。
工具吃力就换格式。 有些引擎处理 PNG 比 JPEG 好,因为 PNG 在字母边缘没有压缩伪影。源图压缩很重时,先转成无损格式可能有帮助。
运行识别
- 打开图片转文字工具。
- 添加图片——截图、扫描件或照片都行。
- 选择语言,文档混排就选双语模式。
- 运行,然后复制或下载提取出的文字。
引擎在你的设备上运行。你的图片不会被上传到任何地方——这一点对 OCR 比对几乎任何其他文件操作都更重要,因为人们需要识别的那类图片,很少是中性的。
为什么这里的隐私问题更尖锐
想想人们实际会拿去 OCR 的都是什么:护照照片、身份证、银行流水、病历、合同、签过字的表格、私聊截图。你需要从中提取文字的那类图片,几乎从定义上就是最不该出现在陌生人服务器上的那类。
一个上传式的 OCR 服务,收到的正是这类文件的完整高清副本。你无从核实它后来去了哪儿,而这类文件本身往往可识别——一张护照扫描件带着姓名、号码和一张照片。
在本地跑 OCR 就把这个问题消掉了。识别速度比不上有 GPU 的服务器集群,但图片从头到尾没离开你的设备。这笔账的推理写在在线文件转换工具安全吗里。
OCR 现在还是搞不定的地方
对边界要有清醒认识。
手写。 现代引擎对工整的印刷体很好,对手写很差。连笔字基本没戏。没有任何设置能解决这件事。
极低分辨率。 文字低于大约 10 像素高时,图里的信息已经不足以可靠还原。放大能救一点,再往上就只是在放大那团模糊。
文字压在杂乱背景上。 照片上的字幕、带花纹包装上的文字、复杂场景里的标牌,都会让阈值那一步失效。
表格。 OCR 读的是文字,不是结构。转出来的表格通常是一串没有单元格边界的数据。重建表格是另一步。
数学符号和特殊记号。 标准字符集能处理;公式、乐谱、生僻符号一般不行。
文字提取出来之后
提取很少是最后一步。通常你需要把文字放进文档——如果 PDF 自带文字层,可以走 PDF 转 Word;但扫描版 PDF(本质就是图片)仍然需要先 OCR。
如果你是从 iPhone 照片开始的,注意 HEIC 文件在某些工具里需要先转成 JPG,不过浏览器端工具通常能直接读。
还有,务必校对。就算准确率有 95%,一页 500 个词里也大约有 25 个错字,而且它们偏偏集中在数字和名字上——恰恰是你最不能出错的地方。
常见问题
OCR 的结果能不经核对直接信吗? 不能。即便在干净的扫描件上,也要预期 1–5% 的错误率,集中在标点、形近字符和数字上。任何要发布或要用来做判断的内容,都必须校对。
OCR 能读手写吗? 很差。工整的印刷体手写有时能认;连笔字基本不行。目前没有哪个浏览器端引擎能可靠处理。
为什么我的中文转出来是乱码? 因为语言模型设成了英文。英文模型去读汉字,会产出看起来像拉丁字母的东西。把语言设成中文或双语。
跑 OCR 之前需要先转换图片吗? 一般不用。浏览器端工具能直接读常见格式。如果源图是压缩很重的 JPEG,转成 PNG 可能有帮助,因为字母边缘的压缩伪影会干扰识别。
扫描版 PDF 能用 OCR 吗? 需要先把页面提取成图片,再逐张识别。自带文字层的 PDF 根本不需要 OCR——你可以直接复制。