import random
from PIL import ImageDraw, Image, ImageFont
def getRandomStr():
random_num = str(random.randint(0, 9))
return random_num
def getRandomColor():
font_color = [random.randint(0,255), random.randint(0,255), random.randint(0,255)]
return tuple(font_color)
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
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)
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())
draw.point([random.randint(0, width), random.randint(0, height)], fill=getRandomColor())
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=(0, 0, 0))
image.save(open(''.join(['captcha_images/', label, '.png']), 'wb'), 'png')
if name == ‘main’:
for i in range(150):
generate_captcha()
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import os
def binarization(path):
img = Image.open(path)
img_gray = img.convert('L')
img_gray = np.array(img_gray)
print(img_gray)
w, h = img_gray.shape
for x in range(w):
for y in range(h):
gray = img_gray[x, y]
if gray <= 220:
img_gray[x, y] = 0
else:
img_gray[x, y] = 1
# plt.figure('')
# plt.imshow(img_gray,cmap='gray')
# plt.axis('off')
# plt.show()
return img_gray
def noiseReduction(img_gray,label):
height,width = img_gray.shape
for x in range(height):
for y in range(width):
cnt = 0
if img_gray[x,y] == 1:
continue
else:
try:
if img_gray[x-1,y-1] == 0:
cnt += 1
except:
pass
try:
if img_gray[x-1,y] == 0:
cnt += 1
except:
pass
try:
if img_gray[x,y-1] == 0:
cnt += 1
except:
pass
try:
if img_gray[x+1,y+1] == 0:
cnt += 1
except:
pass
try:
if img_gray[x+1,y] == 0:
cnt += 1
except:
pass
try:
if img_gray[x,y+1] == 0:
cnt += 1
except:
pass
try:
if img_gray[x-1,y+1] == 0:
cnt += 1
except:
pass
try:
if img_gray[x+1,y-1] == 0:
cnt += 1
except:
pass
if cnt < 4:
img_gray[x,y] =1
plt.figure('')
plt.imshow(img_gray, cmap='gray')
plt.axis('off')
# plt.show()
plt.savefig(''.join(['/root/PycharmProjects/untitled/botstudy/day05/clean_images/', label, '.png']))
def create_dir():
for i in range(10):
os.mkdir(''.join(['/root/PycharmProjects/untitled/botstudy/day05/cut_number/', str(i)]))
def clean_to_cut():
captchas = os.listdir(''.join(['/root/PycharmProjects/untitled/botstudy/day05/clean_captcha_img/']))
for captcha in captchas:
label = captcha.split('.')[0]
cutImg(label)
def get_save_seq(num):
numlist = os.listdir(''.join(['/root/PycharmProjects/untitled/botstudy/day05/cut_number/', num, '/']))
if len(numlist) == 0 or numlist is None:
return 0
else:
max_file = 0
for file in numlist:
if int(file.split('.')[0]) > max_file:
max_file = int(file.split('.')[0])
return int(max_file)+1
def cutImg(label):
labels = list(label)
img = Image.open(''.join(['/root/PycharmProjects/untitled/botstudy/day05/clean_images/', label, '.png']))
for i in range(5):
pic = img.crop((100*(1+i), 170, 100*(1+i)+100, 280))
plt.imshow(pic)
seq = get_save_seq(label[i])
pic.save(''.join(['/root/PycharmProjects/untitled/botstudy/day05/cut_number/', str(label[i]), '/', str(seq), '.png']))
def clean_to_cut():
captchas = os.listdir(''.join(['/root/PycharmProjects/untitled/botstudy/day05/clean_images/']))
for captcha in captchas:
label = captcha.split('.')[0]
cutImg(label)
if __name__ == '__main__':
captchas = os.listdir(''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_images/']))
for captcha in captchas:
#print(captcha)
label = captcha.split('.')[0]
path = ''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_images/', label, '.png'])
# 降噪
# img_gary = binarization(path)
# noiseReduction(img_gary, label)
#create_dir()
clean_to_cut()
path = ''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_images/', label, '.png'])
binarization(path)
import os
from PIL import Image
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.externals import joblib
from captcha_logistic import *
def load_data():
X,Y = [],[]
cut_list = os.listdir('/root/PycharmProjects/untitled/botstudy/day05/cut_number')
for numC in cut_list:
num_list_dir = ''.join(['/root/PycharmProjects/untitled/botstudy/day05/cut_number/',str(numC),'/'])
nums_dir = os.listdir(num_list_dir)
for num_file in nums_dir:
img = Image.open(''.join(['/root/PycharmProjects/untitled/botstudy/day05/cut_number/',str(numC),'/',num_file]))
img_gray = img.convert('L')
img_array = np.array(img_gray)
w,h = img_array.shape
for x in range(w):
for y in range(h):
gray = img_array[x,y]
if gray <= 240:
img_array[x,y] = 0
else:
img_array[x,y] = 1
img_re = img_array.reshape(1,-1)
X.append(img_re[0])
Y.append(int(numC))
return np.array(X),np.array(Y)
def generate_model(X,Y):
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size = 0.3)
log_clf = LogisticRegression(multi_class='ovr',solver='sag',max_iter=10000)
log_clf.fit(X_train,Y_train)
joblib.dump(log_clf,'/root/PycharmProjects/untitled/botstudy/day05/captcha_model/captcha_model.model')
def get_model():
model = joblib.load('/root/PycharmProjects/untitled/botstudy/day05/captcha_model/captcha_model.model')
return model
def captcha_predict():
path = '/root/PycharmProjects/untitled/botstudy/day05/captcha_predict/04582.png'
pre_img_gray = binarizaion(path)
noiseReduction(pre_img_gray,'04582')
labels = ['0','1','2','3','4']
img = Image.open(''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_predict/04582.png']))
for i in range(5):
pic = img.crop((100*(1+i), 170, 100*(1+i)+100, 280))
plt.imshow(pic)
pic.save(''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_predict/',labels[i],'.png']))
result = ''
model = get_model()
for i in range(5):
path = ''.join(['/root/PycharmProjects/untitled/botstudy/day05/captcha_predict/',labels[i],'.png'])
img = Image.open(path)
img_gray = img.convert('L')
img_array = np.array(img_gray)
w,h = img_array.shape
for x in range(w):
for y in range(h):
gray = img_array[x,y]
if gray<=220:
img_array[x,y] = 0
else:
img_array[x,y] = 1
img_re = img_array.reshape(1,-1)
X = img_re[0]
Y_pre = model.predict([X])
result = ''.join([result,str(y_pre[0])])
return result
if __name__ == '__main__':
X,Y = load_data()decision_tree_regresssion.py
iris_decision_tree.py
generate_model(X, Y)
#captcha_predict()