1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 详细解读文字识别工具———Tesseract-OCR

详细解读文字识别工具———Tesseract-OCR

时间:2020-06-13 09:29:06

相关推荐

详细解读文字识别工具———Tesseract-OCR

阅读提示

本文将提到Tesseract-OCR的简介、配置使用并附带超实用案例,包括pdf文字识别、图形验证码提取等。

目录

阅读提示一、工具介绍二、配置环境变量2.1 进入环境变量配置界面2.2 添加系统变量2.3 添加 tessdata 系统变量三、使用 Tesseract-OCR3.1 进入cmd 输入下面的命令查看版本,正常运行则安装成功:3.2 使用下面命令识别图片四、处理给规范的文字4.1 格式规范文字的理想示例4.2 通过Python代码实现4.3 对图片进行阈值过滤和降噪处理(了解即可)4.4 从网站图片中抓取文字4.5 执行 JavaScript 语句

在尝试破解12306验证码的时候,提前了解了一下应对各种验证码的解决方案,这里主要是学习到了面对文字图片验证码,例如亚马逊、豆瓣等平台的登录时会遇到的情况,效果还不错。

一、工具介绍

​ Tesseract-OCR 是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎。与Microsoft Office Document Imaging(MODI)相比,我们可以不断的训练的库,使图像转换文本的能力不断增强;如果团队深度需要,还可以以它为模板,开发出符合自身需求的OCR引擎。

GitHub 地址:/tesseract-…

安装包官方下载地址:https://digi.bib.uni-mannheim…

安装包百度云盘下载地址:/s/1AOsJ…

二、配置环境变量

2.1 进入环境变量配置界面

右键点击此电脑–属性–高级系统设置–环境变量–系统变量–Path

2.2 添加系统变量

找到系统变量的 Path ,将 Tesseract-OCR 的安装目录添加进去:

2.3 添加 tessdata 系统变量

如下图新建系统变量 : TESSDATA_PREFIX

变量值为 tessdata 文件夹的路径(在Tesseract-OCR的安装目录下):

三、使用 Tesseract-OCR

3.1 进入cmd 输入下面的命令查看版本,正常运行则安装成功:

tesseract --version

3.2 使用下面命令识别图片

tesseract 图片路径 输出文件

查看输出的 result.txt文件:

结果正确!

四、处理给规范的文字

处理的大多数文字最好都是比较干净、格式规范的。格式规范的文字通常可以满足一些需求,通常格式规范的文字具有以下特点:

使用一个标准字体(不包含手写体、草书,或者十分“花哨的”字体)即使被复印或拍照,字体还是很清晰,没有多余的痕迹或污点排列整齐,没有歪歪斜斜的字没有超出图片范围,也没有残缺不全,或紧紧贴在图片的边缘

文字的一些格式问题在图片预处理时可以进行解决。例如,可以把图片转换成灰度图,调整亮度和对比度,还可以根据需要进行裁剪和旋转(详情需要了解图像与信号处理)等。

4.1 格式规范文字的理想示例

识别结果很准确,不过符号^*分别被表示成了双引号和单引号。大体上可以让你很舒服地阅读。

4.2 通过Python代码实现

import pytesseractfrom PIL import Imageimage = Image.open('test.jpg')text = pytesseract.image_to_string(image)print text

运行结果:

This is some text, written in Arial, that will be read byTesseract. Here are some symbols: !@#$%"&*()

4.3 对图片进行阈值过滤和降噪处理(了解即可)

随着背景色从左到右不断加深,文字变得越来越难以识别,Tesseract 识别出的 每一行的最后几个字符都是错的。

遇到这类问题,可以先用 Python 脚本对图片进行清理。利用 PIL 库,我们可以创建一个阈值过滤器来去掉渐变的背景色,只把文字留下来,从而让图片更加清晰,便于 Tesseract 读取:

from PIL import Imageimport subprocessdef cleanFile(filePath, newFilePath):image = Image.open(filePath)# 对图片进行阈值过滤(低于143的置为黑色,否则为白色)image = image.point(lambda x: 0 if x < 143 else 255)# 重新保存图片image.save(newFilePath)# 调用系统的tesseract命令对图片进行OCR识别subprocess.call(["tesseract", newFilePath, "output"]) #第三个参数是保存后的文件名# 打开文件读取结果with open("output.txt", 'r') as f:print(f.read())if __name__ == "__main__":cleanFile("text2.png", "text2clean.png")

通过一个阈值对前面的“模糊”图片进行过滤的结果

4.4 从网站图片中抓取文字

用 Tesseract 读取硬盘里图片上的文字,可能不怎么令人兴奋,但当我们把它和网络爬虫组合使用时,就能成为一个强大的工具。

网站上的图片可能并不是故意把文字做得很花哨,但它们上面的文字对网络爬虫来说就是隐藏起来 了,举个例子:

虽然亚马逊的 robots.txt 文件允许抓取网站的产品页面,但是图书的预览页通常不让网络机 器人采集。图书的预览页是通过用户触发 Ajax 脚本进行加载的,预览图片隐藏在 div 节点 下面;其实,普通的访问者会觉得它们看起来更像是一个 Flash 动画,而不是一个图片文 件。当然,即使我们能获得图片,要把它们读成文字也没那么简单。下面的程序就解决了这个问题:首先导航到托尔斯泰的《战争与和平》的大字号印刷版 1, 打开阅读器,收集图片的 URL 链接,然后下载图片,识别图片,最后打印每个图片的文 字。因为这个程序很复杂,利用了前面几章的多个程序片段,所以我增加了一些注释以让 每段代码的目的更加清晰:

#!/usr/bin/python3# -*- coding:utf-8 -*-"""@author: GaoYang@file: 网站图片和获取文字.py@time: /12/4 21:14@desc: """import timefrom urllib.request import urlretrieveimport subprocessfrom selenium import webdriver# 创建新的selenium driverdriver = webdriver.Chrome()# 调用浏览器driver.get('/War-Peace-Leo-Nikolayevich-Tolstoy/dp/1427030200')# 点击图片driver.find_element_by_xpath("//div[@id='img-canvas']/img").click()time.sleep(5)#imageList = set()# 等箭头可以点击时,开始翻页while "pointer" in driver.find_element_by_id("sitbReaderRightPageTurner").get_attribute('style'):driver.find_element_by_id("sitbReaderRightPageTurner").click()time.sleep(2)# 获取已经加载的新页面(一次可加载多个,但是重复的页面不能进到集合里)pages = driver.find_elements_by_xpath("//div[@class='pageImage']/div/img")for page in pages:image = page.get_attribute("src")imageList.add(image)# print(imageList)driver.quit()# 用Tesseract处理我们收集的图片URL链接for image in sorted(imageList):# 保存图片urlretrieve(image, "page.jpg")p = subprocess.Popen(["tesseract", "page.jpg", "page"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)f = open("page.txt", 'r')p.wait()print(f.read())

和前面使用 Tesseract 读取的效果一样,这个程序也会完美地打印书中很多长长的段落,第六页的预览如下所示:

Prince Vasily wanted this post for his son, but other people wereworking through the Empress Maria Fyodorovna to get it for thebaron. Anna Pavlovna half-closed her eyes to indicate that neither shenor anyone else could pass judgement on what the Empress might feellike doing or want to do. 'Baron Funke has been recommended to theDowager Empress by her sister,) was all she said, in a dry, Tugubrioustone. As she pronounced the name of the Empress, Anna Paviovna'sface took on an expression of profound and sincere devotion mixedwith respect and tinged with sadness, which invariably came upon herwhen she had occasion to mention her exalted patroness. She said thather Majesty had been gracious enough to show Baron Funke greatrespect, at which her face once again dissolved into sadness.

但是当文字出现在彩色封面上时,结果就不那么完美了:

WEI' nrrd PeaceLen Nlkelayevldu IolfluyReadmg shmdd be axwlnvame asnossxble Wenfleran mm m our cram: Llhvary- Leo Tmsloy was a Russian rwovelwstI and moval phflmopher med lurA ms Ideas 01 nonviolenx reswslance m 5 We range0, "and"

如果想把文字加工成普通人可以看懂的效果,还需要花很多时间去处理。

比如,通过给 Tesseract 提供大量已知的文字与图片映射集,经过训练 Tesseract 就可以“学会”识别同一种字体,而且可以达到极高的精确率和准确率,甚至可以忽略图片中文字的背景色和相对位置等问题。

4.5 执行 JavaScript 语句

隐藏百度图片

#!/usr/bin/python3# -*- coding:utf-8 -*-"""@author: GaoYang@file: 练习2.py@time: /12/5 11:35@desc: """from selenium import webdriverimport timedriver = webdriver.Chrome()driver.get("/")# 给搜索输入框标红的javascript脚本js = "var q=document.getElementById(\"kw\");q.style.border=\"2px solid red\";"# 调用给搜索输入框标红js脚本driver.execute_script(js)# 查看页面快照driver.save_screenshot("redbaidu.png")# js隐藏元素,将获取的图片元素隐藏img = driver.find_element_by_xpath("//*[@id='lg']/img")driver.execute_script('$(arguments[0]).fadeOut()', img)# 向下滚动到页面底部driver.execute_script("$('.scroll_top').click(function(){$('html,body').animate({scrollTop: '0px'}, 800);});")# 查看页面快照driver.save_screenshot("nullbaidu.png")time.sleep(3)driver.quit()

模拟滚动条滚动到底部

#!/usr/bin/python3# -*- coding:utf-8 -*-"""@author: GaoYang@file: 练习2.py@time: /12/5 10:35@desc: """from selenium import webdriverimport timedriver = webdriver.Chrome()driver.get("/typerank?type_name=剧情&type=11&interval_id=100:90&action=")# 向下滚动10000像素js = "document.body.scrollTop=10000"#js="var q=document.documentElement.scrollTop=10000"time.sleep(3)#查看页面快照driver.save_screenshot("douban.png")# 执行JS语句driver.execute_script(js)time.sleep(3)#查看页面快照driver.save_screenshot("newdouban.png")driver.quit()

★★以上是我的学习笔记,如有不足或错误之处还请各位读者指正,谢谢!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。