OCR (光学字符识别)
从图像或扫描文档中自动识别文字,并将其转换为可编辑文本数据的技术。用于纸质文档的数字化和图像中的文字提取。
OCR (Optical Character Recognition,光学字符识别) 是识别图像中所含文字并将其转换为文本数据的技术。扫描纸质文件进行数字化、读取照片中招牌上的文字、从 PDF 的图像页面提取文本,这些处理都是 OCR 的应用。用手机摄像头读取名片的应用,内部运行的也是 OCR。
OCR 的处理流程是预处理 → 文字区域检测 → 文字识别 → 后处理这四个阶段。预处理进行图像的倾斜校正、噪声去除和二值化 (黑白转换)。文字区域检测确定图像的哪些部分含有文本。文字识别把检测到的文字图像转换为文本。后处理利用词典和语言模型修正识别结果中的错误。不过这四个阶段是早期就有的构成,基于深度学习的引擎中也有把区域检测与文字识别放进同一个模型一体训练的做法,阶段之间的界线并不总是清晰。
中文 OCR 的难度高于英文。常用汉字的数量庞大 (2013 年发布的《通用规范汉字表》收录 8,105 个汉字,其中一级字表为 3,500 个;GB 2312 收录 6,763 个汉字),字形相近的汉字很多 ("未"与"末"、"土"与"士"),简体与繁体并存,横排与竖排共存,这些因素都会拉低识别精度。识别精度并不只由引擎的新旧决定,印刷体还是手写体、分辨率与纸张状态、表格和分栏的复杂程度都会让结果大幅变化。印刷清晰的正文能达到够用的精度,而写得潦草的手写体、与表格线重叠的文字至今仍是薄弱环节。看到用数字讲精度的资料时,务必确认那个数值是在什么类型的文档上测出来的。
OCR 的识别精度直接关系到字数统计的准确性。单个字符的识别错误不会改变字数,但字符的合并 (把 2 个字符识别成 1 个) 或拆分 (把 1 个字符识别成 2 个) 会改变字数。手写文字的字间距不均匀,尤其容易出现合并与拆分的错误。在信任 OCR 结果的字数之前,需要先验证识别精度。
有代表性的 OCR 引擎包括开源的 Tesseract、Adobe Acrobat 内置的 OCR、Microsoft 的 Azure AI Vision 等,它们都支持多语言。Tesseract 最初由惠普开发,2005 年作为开源软件公开,2006 年至 2017 年由 Google 主导开发,此后由社区维护。哪个引擎适合自己的文档,取决于对象是印刷体还是手写体、版面有多复杂,因此用手头的样本实际比对读取结果最为可靠。使用云端 OCR 服务时,需要事先确认这等于把机密文档发送到外部服务器。应当根据用途,在本地运行的引擎与云端服务之间做出取舍。
OCR 是把"纸面上的字数"接到"数字文本的字数"的桥梁技术。把 400 字的手写稿纸数字化时,OCR 的识别结果不一定正好是 400 个字符。识别错误、空白的处理方式、换行的解释都会让字数发生变动。有的引擎会把稿纸上的空格子输出成空白字符,分栏或竖排的文档还可能把列的阅读顺序读颠倒。经过 OCR 的文本,请在数字数之前先加入人工确认与修正的工序。