首页 > 编程 > Python > 正文

Python3生成手写体数字方法

2020-02-22 23:03:23
字体:
来源:转载
供稿:网友

0.引言

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

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

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

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

  实现比较简单,用了PIL库,不需要额外安装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 = Image.new('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 利用PIL在图像上写文字

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

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

# 创建画笔 draw = ImageDraw.Draw(img_50_blank)# 生成随机数1-9num = str(random.randint(1, 9))# 设置字体,这里选取字体大小25font = ImageFont.truetype('simsun.ttc', 20)# xy是左上角开始的位置坐标draw.text(xy=(18, 11), font=font, text=num, fill=(0, 0, 0))

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表