<强> 0。引言强>
平时上网干啥的基本上都会接触验证码,或者在机器学习学习过程中,大家或许会接触过手写体识别/验证码识别之类问题,会用到手写体的数据集;
自己尝试写了一个生成手写体图片的python程序,在此分享下生成单张30 * 30像素的手写体数字1 - 9图像的一种实现方法;
我是利用随机生成随机数1 - 9,然后公益诉讼写到图像上,然后经过旋转,扭曲处理,得到“手写体”,这里没有加干扰线和干扰点;
得到的手写体数字图像如图1所示,
实现比较简单,用了公益诉讼库,不需要额外安装opencv啥的,有兴趣可以自己试试。
图1生成的手写体数字1 - 9
图2利用generate_pngs.py写入到文件夹3的数字3图像
如果你想生成手写体的字母/汉字也可以:
图3利用generate_single_png.py生成汉字的手写体
源码上传到了我的GitHub: https://github.com/coneypo/Generate_handwritten_number
<强> 1。设计流程强>
图4整体设计流程
图5生成的图像经过的处理
1.1新建一个空白图像img_50,尺寸大小为50 * 50,
img_50_blank=形象。新(RGB, (50,50) (255、255、255))
<强>为什么我这里要先生成50 * 50的空白图像? 强>
因为图像背景(50 * 50像素的画布)初始化的时候设置为白色(颜色数组(255、255、255)),而背景色之外的其实是黑色;
之后需要进行旋转处理,如果直接新建30 * 30像素的画布,旋转之后边上会出现黑边,如图6所示,
所以我新建了一个50 * 50,然后旋转之后从中间裁出来一个30 * 30的图像出来,
图6直接用30 * 30像素的画布写字旋转(会出现黑边)
1.2利用公益诉讼在图像上写文字
利用公益诉讼的ImageDraw,创建画笔,然后利用draw.text在指定位置写字;
xy=(18日11)是从图像左上角开始的坐标,取值自己根据需求调整;
#创建画笔 画=ImageDraw.Draw (img_50_blank) #生成随机数1 - 9 num=str(随机的。randint (9)) #设置字体,这里选取字体大小25岁 字体=ImageFont.truetype (simsun。ttc ', 20) # xy是左上角开始的位置坐标 画画。11)文本(xy=(18日,字体=字体,文本=num,填补=(0,0,0))
1.3将图像随机旋转一定角度
利用旋转(天使)进行旋转图像,天使取的是度数,这里让它随机旋转-10到+ 10度:
#随机旋转的真空度角度 random_angle=随机的。randint(-10年,10) img_50_rotated=img_50_blank.rotate (random_angle)
1.4图像扭曲
这里是生成“手写体”数字的核心步骤,一个正常的图像经过扭曲之后就可以得到想要的验证码了:
#图形扭曲参数 params=[1 -(随机浮动。randint (1、2))/100, 0, 0, 0, 1 -(随机浮动。randint (10))/100, (随机浮动。randint (1、2))/500, 0.001, (随机浮动。randint (1、2))/500) #创建扭曲 img_50_transformed=img_50_rotated。变换(50,50)的形象。的角度来看,params)
<强> 2. py源码介绍强>
2.1 generate_folders_1to9.py
因为我们要将指定的图像分类放入指定文件夹,所以我们需要先在项目目录下面新建9个文件夹:
(当然你也可以自己新建,新建9个文件夹工作量还不大,但是如果要生成的验证码包含英文字母那就比较多了,大写所有共24个+小写所有共24个+数字1 - 9共9个=57个子文件夹)