机器学习——验证码

import random

from PIL import ImageDraw, Image, ImageFont

def getRandomStr():
random_num = str(random.randint(0, 9))
return random_num

def getRandomColor():
font_color = [random.randint(0,255), random.randint(0,255), random.randint(0,255)]
return tuple(font_color)

def generate_captcha():
image = Image.new(“RGB”, (150, 50), (255, 255, 255))
draw = ImageDraw.Draw(image)
font = ImageFont.truetype(“LiberationSans-Bold.ttf”, size=32)
label = “”

for i in range(5):
    random_char = getRandomStr()
    label += random_char

    draw.text((10 + i * 30, 0), random_char, getRandomColor(), font=font)
width = 150
height = 30
for i in range(3):
    x1 = random.randint(0, width)
    x2 = random.randint(0, width)
    y1 = random.randint(0, height)
    y2 = random.randint(0, height)
    draw.line((x1, y1, x2, y2), fill=(0, 0, 0))
for i in range(5):
    #draw.point([random.randint(0, width), random.randint(0, height)], fill=getRandomColor())
    draw.point([random.randint(0, width), random.randint(0, height)], fill=getRandomColor())
    x = random.randint(0, width)
    y = random.randint(0, height)
    draw.arc((x, y, x + 4, y + 4), 0, 90, fill=(0, 0, 0))
image.save(open(''.join(['captcha_images/', label, '.png']), 'wb'), 'png')

if name == ‘main’:
for i in range(150):
generate_captcha()

在这里插入图片描述

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import os


def binarization(path):
    img = Image.open(path)
    img_gray = img.convert('L')
    img_gray = np.array(img_gray)
    print(img_gray)
    w, h = img_gray.shape
    for x in range(w):
        for y in range(h):
            gray = img_gray[x, y]
            if gray <= 220:
                img_gray[x, y] = 0
            else:
                img_gray[x, y] = 1
    # plt.figure('')
    # plt.imshow(img_gray,cmap='gray')
    # plt.axis('off')
    # plt.show()
    return img_gray
def noiseReduction(img_gray,label):
    height,width = img_gray.shape
    for x in range(height):
        for y in range(width):
            cnt = 0
            if img_gray[x,y] == 1:
                continue
            else:
                try:
                    if img_gray[x-1,y-1] == 0:
                        cnt += 1
                except:
                    pass
                try:
                    if img_gray[x-1,y] == 0:
                        cnt += 1
                except:
                    pass
                try:
                    if img_gray[x,y-1] == 0:
                        cnt += 1
                except:
                    pass
                try:
                    if img_gray[x+1,y+1] == 0:
                        cnt += 1
                except:
                    pass
                try:
                    if img_gray[x+1,y] == 0:
                        cnt += 1
                except:
                    pass
                try:
                    if img_gray[x,y+1] == 0:
                        cnt += 1
                except:
                    pass
                try:
                    if img_gray[x-1,y+1] == 0:
                        cnt += 1
                except:
                    pass
                try:
                    if img_gray[x+1,y-1] == 0:
                        cnt += 1
                except:
                    pass
                if cnt < 4:
                    img_gray[x,y] =1
    plt.figure('')
    plt.imshow(img_gray, cmap='gray')
    plt.axis('off')
    # plt.show()
    plt.savefig(''.join(['/root/PycharmProjects/untitled/botstudy/day05/clean_images/', label, '.png']))
def create_dir():
    for i in range(10):
        os.mkdir(''.join(['/root/PycharmProjects/untitled/botstudy/day05/cut_number/', str(i)]))
def clean_to_cut():
    captchas = os.listdir(''.join(['/root/PycharmProjects/untitled/botstudy/day05/clean_captcha_img/']))
    for captcha in captchas:
        label = captcha.split('.')[0]
        cutImg(label)
def get_save_seq(num):
    numlist = os.listdir(''.join(['/root/PycharmProjects/untitled/botstudy/day05/cut_number/', num, '/']))
    if len(numlist) == 0 or numlist is None:
        return 0
    else:
        max_file = 0
        for file in numlist:
            if int(file.split('.')[0]) > max_file:
                max_file = int(file.split('.')[0])
        return int(max_file)+1
def cutImg(label):
    labels = list(label)
    img = Image.open(''.join(['/root/PycharmProjects/untitled/botstudy/day05/clean_images/', label, '.png']))
    for i in range(5):
        pic = img.crop((100*(1+i), 170, 100*(1+i)+100, 280))
        plt.imshow(pic)
        seq = get_save_seq(label[i])
        pic.save(''.join(['/root/PycharmProjects/untitled/botstudy/day05/cut_number/', str(label[i]), '/', str(seq), '.png']))

def clean_to_cut():
    captchas = os.listdir(''.join(['/root/PycharmProjects/untitled/botstudy/day05/clean_images/']))
    for captcha in captchas:
        label = captcha.split('.')[0]
        cutImg(label)

if __name__ == '__main__':
    captchas = os.listdir(''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_images/']))
    for captcha in captchas:
        #print(captcha)
        label = captcha.split('.')[0]
        path = ''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_images/', label, '.png'])
        # 降噪
        # img_gary = binarization(path)
        # noiseReduction(img_gary, label)
        #create_dir()
        clean_to_cut()
        path = ''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_images/', label, '.png'])
        binarization(path)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

import os
from PIL import  Image
import  numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import  LogisticRegression
from sklearn.model_selection import  GridSearchCV

from sklearn.externals import joblib

from captcha_logistic import *


def load_data():
    X,Y = [],[]
    cut_list = os.listdir('/root/PycharmProjects/untitled/botstudy/day05/cut_number')
    for numC in cut_list:
        num_list_dir = ''.join(['/root/PycharmProjects/untitled/botstudy/day05/cut_number/',str(numC),'/'])
        nums_dir = os.listdir(num_list_dir)
        for num_file in nums_dir:
            img = Image.open(''.join(['/root/PycharmProjects/untitled/botstudy/day05/cut_number/',str(numC),'/',num_file]))
            img_gray = img.convert('L')
            img_array = np.array(img_gray)
            w,h = img_array.shape
            for x in range(w):
                for y in range(h):
                    gray = img_array[x,y]
                    if gray <= 240:
                        img_array[x,y] = 0
                    else:
                        img_array[x,y] = 1

            img_re = img_array.reshape(1,-1)
            X.append(img_re[0])
            Y.append(int(numC))
    return np.array(X),np.array(Y)

def generate_model(X,Y):
    X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size = 0.3)
    log_clf = LogisticRegression(multi_class='ovr',solver='sag',max_iter=10000)

    log_clf.fit(X_train,Y_train)
    joblib.dump(log_clf,'/root/PycharmProjects/untitled/botstudy/day05/captcha_model/captcha_model.model')


def get_model():
    model = joblib.load('/root/PycharmProjects/untitled/botstudy/day05/captcha_model/captcha_model.model')
    return model

def captcha_predict():
    path = '/root/PycharmProjects/untitled/botstudy/day05/captcha_predict/04582.png'
    pre_img_gray = binarizaion(path)
    noiseReduction(pre_img_gray,'04582')
    labels = ['0','1','2','3','4']
    img = Image.open(''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_predict/04582.png']))
    for i in range(5):
        pic = img.crop((100*(1+i), 170, 100*(1+i)+100, 280))
        plt.imshow(pic)
        pic.save(''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_predict/',labels[i],'.png']))

    result = ''
    model = get_model()
    for i in range(5):
        path = ''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_predict/',labels[i],'.png'])
        img = Image.open(path)
        img_gray = img.convert('L')
        img_array = np.array(img_gray)
        w,h = img_array.shape
        for x in range(w):
            for y in range(h):
                gray = img_array[x,y]
                if gray<=220:
                    img_array[x,y] = 0
                else:
                    img_array[x,y] = 1

        img_re = img_array.reshape(1,-1)
        X = img_re[0]
        Y_pre = model.predict([X])
        result = ''.join([result,str(y_pre[0])])
    return result


if __name__ == '__main__':
    X,Y = load_data()decision_tree_regresssion.py
iris_decision_tree.py
    generate_model(X, Y)
    #captcha_predict()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值