晚上朋友发微信问能否帮忙折腾个东西: 明天需要整理出一份Word文档,大部分内容来自一篇公众号文章,文章内容由一张张图片组成,好几十张,字数很多

朋友的问题是:手动输入太累了,能否帮她用程序把图片内容转成文本,放在Word文档里

我看了下她发过来的公众号文章,内容确实很长,好在虽然用的是图片,字体还算端正。不过用电脑打开后看,字体比较小,不大清晰。

试着折腾了一下,大约花了半小时。记录下过程

思路

从图片中提取出文字内容是个OCR(Optical Character Recognition,光学字符识别)问题

首先想到的是自然是大名鼎鼎的Tesseract

我比较懒,想到现在云端工具那么多,何必为这个小任务多折腾,找个好用的云端工具,5分钟弄好继续看书

准备工作

微信中的图片是webp格式(可以通过chrome调试工具查看),我把整站保存后,资源文件夹中,图片有一堆,不过没带后缀,在ipython中写2行程序为所有文件,加上.webp后缀

捷径

之前在折腾冲顶大会外挂时,觉得百度OCR识别率还不错。为百度OCR做过简单的Python包装,想着用它来试试

当时的百度OCR接口只接收jpg图片,我们先使用ffmpeg吧webp图片转为jpg

ffmpeg -i 640\(1\).webp 01.jpg

ps: 640\(1\)是微信公众号文章保存后某个图片的默认名字

之后使用百度OCR工具对01.jpg做识别,效果很烂,可能是图片不够清晰或其中字数很多的缘故

我换了其他几个云端OCR工具,效果都不好

正好上个周末在用Tesseractopencv和树莓派帮朋友折腾个项目:目标是利用树莓派摄像头从身份证中提取信息,对tesseract还算熟悉,于是决定用Tesseract来折腾试试

环境安装

根据你自己的系统,按照官方wiki里的方式安装:tesseract Installation

我用的是mac,使用:brew install tesseract来安装

我的tesseract版本是

1
2
3
4
>>> tesseract -v
tesseract 3.05.01
 leptonica-1.75.3
  libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8

我们的目标是识别简体中文,如果你不打算自行训练模型的话,可以直接下载官方训练好的

进入到模型存放目录/usr/local/Cellar/tesseract/3.05.01/share/tessdata,根据系统和tesseract不同,做相应调整。如果你不知道目录在哪儿也没关系,往下读,待会儿在你实际运行命令,缺少相应语言模型的时候,系统会告诉你语言模型该放置的的目录

在这儿下载官方训练好的简体中文模型:wget https://github.com/tesseract-ocr/tessdata/raw/master/chi_sim.traineddata

更多语言模型可以参考tessdata

完成之后,我们就可以使用tesseract在本地提取图片中的文字了

使用tesseract

前边的准备工作中,我们已经从微信公众号下载下来的一堆webp图片转为一堆的jpg图片:01.jpg-020.jpg

我们先来试着将一张图片转为文本内容看看

tesseract -l chi_sim /tmp/01.jpg /tmp/output

ps:如果你没下载chi_sim(简体中文模型),系统会告诉你该在什么目录下放置这个模型

图片里边文字较多,执行识别操作需要一会儿时间,完成后,在本地生成一个output.txt文件,将文本内容对照原图,正确率在90%以上!出错的地方主要是容易识别为'

于是我们在ipython中简单写几行来遍历处理所有图片:

1
2
3
import subprocess
for i in range(1,21):
    subprocess.call("tesseract -l chi_sim 0{}.jpg   output_{}".format(i,i),shell=True)

ps: 如果想用更Pythonic的方式使用tesseract,你可以看看pytesseract

洗个澡回来,全部处理完毕,再写个和上边类似的几行代码,把所有output文件粘合起来,放到Word里,任务完成