import os
import time
import random
import threading
import numpy as np
from PIL import Image, ImageFilter
from concurrent.futures import ThreadPoolExecutor
def image_clean(path):
"""
清洗图片
:param path: 图片路径
:return img_end, filename: 清洗好的图片以及图片名称
"""
# 读取图片
img = Image.open(path)
# 将图片转换为灰度图
img_l = img.convert('L')
# 将灰度图转换为数组形式
img_arr = np.array(img_l)
# 求出该数组的平均值
means = img_arr.mean()
# 调整平均值,作为清洗参数
if means > 227:
means = means + 30
# print('means:', means)
# 清洗灰度图中的“雀斑”
img_clean = img_l.point(lambda i: i>means-40, mode='1')
# 使用中值滤波再次清洗
img_end = img_clean.filter(ImageFilter.MedianFilter(size=3))
# print(im_f.size) (160, 60)
filename = img.filename.split('.')[1].rsplit('/')[-1]
return img_end, filename
def split_image(img):
"""
将验证码中的字符进行拆分
:param img: 验证码图片对象
:return real_letters: 图片分割坐标
"""
inletter = False
foundletter = False
start = 0
end = 0
letters = list()
# 遍历图片中的像素点,进行切割位置识别
for x in range(img.size[0]):
for y in range(img.size[1]):
pix = img.getpixel((x, y))
if pix != 1:
inletter = True
if foundletter == False and inletter == True:
foundletter = True
start = x
if foundletter == True and inletter == False:
foundletter = False
end = x
letters.append((start, end))
inletter = False
real_letters = list()
# 切割后的图片宽度小于15,大概率为没有清洗好的像素点,所以直接舍弃
for n in letters:
if abs(n[0] - n[1]) > 15:
real_letters.append(n)
# 如果real_letters为3,代码有2个字符被分割到了一起
if len(real_letters) == 3:
res = max(real_letters, key=max_pro)
res_index = real_letters.index(res)
le = list()
for i in range(4):
if len(le) == 4:
break
if i == res_index:
# 再次分割图片
ca = round(abs(real_letters[i][1] - real_letters[i][0]) / 2)
le.append((real_letters[i][0], real_letters[i][0] + ca))
le.append((real_letters[i][0] + ca +1, real_letters[i][1]))
else:
le.append(real_letters[i])
real_letters = le
# 如果real_letters为2,代码有3个字符被分割到了一起
elif len(real_letters) == 2:
res = max(real_letters, key=max_pro)
res_index = real_letters.index(res)
le = list()
for i in range(4):
if len(le) == 4:
break
if i == res_index:
# 再次分割图片
ca = round(abs(real_letters[i][1] - real_letters[i][0]) / 3)
le.append((real_letters[i][0], real_letters[i][0] + ca))
le.append((real_letters[i][0] + ca + 1, real_letters[i][0] + ca + ca))
le.append((real_letters[i][0] + ca + ca +1, real_letters[i][1]))
else:
le.append(real_letters[i])
real_letters = le
# 4为正确分割,此时什么都不用做
elif len(real_letters) == 4:
pass
# 出现其他情况,则放弃该验证码
else:
return None
return real_letters
def max_pro(x):
"""
返回两点间的绝对值距离
"""
return abs(x[0] - x[1])
def save_image(img, filename, letters):
"""
:param img: 验证码图片对象
:param filename: 验证码图片名称(真实值)
:param letters: 图片分割坐标
:return : None
"""
for i, v in enumerate(letters):
# 切割的起始横坐标,起始纵坐标,切割的宽度,切割的高度
img_split = img.crop((v[0], 0, v[1], img.size[1]))
# 将图片size进行统一
i_m_g = img_split.resize((40, 60), Image.ANTIALIAS)
# windows文件夹名不区分大小写,所以文件夹名需要更改
if filename[i].isupper():
dir_name = filename[i] + '_Upper'
i_m_g.save(f'./chars/{dir_name}/{filename[i] + str(random.randint(1, 999)) + str(time.time())[:8]}.jpg')
else:
i_m_g.save(f'./chars/{filename[i]}/{filename[i] + str(random.randint(1, 999)) + str(time.time())[-6:]}.jpg')
def make_dir():
"""
创建程序需要的文件夹
"""
# 分割验证码的文件夹
os.makedirs('./chars/')
# 小写字母列表
word_lower_list = [chr(i) for i in range(97,123)]
# 大写字母列表
word_upper_list = [chr(i).upper() + '_Upper' for i in range(97,123)]
# 数字列表
num_list = [str(i) for i in range(10)]
# 验证码内容:大小写字母+数字
yzm_list = [yzm for yzm in word_lower_list + word_upper_list + num_list]
# 创建字符列表中的文件夹
for i in yzm_list:
os.makedirs('./chars/' + i)
def run(path):
"""
线程任务函数
"""
img, filename = image_clean(path)
letters = split_image(img)
if letters is None:
pass
else:
save_image(img, filename, letters)
print(f'{threading.current_thread().name}:分割{filename}完成!!!')
def main():
"""
主函数
"""
img_list = os.listdir('./imgs/')
for i in img_list:
path = './imgs/' + i
# 线程任务
thread_pool.submit(run, path)
if __name__ == '__main__':
# 创建线程池
thread_pool = ThreadPoolExecutor(max_workers=10, thread_name_prefix="task")
# 创建需要的文件夹
make_dir()
start = time.time()
# 运行主函数
main()
# 阻塞任务
thread_pool.shutdown(wait=True)
end = time.time()
print(f'用时:{round(end - start)}秒!')
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于机器学习算法的验证码识别脚本.zip (2000个子文件)
X80015999966.jpg 2KB
G21615999966.jpg 2KB
G56315999966.jpg 2KB
087715999965.jpg 2KB
G3415999966.jpg 1KB
G16815999966.jpg 1KB
060415999965.jpg 1KB
X21915999966.jpg 1KB
G64015999966.jpg 1KB
G90215999966.jpg 1KB
E74815999966.jpg 1KB
G32415999966.jpg 1KB
E76115999966.jpg 1KB
V41315999965.jpg 1KB
U28115999966.jpg 1KB
I27315999966.jpg 1KB
X29915999966.jpg 1KB
083115999966.jpg 1KB
010415999965.jpg 1KB
045115999966.jpg 1KB
014615999965.jpg 1KB
V95515999966.jpg 1KB
G36215999966.jpg 1KB
010815999966.jpg 1KB
E24215999966.jpg 1KB
U26015999966.jpg 1KB
G12115999966.jpg 1KB
068915999966.jpg 1KB
016415999966.jpg 1KB
E4815999966.jpg 1KB
X14215999966.jpg 1KB
E79915999966.jpg 1KB
E21115999966.jpg 1KB
057115999965.jpg 1KB
046715999965.jpg 1KB
G57415999966.jpg 1KB
G63615999966.jpg 1KB
d79215999966.jpg 1KB
X46015999965.jpg 1KB
011815999965.jpg 1KB
G91915999966.jpg 1KB
033015999966.jpg 1KB
G80215999966.jpg 1KB
G2015999966.jpg 1KB
E90015999965.jpg 1KB
E67615999965.jpg 1KB
I6615999966.jpg 1KB
G99315999966.jpg 1KB
U69215999966.jpg 1KB
E52315999965.jpg 1KB
E96215999966.jpg 1KB
E58115999966.jpg 1KB
X99515999966.jpg 1KB
I24215999966.jpg 1KB
016015999965.jpg 1KB
059215999965.jpg 1KB
087715999966.jpg 1KB
056415999965.jpg 1KB
E70115999965.jpg 1KB
X77115999966.jpg 1KB
031215999965.jpg 1KB
X51515999966.jpg 1KB
015615999966.jpg 1KB
E3715999966.jpg 1KB
046615999966.jpg 1KB
d26815999965.jpg 1KB
U47315999966.jpg 1KB
U85515999966.jpg 1KB
V56715999966.jpg 1KB
080215999965.jpg 1KB
G95415999966.jpg 1KB
G63515999966.jpg 1KB
E73215999966.jpg 1KB
U58815999966.jpg 1KB
G57515999966.jpg 1KB
t61315999966.jpg 1KB
G69115999966.jpg 1KB
E83115999966.jpg 1KB
G90115999966.jpg 1KB
G8815999966.jpg 1KB
010215999965.jpg 1KB
G94815999966.jpg 1KB
E91915999965.jpg 1KB
U15715999966.jpg 1KB
G79615999966.jpg 1KB
U10915999966.jpg 1KB
U62715999966.jpg 1KB
d11415999965.jpg 1KB
I37215999966.jpg 1KB
G62715999966.jpg 1KB
G48615999966.jpg 1KB
G34915999966.jpg 1KB
X72915999965.jpg 1KB
l79415999966.jpg 1KB
079315999965.jpg 1KB
G49815999966.jpg 1KB
E54315999966.jpg 1KB
G43015999966.jpg 1KB
G6715999966.jpg 1KB
050515999966.jpg 1KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
博士僧小星
- 粉丝: 1936
- 资源: 5894
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于SpringBoot+MySQL+Guava+Redis+RabbitMQ实现高并发商品限时秒杀系统.rar
- 22222222222222222
- ADSP-BF533的例程源码60:NORFLASH驱动源码(s29al016)
- Linux centos telnet 离线安装rpm
- ADSP-BF533的例程源码58:汉字字库源码
- newtask3-1newtask3-1newtask3-1newtask3-1
- Vue前端开发手册pdf
- 【STM32F103】STM32F103读取PAC功率传感器
- 超级好用的zotero插件,用以进行pdf文件的翻译
- ADSP-BF533的例程源码57:光标显示源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功