搜索引擎与爬虫

爬虫系列:图像识别与文字处理

从 Google 的无人驾驶汽车到可以识别假钞的自动售卖机,机器视觉一直都是一个应用广泛且具有深远的影响和雄伟的愿景的领域。在接下来的几篇文章中,我们将重点介绍机器视觉的一个分支:文字识别,介绍如何用一些 Python 库来识别和使用在线图片中的文字。

当你不想让自己的文字被网络机器人采集时,把文字做成图片放在网页上是常用的办法。在一些联系人通讯录里经常可以看到,一个邮箱地址被部分或全部转换成图片。人们可能觉察不出明显的差异,但是机器人阅读这些图片会非常困难,这种方法可以防止多数垃圾邮件发送器轻易地获取你的邮箱地址。

利用这种人类用户可以正常读取但是大多数机器人都没法读取的图片、验证码( CAPTCHA )就出现了。验证码读取的难易程度也大不相同,有些验证码比其他的更加难读,后面我们会介绍这种问题。

但是,验证码并不是网络爬虫数据采集时需要进行图像转文字翻译工作的唯一对象。目前,有很多文档都是简单地扫描后直接放到网上,它们和互联网上的很多文档一样都没法儿直接使用,尽管它们都“近在眼前”。如果无法将图像转为文字,要想使用这些文档的内容,就只能人工手敲了——没人愿意花时间干这事儿。

将图像翻译成文字一般被称为光学文字识别(Optical Character Recognition, OCR)。可以实现 OCR 的底层库并不多,目前很多库都是使用共同的几个底层 OCR 库,或者是在上面进行定制。这类 OCR 系统有时会变得非常复杂。

OCR库概述

在读取和处理图像、图像相关的机器学习以及创建图像等任务中,Python 一直都是非常出色的语言。虽然有很多库可以进行图像处理,但在这里我们只重点介绍两个库:PillowTesseract

每个库都可以从它们的网站上下载并安装,或者用第三方管理器(像 pip)通过“pillow”和“pytesseract”进行安装。

Pillow

尽管 Pillow 算不上是图像处理功能最全的库,但是它拥有你需要使用的全部功能,除非你要用 Python 重写一个 Photoshop 或进行更加复杂的研究。它也是一个文档健全且十分易用的库。

Pillow 是从 Python 2.x 版本的 Python 图像库(Python Imaging Library, PIL)分出来的,支持 Python 3.x 版本。和 PIL一样,Pillow 也可以轻松地导入代码,并通过大量的过滤、修饰甚至像素级的变换操作处理图片:

from PIL import Image, ImageFilter


class ImageRecognitionWordProcessing(object):

    @staticmethod
    def process_image():
        kitten = Image.open("files/Snipaste_2022-04-06_10-36-03.png")
        blurryKitten = kitten.filter(ImageFilter.GaussianBlur)
        blurryKitten.save("files/Snipaste_2022-04-06_10-36-03_new.png")
        blurryKitten.show()


if __name__ == '__main__':
    ImageRecognitionWordProcessing().process_image()

在上面这个例子中,图片 kitten.jpg 会在默认的图片浏览器里打开,不过看着会有点儿模糊。之后这个比较模糊的图片被另存为 kitten_blured.jpg,与原图放在一个文件夹里。

我们可以用 Pillow 完成图片的预处理,让机器可以更方便地读取图片。除了这些简单的事情之外,Pillow 还可以完成许多复杂的图像处理工作。更多的信息,请查看 Pillow 文档

Tesseract

Tesseract 是一个 OCR 库,目前由 Google 赞助(Google 也是一家以 OCR 和机器学习技术闻名于世的公司)。 Tesseract 是目前公认最优秀、最精确的开源 OCR 系统。

除了极高的精确度,Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体(只要这些字体的风格保持不变就可以,后面我们会介绍),也可以识别出任何 Unicode 字符。

Tesseract 是一个 Python 的命令行工具,不是通过 import 语句导入的库。安装之后,使用 tesseract 命令在 Python 的外面运行。

安装 Tesseract

在 Windows 系统上,可以下载 Tesseract 安装文件,安装即可。

Linux 用户可以通过 apt-get 安装:

$sudo apt-get install tesseract-ocr

要使用 Tesseract 的功能,比如后面的示例中训练程序识别字母,你需要先在系统中设置一个新的环境变量 $TESSDATA_PREFIX,让Tesseract 知道训练的数据文件存储在哪里。

在大多数 Linux 系统和Mac OS X 系统上,你可以这么设置:

$export TESSDATA_PREFIX=/usr/local/share/

值得注意的是,虽然 /usr/local/share/ 是 Tesseract 的默认数据存储位置,但是你还是应该仔细地检查一下,确保自己的安装没问题。

在 Windows 系统上也类似,你可以通过下面这行命令设置环境变量:

#setx TESSDATA_PREFIX C:\Program Files\Tesseract OCR\

NumPy

虽然 NumPy 并非解决 OCR 问题时必须使用的库,但是如果你想训练 Tesseract 识别互联网上一些图片验证码,那么就会用到它。NumPy 是一个非常强大的库,具有大量线性代数以及大规模科学计算的方法。因为 NumPy 可以用数学方法把图片表示成巨大的像素数组,所以它可以流畅地配合 Tesseract 完成任务。

和其他 Python 库一样,NumPy 可以通过第三方包管理器(比如pip)来安装:

$pip install numpy