验证码识别

from PIL import Image

#处理验证码图片 分以下几个阶段

def tu(dd,s=190):#s 表示的是颜色0-225 具体看验证码的颜色深浅了 可以自己试
    #二值化 是把0-225的像素点分为0和1 就是黑白色
    img = Image.open('{0}.png'.format(dd)).convert('L')
    threshold = s
    table = []

    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    image = img.point(table,'1')
    image = image.save('{0}.png'.format(dd))

    #去掉单个点黑色
    #上面为 上下左右的像素点如果都是白色255就把这个点也变成白色
    for e in range(1):
        img = Image.open('{0}.png'.format(dd))
        data = img.load()
        w = img.size[0]
        h = img.size[1]
    for e in range(w):
        for i in range(h):
            a = data[e,i]
            if a==0:
                for t in range(1):
                    try:
                        s = data[e,i-1]#上
                    except:
                        s = 255
                    try:
                        x = data[e,i+1]#下
                    except:
                        x= 255
                    try:
                        z = data[e-1,i]#左
                    except:
                        z = 255
                    try:
                        y = data[e+1,i]#右
                    except:
                        y = 255
                    if 255==s==x==z==y:#如果上下左右都是白色只有这一个是黑色就删除这个黑色点 变成白色
                        data[e,i]=255
                        #print([e,i])
                    else:
                        pass
            else:
                pass
    img.save('{0}.png'.format(dd))

    #去点横向的干扰线,如果这个相素上下都是白色就把中间这个黑色变成白色
    for e in range(1):
        img = Image.open('{0}.png'.format(dd))
        data = img.load()
        w = img.size[0]
        h = img.size[1]

    for e in range(w):
        for i in range(h):
            a = data[e,i]
            if a==0:
                for t in range(1):
                    try:
                        s = data[e,i-1]#上
                    except:
                        s = 255
                    try:
                        x = data[e,i+1]#下
                    except:
                        x= 255

                    if 255==s==x:
                        data[e,i]=255
                        #print([e,i])
                    else:
                        pass
            else:
                pass
    img.save('{0}.png'.format(dd))
        
    #去点竖向的干扰线,如果这个相素左右都是白色就把中间这个黑色变成白色
    for e in range(1):
        img = Image.open('{0}.png'.format(dd))
        data = img.load()
        w = img.size[0]
        h = img.size[1]
    for e in range(w):
        for i in range(h):
            a = data[e,i]
            if a==0:
                for t in range(1):
                    try:
                        z = data[e-1,i]#左
                    except:
                        z = 255
                    try:
                        y = data[e+1,i]#右
                    except:
                        y = 255

                    if 255==z==y:
                        data[e,i]=255
                        #print([e,i])
                    else:
                        pass
            else:
                pass
    img.save('{0}.png'.format(dd))


#有些干扰点比较大 就可以把横坚的函数拿出来单独再执行一次
    

原我已经去掉了彩色:
在这里插入图片描述

这个是我处理的图片结果 用百度API去识别 成功率已经不错了 要求高的就可以再处理细致一些。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值