解决格局标准的文字
在上一篇文章中咱们介绍了图像识别与文字处理,同时还解说了有哪些根本的 OCR 库。
你要解决的大多数文字都是比拟洁净、格局标准的。格局标准的文字通常能够满足一些需 求,不过到底什么是“格局凌乱”,什么算“格局标准”,的确因人而异。
- 应用一个规范字体(不蕴含手写体、草书,或者非常”花哨的“字体)
- 尽管被复印或拍照,字体还是很清晰,没有多余的痕迹或污点
- 排列参差,有歪歪斜斜的字
- 没有超出图片范畴,也没有残缺不全,或紧紧贴在图片的边缘
文字的一些格局问题在图片预处理时能够进行解决。例如,能够把图片转换成灰度图,调整亮度和对比度,还能够依据须要进行裁剪和旋转。然而, 这些做法在进行更具扩展性的训练时会遇到一些限度。
上面是一个规范文字的现实示范:
下面的图片咱们转换成 tif 文件格式,应用 Tesseract 来读取。
咱们应用如下命令将图片中的文字转换成文本内容:
tesseract.exe "E:\ 我的文档 \My Pictures\Saved Pictures\test-text.max_344x194.tif" "E:\ 我的文档 \My Pictures\Saved Pictures\textoutput.txt"
最初运行后果如下:
第一行输入的是 Tesseract 版本信息,咱们查看一下后果:
This is some test text for image
recognition.
咱们呢能够看到辨认的很精确,然而互联网上的图片有的蕴含突变,有的还蕴含有背景,这会使文字变得越来越难以辨认,当咱们遇到这类问题的时候,咱们首先须要应用 Python 脚本对图片进行清理。
例如上面的图片,蕴含突变和特殊符号,咱们应用 Tesseract 来辨认图片中的内容。
应用 Tesseract 辨认后果:
利用 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 读取图片内容,后果如下:
通过上图能够看到与方才的后果更精确了,大部分的符号被读取进去了。
!
被辨认成了 1
,^
被辨认成了 A
,()
被辨认成了 0
,通过下面谬误的局部,咱们看出符号与辨认谬误的内容非常相像,所以才呈现这些谬误。
Tesseract 最大的毛病是对突变背景色的解决。之前那个版本中,Tesseract 的算法在读取文字之前主动尝试调整图片对比度,然而如果你用 Pillow 库这样的工具对图片进行预处理,成果会更好。
在提交给 Tesseract 解决之前,那些带题目的、带有大片空白的图片,或者有其余问题的图片,都应该做预处理。
从网站图片中抓取文字
用 Tesseract 读取硬盘里图片上的文字,可能不怎么令人兴奋,但当咱们把它和网络爬虫组合应用时,就能成为一个弱小的工具。网站上的图片可能并不是故意把文字做得很花哨(就像餐馆菜单的 JPG 图片上的艺术字),但它们下面的文字对网络爬虫来说就是暗藏起来了,我将在下一个例子里演示。
尽管亚马逊的 robots.txt 文件容许抓取网站的产品页面,然而图书的预览页通常不让网络机器人采集。图书的预览页是通过用户触发 Ajax 脚本进行加载的,预览图片暗藏在 div 节点上面;其实,一般的访问者会感觉它们看起来更像是一个 Flash 动画,而不是一个图片文件。当然,即便咱们能取得图片,要把它们读成文字也没那么简略。