0.引言

平时上网干啥的基本上都会接触验证码,或者在机器学习学习过程中,大家或许会接触过手写体识别/验证码识别之类问题,会用到手写体的数据集;

自己尝试写了一个生成手写体图片的python程序,在此分享下生成单张 30*30像素的手写体数字1-9图像的一种实现方法;

我是利用random生成随机数1-9,然后PIL写到图像上,然后经过旋转、扭曲处理,得到“手写体”,这里没有加干扰线和干扰点;

得到的手写体数字图像如图1所示;

实现比较简单,用了PIL库,不需要额外安装opencv啥的,有兴趣可以自己试试。

图1 生成的手写体数字1-9

图2 文件夹3下生成的数字3图像

1.设计流程

图3 整体设计流程

1.1 新建一个空白图像img_50,尺寸大小为50*50

1 img_50_blank = Image.new('RGB', (50, 50), (255, 255, 255))

为什么我这里要先生成50*50的空白图像?

因为图像背景(50*50像素的画布)初始化的时候设置为白色(颜色数组(255, 255, 255)),而背景色之外的其实是黑色;

之后需要进行旋转处理,如果直接新建30*30像素的画布,旋转之后边上会出现黑边,如图4所示;

所以我新建了一个50*50,然后旋转之后从中间裁出来一个30*30的图像出来;

图4 直接用30*30像素的画布写字旋转(会出现黑边)

1.2 利用PIL在图像上写文字

利用PIL的ImageDraw,创建画笔,然后利用draw.text在指定位置写字;

xy=(18,11)是从图像左上角开始的坐标,取值自己根据需求调整;

1 #创建画笔

2 draw =ImageDraw.Draw(img_50_blank)3

4 #生成随机数1-9

5 num = str(random.randint(1, 9))6

7 #设置字体,这里选取字体大小25

8 font = ImageFont.truetype('simsun.ttc', 20)9

10 #xy是左上角开始的位置坐标

11 draw.text(xy=(18, 11), font=font, text=num, fill=(0, 0, 0))

1.3 将图像随机旋转一定角度

利用 rotate(angel) 进行旋转图像,angel取的是度数,这里让它随机旋转-10到+10度:

1 #随机旋转-10-10角度

2 random_angle = random.randint(-10, 10)3 img_50_rotated = img_50_blank.rotate(random_angle)

1.4 图像扭曲

这里是生成“手写体”数字的核心步骤,一个正常的图像经过扭曲之后就可以得到想要的验证码了:

1 #图形扭曲参数

2 params = [1 - float(random.randint(1, 2)) / 100,3 0,4 0,5 0,6 1 - float(random.randint(1, 10)) / 100,7 float(random.randint(1, 2)) / 500,8 0.001,9 float(random.randint(1, 2)) / 500]10

11 #创建扭曲

12 img_50_transformed = img_50_rotated.transform((50, 50), Image.PERSPECTIVE, params)

2.py源码介绍

2.1 generate_folders_1to9.py

因为我们要将指定的图像分类放入指定文件夹,所以我们需要先在项目目录下面新建9个文件夹:

(当然你也可以自己新建,新建9个文件夹工作量还不大,但是如果要生成的验证码包含英文字母那就比较多了,大写A-Z共24个+小写a-z共24个+数字1-9共9个=57个子文件夹)

1 #2018-01-9

2 #By TimeStamp

3 #cnblogs: http://www.cnblogs.com/AdaminXie/

4 #generate_folders_1to9.py

5 #在目录下生成用来存放数字1-9的9个文件夹,分别用1-9命名

6

7

8 importos9

10 path_folders = "F:/***/P_generate_handwritten_number/data_pngs/"

11

12 #1-9

13 for i in range(49,58):14 if (os.path.isdir(path_folders +chr(i))):15 pass

16 else:17 #print(i,": ",path_1+chr(i))

18 #生成目录

19 os.mkdir(path_folders+chr(i))

图5 自动生成的用来存放指定图像的文件夹

2.2generate_pngs.py

生成手写体数字,然后存放到本地文件夹1-9:

1 #2018-01-9

2 #By TimeStamp

3 #cnblogs: http://www.cnblogs.com/AdaminXie/

4 #generate_pngs.py

5 #生成手写体数字

6

7

8 importrandom9 from PIL importImage, ImageDraw, ImageFilter, ImageFont10

11 random.seed(3)12

13 #生成单张扭曲的数字图像

14 defgenerate_single():15

16 #先绘制一个50*50的空图像

17 img_50_blank = Image.new('RGB', (50, 50), (255, 255, 255))18

19 #创建画笔

20 draw =ImageDraw.Draw(img_50_blank)21

22 #生成随机数1-9

23 num = str(random.randint(1, 9))24

25 #设置字体,这里选取字体大小25

26 font = ImageFont.truetype('simsun.ttc', 20)27

28 #xy是左上角开始的位置坐标

29 draw.text(xy=(18, 11), font=font, text=num, fill=(0, 0, 0))30

31 #随机旋转-10-10角度

32 random_angle = random.randint(-10, 10)33 img_50_rotated =img_50_blank.rotate(random_angle)34

35 #图形扭曲参数

36 params = [1 - float(random.randint(1, 2)) / 100,37 0,38 0,39 0,40 1 - float(random.randint(1, 10)) / 100,41 float(random.randint(1, 2)) / 500,42 0.001,43 float(random.randint(1, 2)) / 500]44

45 #创建扭曲

46 img_50_transformed = img_50_rotated.transform((50, 50), Image.PERSPECTIVE, params)47

48 #生成新的30*30空白图像

49 img_30 = img_50_transformed.crop([10, 10, 40, 40])50

51 returnimg_30, num52

53 path_pic = "F:/***/P_generate_handwritten_number/data_pngs/"

54

55

56 #生成手写体数字1-9存入指定文件夹1-9

57

58 #用cnt_num[1]-cnt_num[9]来计数数字1-9生成的个数,方便之后进行命名

59 cnt_num =[]60 for i in range(10):61 cnt_num.append(0)62

63 #生成次数

64 samples = 200

65

66 for m in range(1, samples+1):67

68 #调用生成图像文件函数

69 img, generate_num =generate_single()70

71 #取灰度

72 imgray = img.convert('1')73

74 #计数生成的数字1-9的个数,用来命名图像文件

75 for j in range(1, 10):76 if(generate_num ==str(j)):77 cnt_num[j] = cnt_num[j]+1

78

79 #路径如 "F:/code/***/P_generate_handwritten_number/data_pngs/1/1_231.png"

80 #输出显示路径

81 print(path_pic + str(j) + "/" + str(j) + "_" + str(cnt_num[j]) + ".png")82 #将图像保存在指定文件夹中

83 imgray.save(path_pic + str(j) + "/" + str(j) + "_" + str(cnt_num[j]) + ".png")84

85 #输出显示1-9的分布

86 print("\n", "生成的1-9的分布:")87 for k in range(9):88 print(k+1, ":", cnt_num[k+1], "张")

output:

D:\***\anaconda\python.exe F:/***/P_generate_handwritten_number/generate_pngs.py

F:/***/P_generate_handwritten_number/data_pngs/4/4_1.png

F:/***/P_generate_handwritten_number/data_pngs/1/1_1.png

F:/***/P_generate_handwritten_number/data_pngs/8/8_1.png

F:/***/P_generate_handwritten_number/data_pngs/3/3_1.png

F:/***/P_generate_handwritten_number/data_pngs/1/1_2.png

...

生成的1-9的分布:1 : 25张2 : 17张3 : 21张4 : 19张5 : 20张6 : 22张7 : 25张8 : 24张9 : 27 张

修改 generate_pngs.py中的samples 你就可以生成自己想要的数据集大小。

2.3 del_pngs.py

删除指定目录下子文件夹1-9中的所有图片:

1 #2018-01-9

2 #By TimeStamp

3 #cnblogs: http://www.cnblogs.com/AdaminXie/

4 #del_pngs.py

5 #删除路径下生成的图像文件

6

7 importos8

9 path_pic = "F:/***/P_generate_handwritten_number/data_pngs/"

10

11 #删除路径下的图片

12 defdel_pic():13 for i in range(1, 10):14 #print(path_png+chr(i))

15 namedir = os.listdir(path_pic+str(i))16

17 for tmppng innamedir:18 if( tmppng innamedir):19 #print(tmppng)

20 os.remove(path_pic+str(i)+"/"+tmppng)21

22 del_pic()

3.总结

自己动手丰衣足食,有兴趣可以自己做手写体数字数据集;

# 交流学习可以联系邮箱 coneypo@foxmail.com

python制作图片数据集,Python 3 生成手写体数字数据集相关推荐

  1. python制作图片贴纸,python - 如何将剪贴画放在matplotlib中的绘制数据后面 - SO中文参考 - www.soinside.com...

    cbar_ax = fig.add_axes(..., zorder=-1)在轴之间排列z顺序. ax.set_facecolor('none')使散点图的背景完全透明(默认为不透明白色,将所有内容隐 ...

  2. python数字1 3怎么表示_Python3生成手写体数字方法

    0.引言 平时上网干啥的基本上都会接触验证码,或者在机器学习学习过程中,大家或许会接触过手写体识别/验证码识别之类问题,会用到手写体的数据集: 自己尝试写了一个生成手写体图片的python程序,在此分 ...

  3. python写数字,Python3生成手写体数字方法

    0.引言 平时上网干啥的基本上都会接触验证码,或者在机器学习学习过程中,大家或许会接触过手写体识别/验证码识别之类问题,会用到手写体的数据集: 自己尝试写了一个生成手写体图片的python程序,在此分 ...

  4. python图片转pdf文件_用python 制作图片转pdf工具

    这篇文章主要介绍了用python 制作图片转pdf工具的思路及代码,非常详细,有需要的小伙伴参考下 最近因为想要看漫画,无奈下载的漫画是jpg的格式,网上的转换器还没一个好用的,于是乎就打算用pyth ...

  5. GAN网络生成手写体数字图片

    Keras真香,以前都是用tensorflow来写神经网络,自从用了keras,发现这个Keras也蛮方便的. 目前感觉keras的优点就是方便搭建基于标准网络组件的神经网络,这里的网络组件包括全连接 ...

  6. 教你如何用python制作黑板模拟器 python 项目小发明 【安安教具】-【工具】-【黑板】模拟器

    黑板模拟器是一个多线程控制尝试,需要做到通过tkinter实现对鼠标的控制和监督.鼠标在移动时会有一个线程来检测鼠标的位置,计算窗口的位置,计算出鼠标在窗口中的位置,结合canvas画布实现对黑板的涂 ...

  7. 如何用python制作温度计模拟器 python项目小发明 【安安教具】-【物理】-【温度计】模拟器

    温度计测量水温的过程要满足如下条件: 1.不能碰烧杯底. 2.不能碰烧杯壁. 设计一款动手实践上面过程的软件,就是接下来要完成的~ 我们先看一下效果: 如何用python制作温度计模拟器 python ...

  8. 图像对抗生成网络 GAN学习01:从头搭建最简单的GAN网络,利用神经网络生成手写体数字数据(tensorflow)

    图像对抗生成网络 GAN学习01:从头搭建最简单的GAN网络,利用神经网络生成手写体数字数据(tensorflow) 文章目录 图像对抗生成网络 GAN学习01:从头搭建最简单的GAN网络,利用神经网 ...

  9. tensorflow学习笔记(十):GAN生成手写体数字(MNIST)

    文章目录 一.GAN原理 二.项目实战 2.1 项目背景 2.2 网络描述 2.3 项目实战 一.GAN原理 生成对抗网络简称GAN,是由两个网络组成的,一个生成器网络和一个判别器网络.这两个网络可以 ...

最新文章

  1. row number mysql_MySQL中的ROW_NUMBER()
  2. 替换功能replaceAll
  3. echarts 设置仪表盘数字的位置_一个 ECharts 做的猜数小游戏
  4. 【转】Monkey测试5-运行中停止monkey
  5. 使用PYTHON操作Excel的工具
  6. 线上故障如何快速排查?来看这套技巧大全
  7. Linux root用户无法打开Chrome或则chromium(kali)
  8. SAP CRM WebClient UI上分销渠道点击展开按钮后执行了哪些逻辑
  9. Tomcat打包时多项目共享jar和精确指定jar版本
  10. python集合中的元素不能是哪些数据类型_Python内置类型及常见问题
  11. Wireshark教程(简介、抓包、过滤器)
  12. bzoj 1202: [HNOI2005]狡猾的商人(带权并查集)
  13. Kompose: Docker-compose 到 Kubernetes 的迁移工具
  14. EasyUI基础入门之Parser(解析器)
  15. cmd命令卸载sql server_如何卸载SQL server
  16. 儿童早教APP开发成品案例
  17. 计算机思维在化学上的应用,【科学思维】化隐性为显性思想在化学中的应用
  18. 如何使用高德地图 API 做一个路线规划应用,展示自定义路线
  19. 2019年西安市民办小升初西工大附中分校面谈录取学生名单
  20. nginx安装、配置文件详解、测试

热门文章

  1. qt中configure参数配置说明
  2. js实现抽奖系统(可修改号码个数及抽奖次数)
  3. 【无标题】169-179笔记1月18日李游精品前端课程
  4. java web jsp的银行柜员绩效考核系统
  5. 电子商务公司的六种基因
  6. QQ聊天记录分析(R-3.5)
  7. 类变量,局部变量,实例变量
  8. 从Python安装到语法基础,这才是小白都能懂的爬虫教程
  9. Android中Textview文字设置不同颜色、下划线、加粗、超链接
  10. ubuntu下实现多个pdf文件合并