Python 识别验证码
安装
Tesseract-OCR
链接:https://www.jianshu.com/p/9e97c9b7dab6
源码编译:可参照官方 Wiki
windows:安装包可以在 Sourceforge 上下载,不过只有 3.02 版本的安装包
Linux:以 Ubuntu 为例,在终端输入sudo apt-get tesseract-ocr
即可进行安装pytesseract
,Pillow
,pip 安装即可pip install pytesseract
pip install Pillow
识别率较低。
图片处理
# 降噪,图片二值化,为了消除背景对文字的影响,可以通过设置一个阈值来将文字与背景分隔开来。
# 这里将阈值设置为 140,然后将大于阈值的像素置 1,小于阈值的置 0。
def initTable(threshold=140):
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
return table
i = Image.open(BytesIO(r.content))
i = i.convert('L') # 将彩色图像转化为灰度图
binaryImage = i.point(initTable(), '1') # im.point() 可以将灰度图二值化
# binaryImage.show() # 打开图片
识别文本
可以通过 pytesseract
的 image_to_string()
函数将图片转化为文本,该函数还可以接受参数 config,config 设置的是 Tesseract-OCR 引擎的参数,可自行查阅引擎的帮助文本。不过我们只需要用到 psm 参数,具体的 psm 参数值如下:
-psm N
Set Tesseract to only run a subset of layout analysis and assume a certain form of image. The options for N are:
0 = Orientation and script detection (OSD) only.
1 = Automatic page segmentation with OSD.
2 = Automatic page segmentation, but no OSD, or OCR.
3 = Fully automatic page segmentation, but no OSD. (Default)
4 = Assume a single column of text of variable sizes.
5 = Assume a single uniform block of vertically aligned text.
6 = Assume a single uniform block of text.
7 = Treat the image as a single text line.
8 = Treat the image as a single word.
9 = Treat the image as a single word in a circle.
10 = Treat the image as a single character.
识别图片的代码:
print(pytesseract.image_to_string(binaryImage, config='-psm 7'))
完整代码
# 降噪,图片二值化,为了消除背景对文字的影响,可以通过设置一个阈值来将文字与背景分隔开来。
# 这里将阈值设置为 140,然后将大于阈值的像素置 1,小于阈值的置 0。
def initTable(threshold=140):
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
return table
# 验证码处理,去掉识别出来的空格特殊字符等,仅保留字母和数字
codePattern = re.compile(r'[^a-zA-Z0-9]')
def replaceCode(code):
return codePattern.sub('', code)
# 获得验证码
def vcode(req):
posturl = baseURL + "varpic.do"
r = req.get(posturl, headers=headers) # 获得验证码图片
i = Image.open(BytesIO(r.content))
i = i.convert('L') # 将彩色图像转化为灰度图
binaryImage = i.point(initTable(), '1') # im.point() 可以将灰度图二值化
# binaryImage.show() # 打开图片
code = pytesseract.image_to_string(binaryImage, config='-psm 7')
code = replaceCode(code)
return code
参考链接
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:Python 识别验证码
文章字数:677
本文作者:Bin
发布时间:2018-05-28, 14:17:55
最后更新:2019-08-13, 17:35:35
原始链接:http://coolview.github.io/2018/05/28/Python/Python%20%E8%AF%86%E5%88%AB%E9%AA%8C%E8%AF%81%E7%A0%81/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。