文章目录
项目分析
基于逻辑回归和图像处理的项目
输入:一个验证码图像
输出:这个验证码图像中的数字(字母)
步骤
-
对图像进行处理
(1)二值化:首先把图像从RGB3通道转化成Gray1通道,然后把灰度图(0~255)转化成二值图(0,1)(2)降噪:通过处理孤立点,对二值化的图进行降噪
(3)图片切割:根据像素格,把图片中的所有(5个)数字,分别保存到对应的0~9文件夹下
至此:数据处理就完成了
-
把数据带入逻辑回归进行建模
(1)把切割好的数据,按照X(二位数组),Y(一维数组)的方式传入logisticRegression.fit()函数进行拟合,我们可以通过网格搜索(GridSearch)来进行调参(2)通过joblib包,把模型保存到本地
-
得到模型后,进行图像验证
(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,