python验证码的识别

这篇分享的是如下图所示简单的验证码的识别,解决简单的验证码的问题:
这里写图片描述

# coding=utf-8
import requests
import pytesseract
from PIL import Image
from io import BytesIO


captcha_url = '验证码路径'
captcha_content = requests.get(url=captcha_url)
captcha_content = captcha_content.content
# 用自字节读出图片
image = Image.open(BytesIO(captcha_content))
# 转化为灰度图
imgry = image.convert('L')
table = [0 if i < 140 else 1 for i in range(256)]
# 使字体更加突出的显示
out = imgry.point(table,'1')
# out.show()
captcha = pytesseract.image_to_string(out)
captcha = captcha.strip()
captcha = captcha.upper()
print captcha

当然笔者分享的仅仅是简单的验证码识别,后期学习的过程中也可以学习机器学习来实现验证码的识别。

后续分享来了,日期:2019-06-27 20:22。

今天分享一下,优化一下验证码识别的思路【个人认为,如果有错误可以提出来】。
一、前沿:我们都知道图片的三通道rgb,今天分享一个小小的知识点。大佬看到了错误可以指正出来。
二、识别验证码如下:
在这里插入图片描述
大家可以看一下字体干扰线之间三通道的区别,可以通过截图来看。
字体的三通道值如下图:
在这里插入图片描述
干扰线的三通道值如下图:
在这里插入图片描述
我们会发现,明显干扰线的rgb值波动很小,而字体的干扰线值波动是如此之大,那么何不考虑用方差来让方差小的变为255白色呢?这样的话不是更好,所以来试试这个思路,思路如下:

import cv2
import numpy as np

img = cv2.imread(r'D:\captcha.jpg')
h, w, c = img.shape
for i in range(h):
    for j in range(w):
        if np.var(img[i, j, :]) < 500:  # 这个方差是需要自己调节的。
            img[i, j, :] = 255  # 把小于500的调节成 255白色背景

cv2.imshow('img', img)
cv2.waitKey(0)  

查看结果如下:
在这里插入图片描述
这样的话识别是不是更加好点呢?代码如下

import cv2
import numpy as np
import pytesseract


def read_cv():
    img = cv2.imread(r'D:\captcha.jpg')
    h, w, c = img.shape
    for i in range(h):
        for j in range(w):
            if np.var(img[i, j, :]) < 500:  # 这个方差是自己调节的。
                img[i, j, :] = 255
    captcha = pytesseract.image_to_string(img)
    captcha = captcha.strip()
    captcha = captcha.upper()
    print(captcha)


if __name__ == '__main__':
    read_cv()

附:另外的思路,当我们的验证码图片背景是一种颜色而验证码的字体是另外一种颜色的话,可以通过均值来去掉。当然我们去掉过后如果发现灰度图不好颜色过浅可以通过腐蚀膨胀来进行调节。仅仅是思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值