Python 新手實戰之機器學習實現簡單驗證碼識別(一):用PIL簡單繪製驗證碼
阿新 • • 發佈:2019-02-08
驗證碼生成
from PIL import Image, ImageDraw, ImageFont
import random, os
def draw():
#隨機生成背景顏色 (RGB顏色範圍為0-255,越高越接近白色),背景顏色不宜過深,所以選擇從200到255
bkcolor = (random.randrange(200, 255), random.randrange(200, 255), random.randrange(200, 255))
#生成驗證碼的寬度
width = 200
#生成驗證碼的高度
height = 60
#驗證碼備選字型檔,增加了數字出現的頻率,並且去掉了容易混淆的O,0
strlist = 'QWERTYUIPASDFGHJKLZXCVBNM123456789123456789123456789'
#建立一張新圖片
im = Image.new('RGB', (width, height), bkcolor)
#初始化一個畫筆
Draw = ImageDraw.Draw(im)
#從字型庫中選出所有字型的列表
fonts = os.listdir('./font')
#初始化字元
st = ''
#for迴圈隨機生成6個字元
for i in range(6):
#隨機選擇一個字型
ran_font = random.choice(fonts)
#生成字型路徑
font_file = os.path.join('./font', ran_font)
#讀取字型
font = ImageFont.truetype(font_file, size=30)
#生成字型顏色,不宜過淺
fontcolor = (random.randrange (0, 100), random.randrange(0, 100), random.randrange(0, 100))
#從字元庫中隨機選出一個字元
word = strlist[random.randrange(len(strlist))]
st += word
#繪製字元,間隔根據生成情況調整
Draw.text((10 + i * 30, 15), a, fontcolor, font)
#迴圈生成噪點
for i in range(random.randrange(400, 800)):
#噪點顏色
fill = (random.randrange(100, 255), random.randrange(100, 255), random.randrange(100, 255))
#繪製噪點
Draw.point((random.randrange(100), random.randrange(30)), fill)
#返回圖片與字串
return im, st
def createimage(num):
for i in range(num):
im, st = draw()
#儲存圖片
im.save('./image/image-%s.jpg' % st)
if __name__ == '__main__':
createimage(100)
生成以後的效果