爬虫识别
搜索引擎与爬虫

爬虫系列:处理格式规范的文字

处理格式规范的文字

在上一篇文章中我们介绍了图像识别与文字处理,同时还讲解了有哪些基本的 OCR 库。

你要处理的大多数文字都是比较干净、格式规范的。格式规范的文字通常可以满足一些需 求,不过究竟什么是“格式混乱”,什么算“格式规范”,确实因人而异。

  • 使用一个标准字体(不包含手写体、草书,或者十分”花哨的“字体)

  • 虽然被复印或拍照,字体还是很清晰,没有多余的痕迹或污点

  • 排列整齐,有歪歪斜斜的字

  • 没有超出图片范围,也没有残缺不全,或紧紧贴在图片的边缘

文字的一些格式问题在图片预处理时可以进行解决。例如,可以把图片转换成灰度图,调整亮度和对比度,还可以根据需要进行裁剪和旋转。但是,这些做法在进行更具扩展性的训练时会遇到一些限制。

下面是一个标准文字的理想示范:

test text

上面的图片我们转换成 tif 文件格式,使用 Tesseract 来读取。

我们使用如下命令将图片中的文字转换成文本内容:

tesseract.exe "E:\我的文档\My Pictures\Saved Pictures\test-text.max_344x194.tif" "E:\我的文档\My Pictures\Saved Pictures\textoutput.txt"

最后运行结果如下:

Tesseract 图片转换文字

第一行输出的是 Tesseract 版本信息,我们查看一下结果:

This is some test text for image
recognition.

我们呢可以看到识别的很准确,但是互联网上的图片有的包含渐变,有的还包含有背景,这会使文字变得越来越难以识别,当我们遇到这类问题的时候,我们首先需要使用 Python 脚本对图片进行清理。

例如下面的图片,包含渐变和特殊符号,我们使用 Tesseract 来识别图片中的内容。

Pictures containing special symbols

使用 Tesseract 识别结果:

Tesseract recognizes the results of images containing special symbols

利用 Pillow 库,我们可以创建一个阈值来过滤渐变的背景色,只把文字留下,从而让图片更加清晰,便于 Tesseract 读取:

import os

from PIL import Image, ImageFilter


class ImageRecognitionWordProcessing(object):

    @staticmethod
    def clean_file(file_path, new_file_path):
        image = Image.open(file_path)

        # 对图片进行阈值过滤,然后保存
        image = image.point(lambda x: 0 if x < 180 else 255)
        image.save(new_file_path)


if __name__ == '__main__':
    ImageRecognitionWordProcessing().clean_file(os.path.join(os.getcwd(), "files/test-text_has_symbol.max_340x194.jpg"),
                                                "text_2_clean.png")

我们看看处理后的图片效果:

处理之后的图片效果

我们使用 Tesseract 读取图片内容,结果如下:

使用 Tesseract 读取处理之后的图片内容

通过上图可以看到与刚才的结果更准确了,大部分的符号被读取出来了。

! 被识别成了 1^ 被识别成了 A() 被识别成了 0,通过上面错误的部分,我们看出符号与识别错误的内容十分相像,所以才出现这些错误。

Tesseract 最大的缺点是对渐变背景色的处理。之前那个版本中,Tesseract 的算法在读取文字之前自动尝试调整图片对比度,但是如果你用 Pillow 库这样的工具对图片进行预处理,效果会更好。

在提交给 Tesseract 处理之前,那些带标题的、带有大片空白的图片,或者有其他问题的图片,都应该做预处理。

从网站图片中抓取文字

用 Tesseract 读取硬盘里图片上的文字,可能不怎么令人兴奋,但当我们把它和网络爬虫组合使用时,就能成为一个强大的工具。网站上的图片可能并不是故意把文字做得很花哨(就像餐馆菜单的 JPG 图片上的艺术字),但它们上面的文字对网络爬虫来说就是隐藏起来了,我将在下一个例子里演示。

虽然亚马逊的 robots.txt 文件允许抓取网站的产品页面,但是图书的预览页通常不让网络机器人采集。图书的预览页是通过用户触发 Ajax 脚本进行加载的,预览图片隐藏在div 节点下面;其实,普通的访问者会觉得它们看起来更像是一个Flash 动画,而不是一个图片文件。当然,即使我们能获得图片,要把它们读成文字也没那么简单。

返回顶部