今天完成昨天说的识别图片文字的内容
练习 将tesseract与爬虫结合起来
import time
from urllib.request import urlretrieve
import subprocess
from selenium import webdriver
driver=webdriver.PhantomJS(executable_path="C:/Users/gaoji/Documents/python/phantomjs-2.1.1-windows/bin/phantomjs.exe")
driver.get("http://www.amazon.com/War-Peace-Leo-Nikolayevich-Tolstoy/dp/1427030200")
time.sleep(8)
driver.find_element_by_id("sitbLogoImg").click()
imageList = set()
time.sleep(9)
while "pointer" in driver.find_element_by_id("sitbReaderRightPageTurner").get_attribute("style"):
driver.find_element_by_id("sitbReaderRightPageTurner").click()
time.sleep(9)
pages = driver.find_elements_by_xpath("//div[@class='pageImage']/div/img")
for page in pages:
image = page.get_attribute("src")
imageList.add(image)
driver.quit()
for image in sorted(imageList):
urlretrieve(image,"page.jpg")
p = subprocess.Popen(["tesseract","page.jpg","page"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
p.wait()
f = open("page.txt","r")
print(f.read())
input()
selenium其实是一个比较好用的自动化测试工具,但掌握起来不是那么容易,我对与这个的掌握处于了解阶段,所以这个练习做的很吃力。
接下来简单介绍以下训练tesseract来让他变得更加优秀
在实际应用中,OCR的一个重要用途就是自动识别验证码。
什么样的验证码更易于OCR程序识别?这里列取了一个样例:
这个图片用tesseract的指令直接就可以识别(基本正确)
他大概有以下的特点:
• 字母没有相互叠加在一起,在水平方向上也没有彼此交叉。也就是说,可以在每一个字 母外面画一个方框,而不会重叠在一起。
• 虽然不能因一个图片下定论,但是这个验证码用的字体种类很少,其实只有一种
• 白色背景色与深色字母之间的对比度很高。
但是只要加一点小小的改动就会让它变得非常难以识别,比如下面这张
直接用tesseract会提示empty page,而这张图片在我们看来是相当好识别的。
• 字母和数据都使用了,这会增加待搜索字符的数量。
• 字母随机的倾斜程度会迷惑OCR软件,但是人类还是很容易识别的。
• 验证码所使用的字体不是规范字体,尽管它在我们看来以及足够“规范”了
通过训练tesseract,可以让这种情况得到改善,至于能改善多少,与训练所用样例有关。
要训练 Tesseract 识别一种文字,无论是晦涩难懂的字体还是验证码,你都需要向 Tesseract 提供每个字符不同形式的样本
训练的具体执行分成几步:
• 首先要把大量的验证码样本下载到一个文件夹里。下载的样本数量由验证码 的复杂程度决定,有些特别复杂的验证码(google)等,样例的选用上还需要特殊的技巧,这个过程非常枯燥而且很有可能会倒回到这步重做。
• 第二步是准确地告诉 Tesseract 一张图片中的每个字符是什么,以及每个字符的具体位置。 这里需要创建一些矩形定位文件(box file) ,一个验证码图片生成一个矩形定位文件。一 个图片的矩形定位文件如下所示:
4 15 26 33 55 0
M 38 13 67 45 0
m 79 15 101 26 0
C 111 33 136 60 0
3 147 17 176 45 0
第一列符号是图片中的每个字符,后面的 4 个数字分别是包围这个字符的最小矩形的坐标 (图片左下角是原点 (0,0),4 个数字分别对应每个字符的左下角 x 坐标、左下角 y 坐标、右 上角 x 坐标和右上角 y 坐标) ,最后一个数字“0”表示图片样本的编号
Tesseract OCR Chopper可以帮助你完成这些矩形的标记。
矩形定位文件必须保存在一个 .box 后缀的文本文件中。图片和box文本文最好用验证码的实际结果命名
•接下来是完成所有的数据分析工作和创建 Tesseract 所需的训练文件,一共有六个步骤。这一部是比较麻烦的,虽然有些工具可以辅助你完成任务,完成这一步需要的对tesseract了解的深入一点。
•最后一步,就是用Linux 和 Mac 命令行把刚刚创建的 eng. traineddata 文件复制到 tessdata 文件夹里,Windows 系统类似
完成这些后,你就可以用这些 Tesseract 训练过的验证码来识别新图片了,效果应该回改善许多。
要一两天掌握OCR程序几乎是不可能的,想要熟练应用这些工具甚至需要阅读他们的源码及大量用例,这里只能是简单介绍以下。
今天就这样了,OCR好难,不过了解下还是感觉挺好的,打卡~