基于Logistic验证码识别
基于逻辑回归(Logistic)图像处理实现数字验证码的识别
一、准备数据(制作验证码)
通过在画布获取的随机数字(随机颜色),在添加干扰元素(噪点,噪线)
from PIL import Image
from PIL import ImageDraw,ImageFont
import random
def getRandomColor():
"""获取一个随机颜色RGB格式的(r,g,b)
如果获取到白色将其传为黑色"""
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
if (r, g, b) == (0, 0, 0):
(r, g, b) = (255, 255, 255)
return (r, g, b)
def getRandmStr():
"""获取一个随机数字且每个数字颜色也是随机的"""
random_num =str(random.randint(0,9))
return random_num
def generate_captcha():
#获取一个Image对象,参数分别是RGB模式,宽150,高50,背景为白色
image =Image.new('RGB',(150,50),(255,255,255))
#获取一个画笔对象,将图片对象传过去
draw = ImageDraw.Draw(image)
#获取一个font字体对象参数是ttf的字体文件的目录,以及字体的大小
font = ImageFont.truetype("LiberationSans-Bold.ttf",size=32)
label =""
for i in range(5):
random_char =getRandmStr()
label += random_char
#在图片上写东西,参数是:定位,字符串,颜色,字体
draw.text((10+i*30,0),random_char,getRandomColor(),font=font)
##噪点噪线
width =150
height =30
#画线
for i in range(4):
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())
x = random.randint(0, width)
y = random.randint(0, height)
#arc 弧线
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=(0, 0, 0))
#保存到硬盘,名为test.png格式的图片
image.save(open(''.join(['captcha_images/',label,'.png']),'wb'),'png')
if __name__ == '__main__':
for i in range(150):
generate_captcha()