平時上網干啥的基本上都會接觸驗證碼,或者在機器學習學習過程中,大家或許會接觸過手寫體識別/驗證碼識別之類問題,會用到手寫體的數據集;
自己嘗試寫了一個生成手寫體圖片的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

圖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度:
新聞熱點
疑難解答