python 验证码识别示例(二) 复杂验证码识别

   在这篇博文中手把手教你如何去分割验证,然后进行识别。

一:下载验证码

    

  验证码分析,图片上有折线,验证码有数字,有英文字母大小写,分类的时候需要更多的样本,验证码的字母是彩色的,图片上有雪花等噪点,因此识别改验证码难度较大

二:二值化和降噪:

  

 

 三: 切割:

    

四:分类:

    

五:   测试识别率

                

六:总结:

  综合识别率在70%左右,对于这个识别率我觉得还是挺高的,因为这个验证码的识别难度还是很大

代码:

1.  下载图片:

  

#-*-coding:utf-8-*-
import requests

def spider():
    url = "https://www.epailive.com/basic/captcha?ran=0.22070346581876787"
    for i in range(1, 101):
        print("正在下载的张数是:",i)
        with open("./1__get_image/{}.png".format(i), "wb") as f:
            f.write(requests.get(url).content)
spider()

二值化和降噪:

  

#-*-coding:utf-8-*-
# coding:utf-8
import sys, os
from PIL import Image, ImageDraw

# 二值数组
t2val = {}

def twoValue(image, G):
    for y in range(0, image.size[1]):
        for x in range(0, image.size[0]):
            g = image.getpixel((x, y))
            if g > G:
                t2val[(x, y)] = 1
            else:
                t2val[(x, y)] = 0

# 根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 <N <8),当A的RGB值与周围8个点的RGB相等数小于N时,此点为噪点
# G: Integer 图像二值化阀值
# N: Integer 降噪率 0 <N <8
# Z: Integer 降噪次数
# 输出
#  0:降噪成功
#  1:降噪失败
def clearNoise(image, N, Z):
    for i in range(0, Z):
        t2val[(0, 0)] = 1
        t2val[(image.size[0] - 1, image.size[1] - 1)] = 1

        for x in range(1, image.size[0] - 1):
            for y in range(1, image.size[1] - 1):
                nearDots = 0
                L = t2val[(x, y)]
                if L == t2val[(x - 1, y - 1)]:
                    nearDots += 1
                if L == t2val[(x - 1, y)]:
                    nearDots += 1
                if L == t2val[(x - 1, y + 1)]:
                    nearDots += 1
                if L == t2val[(x, y - 1)]:
                    nearDots += 1
                if L == t2val[(x, y + 1)]:
                    nearDots += 1
                if L == t2val[(x + 1, y - 1)]:
                    nearDots += 1
                if L == t2val[(x + 1, y)]:
                    nearDots += 1
                if L == t2val[(x + 1, y + 1)]:
                    nearDots += 1

                if nearDots < N:
                    t2val[(x, y)] = 1

def saveImage(filename, size):
    image = Image.new("1", size)
    draw = ImageDraw.Draw(image)

    for x in range(0, size[0]):
        for y in range(0, size[1]):
            draw.point((x, y), t2val[(x, y)])

    image.save(filename)

for i in range(1, 101):

    path = "1__get_image/" + str(i) +  ".png"
    image = Image.open(path)

    image = image.convert(‘L‘)
    twoValue(image, 198)
    clearNoise(image, 3, 1)
    path1 = "2__erzhihua_jiangzao/" + str(i) + ".jpg"
    saveImage(path1, image.size)

三:切割验证码:

  

#-*-coding:utf-8-*-

from PIL import Image

def smartSliceImg(img, outDir, ii,count=4, p_w=3):
    ‘‘‘
    :param img:
    :param outDir:
    :param count: 图片中有多少个图片
    :param p_w: 对切割地方多少像素内进行判断
    :return:
    ‘‘‘
    w, h = img.size
    pixdata = img.load()
    eachWidth = int(w / count)
    beforeX = 0
    for i in range(count):

        allBCount = []
        nextXOri = (i + 1) * eachWidth

        for x in range(nextXOri - p_w, nextXOri + p_w):
            if x >= w:
                x = w - 1
            if x < 0:
                x = 0
            b_count = 0
            for y in range(h):
                if pixdata[x, y] == 0:
                    b_count += 1
            allBCount.append({‘x_pos‘: x, ‘count‘: b_count})
        sort = sorted(allBCount, key=lambda e: e.get(‘count‘))

        nextX = sort[0][‘x_pos‘]
        box = (beforeX, 0, nextX, h)
        img.crop(box).save(outDir + str(ii) + "_" + str(i) + ".png")
        beforeX = nextX

for ii in  range(1, 101):
    path = "2__erzhihua_jiangzao/" + str(ii) + ".jpg"
    img = Image.open(path)
    outDir = ‘3__qiege/‘
    smartSliceImg(img, outDir, ii,count=4, p_w=3)

四:训练:

    

#-*-coding:utf-8-*-

import numpy as np
import os
import time

from PIL import Image
from sklearn.externals import joblib
from sklearn.neighbors import KNeighborsClassifier

def load_dataset():
    X = []
    y = []
    for i in "23456789ABVDEFGHKMNPRSTUVWXYZ":
        target_path = "fenlei/" + i
        print(target_path)
        for title in os.listdir(target_path):
            pix = np.asarray(Image.open(os.path.join(target_path, title)).convert(‘L‘))
            X.append(pix.reshape(25 * 30))
            y.append(target_path.split(‘/‘)[-1])

    X = np.asarray(X)
    y = np.asarray(y)
    return X, y

def check_everyone(model):
    pre_list = []
    y_list = []
    for i in "23456789ABCDEFGHKMNPRSTUVWXYZ":
        part_path = "part/" + i
        for title in os.listdir(part_path):
            pix = np.asarray(Image.open(os.path.join(part_path, title)).convert(‘L‘))
            pix = pix.reshape(25 * 30)
            pre_list.append(pix)
            y_list.append(part_path.split(‘/‘)[-1])
    pre_list = np.asarray(pre_list)
    y_list = np.asarray(y_list)

    result_list = model.predict(pre_list)
    acc = 0
    for i in result_list == y_list:
        print(result_list,y_list,)

        if i == np.bool(True):
            acc += 1
    print(acc, acc / len(result_list))

X, y = load_dataset()
knn = KNeighborsClassifier()
knn.fit(X, y)
joblib.dump(knn, ‘yipai.model‘)
check_everyone(knn)

六:测试:

    

# -*- coding: utf-8 -*-

import numpy as np
from PIL import Image
from sklearn.externals import joblib
import os

target_path = "1__get_image/"
source_result = []
for title in os.listdir(target_path):
    source_result.append(title.replace(‘.png‘,‘‘))

def predict(model):
    predict_result = []
    for q in range(1,101):
        pre_list = []
        y_list = []
        for i in range(0,4):
            part_path = "part1/" + str(q) + "_" + str(i) + ".png"
            # print(part_path)
            pix = np.asarray(Image.open(os.path.join(part_path)))
            pix = pix.reshape(25 * 30)
            pre_list.append(pix)
            y_list.append(part_path.split(‘/‘)[-1])
        pre_list = np.asarray(pre_list)
        y_list = np.asarray(y_list)

        result_list = model.predict(pre_list)
        print(result_list,q)

        predict_result.append(str(result_list[0] + result_list[1] + result_list[2] + result_list[3]))

    return predict_result

model = joblib.load(‘yipai.model‘)
predict_result = predict(model)
# print(source_result)
# print(predict_result)

原文地址:https://www.cnblogs.com/xuchunlin/p/9456593.html

时间: 2024-10-11 11:25:19

python 验证码识别示例(二) 复杂验证码识别的相关文章

Python 爬虫入门(四)—— 验证码上篇(主要讲述验证码验证流程,不含破解验证码)

本篇主要讲述验证码的验证流程,包括如何验证码的实现.如何获取验证码.识别验证码(这篇是人来识别,机器识别放在下篇).发送验证码.同样以一个例子来说明.目标网址 http://icp.alexa.cn/index.php(查询域名备案信息) 1.验证码的实现: 简单的说,验证码就是一张图片,图片上有字符串.网站是如何实现的呢?有WEB基础的人可能会知道,每个浏览器基本都有cookie,作为这次回话的唯一标示.每次访问网站,浏览器都会把这个cookie发送给服务器.验证码就是和这个cookie绑定到

基于opencv3.0和zbar下的条形码与二维码识别

其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2. 利用opencv和Zbar(或者Zxing)对标准的QR二维码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 3. 对非标准条形码,进行定位,然后用Zbar(或者Zxing)解码显示. 4. 对非标准的QR二维码图片,进行定位,然后用Zbar(或者Zx

谷歌app二次验证码与微信小程序二次验证码对比实测

下面我就跟大家实测一下关于两款验证码的使用对比 NO.1:下载安装 谷歌二次验证码下载方式如下: 1.通过扫描交易所中二维码(目前所有交易所中都是提供下载二维码的) 2.手机应用商店搜索"Google Authenticator"进行下载 微信小程序下载方式如下: 1.进入微信直接搜索"二次验证码"即可 1.谷歌需要去下载app(费流量,有wifi和土豪忽略),微信不需要,直接使用! 2.搜索方面谷歌需要一连串的英文字母,比较复杂这个对我而言就比较难接受了(我是英语

Delphi百度文字识别【支持通用文字识别、身份证识别、银行卡识别、驾驶证识别、行驶证识别、车牌识别等功能】

Delphi百度文字识别          百度api文档 [Delphi百度文字识别]支持 通用文字识别.通用文字识别(高精度版).通用文字识别(含位置信息版).通用文字识别(高精度含位置版).手写文字识别.身份证识别.银行卡识别.营业执照识别.护照识别.名片识别.户口本识别.出生医学证明识别.港澳通行证识别.台湾通行证识别.通用票据识别.表格文字识别.通用票据识别.增值税发票识别.火车票识别.出租车票识别.定额发票识别.驾驶证识别.行驶证识别.车牌识别.机动车销售发票识别.车辆合格证识别.V

python 验证码识别示例(五) 简单验证码识别 &#187; 立即查看

今天介绍一个简单验证的识别. 主要是标准的格式,没有扭曲和变现.就用 pytesseract 去识别一下. 验证码地址:http://wscx.gjxfj.gov.cn/zfp/webroot/xfsxcx.html 需要识别的验证码是: 因为这个验证码有干扰点,所以直接识别的效果非常不好. 首先对验证码进行二值化和降噪. 效果如下: 识别结果: 识别率只有百分之四十,针对这么低的识别率,可以去切割分类,目前这个验证码很容易去切割.提高验证码的识别率问题. 二值化代码: # coding:utf

验证码识别与生成类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数字+小写.数字+大写.数字+大小写等情况. 四位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数字+小写.数字+大写.数字+大小写等情况. 简单验证码识别:验证码类型 : 数字+字母, 纯英文, 纯数字,计算题 英数_验证码识别:纯数字,纯英文,数字+英文 中英数_验证码识别:英文.数

验证码识别之二值化

前言 二值化顾名思义就是将数变成两种值,一般非0即1.而在验证码处理中,如果直接使用灰度图,那么每个像素的值会在0-255,这样肯定会增加计算时间,而二值化后每个像素的值只是0和1. 在前面的简单验证码识别中,我的二值化代码是这样写的:a = (a > 180) * 255,至于这里为什么不乘1而乘255,因为我要显示图片看看效果.如果只是用于算法识别的话,乘1会更好.但是,这里的180也就是二值化的阈值是如何得到的,开始是通过一个一个试然后看效果哪个好就选哪个,因为我们一般只识别某个网站的验证

集美大学教务处验证码识别(二)

[原创,转载请标明作者:森狗] 本文对第二种验证码,即管理员登入后台地址的验证码进行识别. 1.采集一些验证码,0~9都要有 2.观察验证码,用画图工具即可. 观察可发现,噪点即阴影,此处的阴影就是颜色比主体验证码略淡,以此为突破口. 3.去除噪点 color.getGreen() 获取绿色的值int,绿色值(0~255 从深到浅),大于200的就是浅色的噪点 public static int isWhite(int colorInt) { Color color = new Color(co

c#实现识别图片上的验证码数字

这篇文章主要介绍了c#实现识别图片上的验证码数字的方法,本文给大家汇总了2种方法,有需要的小伙伴可以参考下. public void imgdo(Bitmap img) { //去色 Bitmap btp = img; Color c = new Color(); int rr, gg, bb; for (int i = 0; i < btp.Width; i++) { for (int j = 0; j < btp.Height; j++) { //取图片当前的像素点 c = btp.Get

Python zxing 库解析(条形码二维码识别)

各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,python加载ZBar时各种报错.可能的原因是zbar的dll文件是32位的,而我系统是64位的,所以运行不了.只能自己拿源码编译一个64位的出来,对于我这种伸手党来说自己编译源码是难以接受的,所以就放弃了.后来看到文章说Zbar不能识别倾斜的条形码,而且也不能定位条形码区域. Zxing zbar不可