机器学习项目实战:图片验证码识别

项目分析

基于逻辑回归和图像处理的项目
输入:一个验证码图像
输出:这个验证码图像中的数字(字母)

步骤

  1. 对图像进行处理
    (1)二值化:首先把图像从RGB3通道转化成Gray1通道,然后把灰度图(0~255)转化成二值图(0,1)

    (2)降噪:通过处理孤立点,对二值化的图进行降噪

    (3)图片切割:根据像素格,把图片中的所有(5个)数字,分别保存到对应的0~9文件夹下

    至此:数据处理就完成了

  2. 把数据带入逻辑回归进行建模
    (1)把切割好的数据,按照X(二位数组),Y(一维数组)的方式传入logisticRegression.fit()函数进行拟合,我们可以通过网格搜索(GridSearch)来进行调参

    (2)通过joblib包,把模型保存到本地

  3. 得到模型后,进行图像验证
    (1)根据步骤1,重复操作新的图像

    (2)对切割好的每个图像,独立的进行预测

    (3)把最后预测结果进行拼接

用到的技术:
分类:逻辑回归
模型选择:网格搜索, 查准率 查全率, 混淆矩阵,准确率(score)
图像处理的技术:RGB转灰度转二值,8位降噪,图像切割

代码实现

生成训练使用的验证码图片(150张)

生成的图片效果展示

在这里插入图片描述

生成图片代码

# encoding=utf-8
"""
Date:2019-08-10 09:53
User:LiYu
Email:liyu_5498@163.com

"""
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import random


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


def getRandomColor():
    R = random.randint(0, 255)
    G = random.randint(0, 255)
    B = random.randint(0, 255)
    if R == 255 and G == 255 and B == 255:
        R, G, B = 0, 0, 0
    return (R, G, B)


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  # 存起来
        # left, top = 10 + i * 30, 0  text = random_char  随机颜色getRandomColor() 指定字体
        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)
        # (起始X,Y, 终止X,Y)   颜色
        draw.line((x1, y1, x2, y2), fill=(0, 0, 0))

    # 画点
    for i in range(5):  # 五个彩色点,五个黑色弧线(相当于占四个像素的点)
        x = random.randint(0, width)
        y = random.randint(0, height)
        # 画点(x, y)  颜色
        draw.point((random.randint(0, width), random.randint(0, height)), fill=getRandomColor())
        # 画弧 (起始x, y, 终止x, y) 起始弧度0  终止弧度90  颜色
        draw.arc((x, y, x + 4, y + 4), 0, 
  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值