Python网络数据采集之图像识别与文字处理|第10天
图像识别与文字处理;
使用Pillow
库和Tesseract
。
图像识别与文字处理
将图像翻译成文字一般被称为光学文字识别(Optical Character Recognition
,OCR
)。可以实现 OCR
的底层库并不多,目前很多库都是使用共同的几个底层 OCR
库,或者是在上面进行定制。
OCR库概述
Python
常用的OCR
库有两个:Pillow
和 Tesseract
。每个库都可以从它们的网站上下载并安装(http://pillow.readthedocs.org/installation.html
和
https://pypi.python.org/pypi/pytesseract
),或者用第三方管理器(像 pip
)通过“pillow”
和 “pytesseract”
进行安装。
Pillow
Pillow
是从 Python 2.x
版本的 Python
图像库(Python Imaging Library
,PIL
)分出来的,支持Python 3.x
版本。和PIL
一样,Pillow
也可以轻松地导入代码,并通过大量的过滤、修饰甚至像素级的变换操作处理图片:
from PIL import Image,ImageFilter
kitten = Image.open("demo.jpg")#打开图片
blurryKitten = kitten.filter(Imagefilter.GaussianBlur)
blurryKitten.save("demo_two.jpg")#另存为
blurryKitten.show()
Tesseract
Tesseract
是目前公认最优秀、最精确的开源 OCR
系统。Tesseract
也具有很高的灵活性。它可以通过训练识别出任何字体,也可以识别出任何Unicode
字符。
Tesseract
是一个 Python
的命令行工具,不是通过 import
语句导入的库。安装之后,要用 tesseract
命令在Python
的外面运行。
安装 Tesseract
Windows:点击下载安装
Linux:sudo apt-get tessertact-ocr
Mac: brew install tesseract
;也可以下载源码安装
NumPy
NumPy
是一个非常强大的库,具有大量线性代数 以及大规模科学计算的方法。因为NumPy
可以用数学方法把图片表示成巨大的像素数组,所以它可以流畅地配合 Tesseract
完成任务。
NumPy 可以通过第三方包管理器(比如 pip)来安装:pip install numpy
处理格式规范的文字
例如通过运行Tesseract
,读取文件并把结果写到一个文本文件中:
1 |
tesseract text.tif textoutput | cat test.txt |
---|
Tesseract
最大的缺点是对渐变背景色的处理。利用Pillow
库,我们可以创建一个阈值过滤器来去掉渐变的背景色,只把文字留下来,从而让图片更加清晰,便于 Tesseract
读取:
from PIL import Image
import subprocess
def cleanFile(filePath, newFilePath):
image = Image.open(filePath)
# 对图片进行阈值过滤,然后保存
image = image.point(lambda x: 0 if x<143 else 255)
image.save(newFilePath)
# 调用系统的tesseract命令对图片进行OCR识别
subprocess.call(["tesseract", newFilePath, "output"])
# 打开文件读取结果
outputFile = open("output.txt", 'r')
print(outputFile.read())
outputFile.close()
cleanFile("text_2.jpg", "text_2_clean.png")
在提交给 Tesseract
处理之前,那些带标题的、带有大片空白的图片,或者有其他问题的图 片,都应该做预处理。
今天的内容没有特别难,我写的比较简单,爬取网络的图片和验证码识别还没写,先从简单的消化。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法