前言闲扯
标题虽然是识别验证码,但实际上本文讲的是OCR(Optical Character Recognition,光学字符识别)。
用到三个模块:
- PIL
- tesseract-oc
- pytesseract
简单介绍下:
1. PIL (Python Imaging Library)是 Python 中最常用的图像处理库;
2. tesseract-oc是HP的一个文字识别项目,后来交给google做了开源;
3. pytesseract是基于tesseract-oc的python封装。
识别
pytesseract的使用十分简单,当然tesseract-oc本身的命令行调用也很简单,基于它的封装用起来也只有一行代码:
from PIL import Image
import pytesseract
im = Image.open("captcha.jpg")
vcode = pytesseract.image_to_string(im)
print(vcode)
运行后不出意外会报错:FileNotFoundError: [WinError 2] 系统找不到指定的文件
方法1: 将tesseract.exe的安装目录添加到PATH环境变量中;
方法2: 修改pytesseract.py文件,指定tesseract.exe安装路径tesseract_cmd = 'D:\\Tesseract-OCR\\tesseract
;
方法3: 在实际运行代码中指定pytesseract.pytesseract.tesseract_cmd = 'D:\\Tesseract-OCR\\tesseract.exe'
。
当你觉得万事俱备,信心满满再次运行代码后,它报了另外一个错:
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file \\Tesseract-OCR\\tessdata/eng.traineddata')
方法1: 将/tesseract-ocr/tessdata目录添加到TESSDATA_PREFIX环境变量中;
方法2: 指定tessdata-dir:tessdata_dir_config = '--tessdata-dir "D:\\Tesseract-OCR\\tessdata"'
所以,最后代码变成了这样:
from PIL import Image
import pytesseract
im = Image.open("captcha.jpg")
tessdata_dir_config = '--tessdata-dir "D:\\Tesseract-OCR\\tessdata"'
vcode=pytesseract.image_to_string(im,config=tessdata_dir_config)
print(vcode)
运行成功!
运行结果
我采用的验证码是来自直播平台斗鱼的举报系统,这个神奇的举报系统永远都输不对验证码,大概是斗鱼压根就不让你们举报,只是做做样子忽悠忽悠屁民罢了。
附:Request URL:https://www.douyu.com/member/report/captcha
——>{887
唔,不是很令人满意的结果。
其实,这也在情理之中。tesseract-oc是做图片文字识别的,斗鱼这个验证码带了一点噪点,识别容易出误差。实际上也没有人直接用tesseract-oc来破解验证码,一般都需要做二值化、降噪、分割的处理。这样一套流程下来,识别的成功率就会变地非常高。
就会像这样——>——>3061
后话
本来写这篇文章,是起源于在知乎看到一篇教程以及在实验楼的一个课程,用Python的基本库PIL来实现验证码的识别。实操下来因本人对图像处理的认识比较浅薄,一些颜色直方图、调色板类的概念不是特别明确,并且教程里有讨巧的成分(降噪是选取已知图片的两种颜色来做二值化)遂放弃转而直接调用第三方库。
总结来说,这是一篇工具使用篇,并没有多少python知识,就当我水了一篇吧,啊哈哈哈。
有缘我们再来讲中文识别以及字库训练,会发挥出tesseract-oc更完整强大的实力。