Python scrapy笔记4:图像验证码识别


[success]感觉这个很高大上,主要是在爬虫的时候识别验证码需要用到,所以就学这个了,这里我就只能量力而为了,有很多我可能看不懂。[/success]

我们将重点介绍机器视觉的一个分支:文字识别,介绍如何用一些 Python库来识别和使用在线图片中的文字。

我们可以很轻松的阅读图片里的文字,但是机器阅读这些图片就会非常困难,利用这种人类用户可以正常读取但是大多数机器人都没法读取的图片,验证码 (CAPTCHA)就出现了。验证码读取的难易程度也大不相同,有些验证码比其他的更加难读。

将图像翻译成文字一般被称为光学文字识别(Optical Character Recognition, OCR)。可以实现OCR的底层库并不多,目前很多库都是使用共同的几个底层 OCR 库,或者是在上面 进行定制。

这里我们介绍一下Tesseract :Tesseract 是一个 OCR 库,目前由 Google 赞助(Google 也是一家以 OCR 和机器学习技术闻名于世的公司)。Tesseract 是目前公认最优秀、最精确的开源 OCR 系统。 除了极高的精确度,Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体,也可以识别出任何 Unicode 字符。

安装方法:

windows:下载可执行安装文件https://code.google.com/p/tesseract-ocr/downloads/list安装。(里面有安装包可以自己找下)

linux:可以通过 apt-get 安装: $sudo apt-get tesseract-ocr

附:这里说一下windows怎么操作:其实就是你下载一下安装包后就会自己安装,安装好后把这个软件的路径添加到环境变量里面的PATH里面,然后我们还需要添加TESSDATA_PREFIX的变量名,值就是安装路径的tessdata的路径,比如我的:D:Tesseract-OCR essdata,(修改完毕后记得重启一下系统)最后输入Tesseract -v,如果有内容显示说明可以工作了。

安装好这个后,我们还需要安装Tesseract的python库 :

Tesseract 是一个 Python 的命令行工具,不是通过 import 语句导入的库。安装之后,要用 tesseract 命令在 Python 的外面运行,但我们可以通过 pip 安装支持Python 版本的 Tesseract库:pip install pytesseract

开始处理

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

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

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

我们先来一个简单的:

我们打开命令行,然后切换到图片所在的路径,然后输入下图的命令,然后我们就可以得到结果了:

我们可以看到识别结果很准确,好像只有^识别出错了,其他的都对了。

那么怎么用Python代码来实现呢?我们只需要下面几行代码就行了:

import pytesseract
from PIL import Image

image = Image.open('test.jpg')
text =  pytesseract.image_to_string(image)
print (text)

结果:

当然有的图片可能很难识别,比如下面这个:

如果我们运行的话,会显示下面的文字:

This is some text, written in Arial,
Tesseract. Here are some

我们可以看到,后面阴影部分我们就完全识别不出来了,那么我们应该怎么做呢?我们可以通过Python的pillow库来对图片进行降噪处理:(下面是运行结果和图片处理后的结果)

还有代码:

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"])

    # 打开文件读取结果
    file = open("output.txt", 'r')     
    print(file.read()) 
    file.close()

cleanFile("test.jpg", "testclean.png")

当然,我们这种识别水平是远远不够用来识别验证码的,我们可以通过给 Tesseract 提供大量已知的文字与图片映射集,经过训练 Tesseract 就可以“学会”识别同一种字体,而且可以达到极高的精确率和准确率,甚至可以忽略图 片中文字的背景色和相对位置等问题。

训练后面在说,我们这里直接开始实战来锻炼一下。

过了几个小时:这里识别技术是真的不行,我找了很多网站他都识别不了,所以这里锻炼就算了,我们后面训练这里也暂时不写了,因为这里涉及的内容还太深了,以后有时间到这里来更新吧!

2019.5.31:第一次更新

----------------------------------------------------------


文章作者: 小游
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
  目录