Python+Pillow+Pytesseract实现验证码识别


Posted in Python onMay 11, 2022

利用pillow和pytesseract来实现验证码的识别

一、环境配置

需要 pillow 和 pytesseract 这两个库,pip install 安装就好了。

pip install pillow -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install pytesseract -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

安装好Tesseract-OCR.exe

pytesseract 库的配置:搜索找到pytesseract.py,打开该.py文件,找到 tesseract_cmd,改变它的值为刚才安装 tesseract.exe 的路径。

Python+Pillow+Pytesseract实现验证码识别

二、验证码识别

识别验证码,需要先对图像进行预处理,去除会影响识别准确度的线条或噪点,提高识别准确度。

实例1

import cv2 as cv
import pytesseract
from PIL import Image

def recognize_text(image):
    # 边缘保留滤波  去噪
    dst = cv.pyrMeanShiftFiltering(image, sp=10, sr=150)
    # 灰度图像
    gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
    # 二值化
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    # 形态学操作   腐蚀  膨胀
    erode = cv.erode(binary, None, iterations=2)
    dilate = cv.dilate(erode, None, iterations=1)
    cv.imshow('dilate', dilate)
    # 逻辑运算  让背景为白色  字体为黑  便于识别
    cv.bitwise_not(dilate, dilate)
    cv.imshow('binary-image', dilate)
    # 识别
    test_message = Image.fromarray(dilate)
    text = pytesseract.image_to_string(test_message)
    print(f'识别结果:{text}')


src = cv.imread(r'./test/044.png')
cv.imshow('input image', src)
recognize_text(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行效果如下:

识别结果:3n3D
Process finished with exit code 0

Python+Pillow+Pytesseract实现验证码识别

实例2

import cv2 as cv
import pytesseract
from PIL import Image

def recognize_text(image):
    # 边缘保留滤波  去噪
    blur =cv.pyrMeanShiftFiltering(image, sp=8, sr=60)
    cv.imshow('dst', blur)
    # 灰度图像
    gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)
    # 二值化
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    print(f'二值化自适应阈值:{ret}')
    cv.imshow('binary', binary)
    # 形态学操作  获取结构元素  开操作
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 2))
    bin1 = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
    cv.imshow('bin1', bin1)
    kernel = cv.getStructuringElement(cv.MORPH_OPEN, (2, 3))
    bin2 = cv.morphologyEx(bin1, cv.MORPH_OPEN, kernel)
    cv.imshow('bin2', bin2)
    # 逻辑运算  让背景为白色  字体为黑  便于识别
    cv.bitwise_not(bin2, bin2)
    cv.imshow('binary-image', bin2)
    # 识别
    test_message = Image.fromarray(bin2)
    text = pytesseract.image_to_string(test_message)
    print(f'识别结果:{text}')


src = cv.imread(r'./test/045.png')
cv.imshow('input image', src)
recognize_text(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行效果如下:

二值化自适应阈值:181.0
识别结果:8A62N1
Process finished with exit code 0

Python+Pillow+Pytesseract实现验证码识别

实例3

import cv2 as cv
import pytesseract
from PIL import Image

def recognize_text(image):
    # 边缘保留滤波  去噪
    blur = cv.pyrMeanShiftFiltering(image, sp=8, sr=60)
    cv.imshow('dst', blur)
    # 灰度图像
    gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)
    # 二值化  设置阈值  自适应阈值的话 黄色的4会提取不出来
    ret, binary = cv.threshold(gray, 185, 255, cv.THRESH_BINARY_INV)
    print(f'二值化设置的阈值:{ret}')
    cv.imshow('binary', binary)
    # 逻辑运算  让背景为白色  字体为黑  便于识别
    cv.bitwise_not(binary, binary)
    cv.imshow('bg_image', binary)
    # 识别
    test_message = Image.fromarray(binary)
    text = pytesseract.image_to_string(test_message)
    print(f'识别结果:{text}')


src = cv.imread(r'./test/045.jpg')
cv.imshow('input image', src)
recognize_text(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行效果如下:

二值化设置的阈值:185.0
识别结果:7364
Process finished with exit code 0

Python+Pillow+Pytesseract实现验证码识别

到此这篇关于Python+Pillow+Pytesseract实现验证码识别的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
Python中存取文件的4种不同操作
Jul 02 Python
手把手教你使用Python创建微信机器人
Apr 29 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
pandas如何处理缺失值
Jul 31 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 Python
推荐8款常用的Python GUI图形界面开发框架
Feb 23 Python
pyqt5数据库使用详细教程(打包解决方案)
Mar 25 Python
Python基于requests实现模拟上传文件
Apr 21 Python
Python实现疫情通定时自动填写功能(附代码)
May 27 Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 Python
python缩进长度是否统一
Aug 02 Python
DRF使用simple JWT身份验证的实现
Jan 14 Python
Python 绘制多因子柱状图
PyCharm 配置SSH和SFTP连接远程服务器
May 11 #Python
Python 文字识别
May 11 #Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
May 11 #Python
Python 匹配文本并在其上一行追加文本
May 11 #Python
Python 一键获取电脑浏览器的账号密码
May 11 #Python
图神经网络GNN算法
May 11 #Python
You might like
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
bootstrap警告框使用方法解析
2017/01/13 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
关于Java finally的面试题
2016/04/27 面试题
servlet面试题
2012/08/20 面试题
2015年人事工作总结范文
2015/04/09 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android