全国高校计算机能力挑战赛验证码识别
先下载要生成验证码的字体或者用电脑自带的字体,默认生成10张,根据需求增加干扰线、调整背景颜色或者字体颜色。
import random
import string
import sys
import math
from PIL import Image,ImageDraw,ImageFont,ImageFilter
#字体的位置,不同版本的系统会有不同
font_path = 'C:/Windows/Fonts/georgiaz.ttf'
#生成几位数的验证码
number = 4
#生成验证码图片的高度和宽度
size = (120,40)
#背景颜色,默认为白色
bgcolor = (random.randint(0,255),random.randint(0,255),random.randint(0,255))
#字体颜色,默认为蓝色
fontcolor = (random.randint(0,255),random.randint(0,255),random.randint(0,255))
#干扰线颜色。默认为红色
linecolor = (255,192,203)
#是否要加入干扰线
draw_line = True
#加入干扰线条数
line_number = 4
#加入干扰点
point_number = 100
source = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e',
'f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u',
'v','w','x','y','z','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U','V', 'W', 'X', 'Y', 'Z']
import sys
import csv
f = open("D:/1.csv",'w',encoding='utf-8',newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(["ID","label"])
#用来随机生成一个字符串
def gene_text():
return ''.join(random.sample(source,number))#number是生成验证码的位数
#用来绘制干扰线
def gene_line(draw,width,height):
begin = (random.randint(0, width), random.randint(0, height))
end = (random.randint(0, width), random.randint(0, height))
draw.line([begin, end], fill = (linecolor))
def gene_point(draw,width,height):
begin = (random.randint(0, width), random.randint(0, height))
end = (random.randint(0, width), random.randint(0, height))
draw.point([begin, end], fill = (random.randint(0,255),random.randint(0,255),random.randint(0,255)))
#生成验证码
def gene_code(t):
width,height = size #宽和高
#背景颜色,默认为白色
bgcolor = (random.randint(0,255),random.randint(0,255),random.randint(0,255))
#字体颜色,默认为蓝色
fontcolor = (random.randint(0,255),random.randint(0,255),random.randint(0,255))
#干扰线颜色。默认为红色
linecolor = (255,192,203)
image = Image.new('RGB',(width,height),bgcolor) #创建图片
font = ImageFont.truetype(font_path,35) #验证码的字体
draw = ImageDraw.Draw(image) #创建画笔
text = gene_text() #生成字符串
font_width, font_height = font.getsize(text)
draw.text(((width - font_width) / number, (height - font_height) / number),text,\
font= font,fill=fontcolor) #填充字符串
if draw_line:
for i in range(line_number):
gene_line(draw,width,height)
for i in range(point_number):
gene_point(draw, width, height)
# image = image.transform((width+30,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
#image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
#image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
csv_writer.writerow(['./train_data/'+str(t)+'.jpg',text])
image.save('D:/train_data/' + str(t) +'.jpg') #保存验证码图片
count = 10
if __name__ == "__main__":
for i in range(count):
gene_code(i)
print('finish')
效果图: