最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3生成手寫體數(shù)字方法

 更新時間:2018年01月30日 15:14:45   作者:TimeStamp  
本篇文章給大家分享習(xí)如何Python3生成手寫體數(shù)字方法以及實例代碼分享,有興趣的朋友參考下吧。

0.引言

  平時上網(wǎng)干啥的基本上都會接觸驗證碼,或者在機(jī)器學(xué)習(xí)學(xué)習(xí)過程中,大家或許會接觸過手寫體識別/驗證碼識別之類問題,會用到手寫體的數(shù)據(jù)集;

  自己嘗試寫了一個生成手寫體圖片的python程序,在此分享下生成單張 30*30像素的手寫體數(shù)字1-9圖像 的一種實現(xiàn)方法;

  我是利用random生成隨機(jī)數(shù)1-9,然后PIL寫到圖像上,然后經(jīng)過旋轉(zhuǎn)、扭曲處理,得到“手寫體”,這里沒有加干擾線和干擾點;

  得到的手寫體數(shù)字圖像如圖1所示;

  實現(xiàn)比較簡單,用了PIL庫,不需要額外安裝opencv啥的,有興趣可以自己試試。

圖1 生成的手寫體數(shù)字1-9

  圖2 利用generate_pngs.py寫入到文件夾3的數(shù)字3圖像

  如果你想生成手寫體的字母/漢字也可以:

  圖3 利用generate_single_png.py生成漢字的手寫體

源碼上傳到了我的GitHub: https://github.com/coneypo/Generate_handwritten_number

1.設(shè)計流程

圖4 整體設(shè)計流程

圖5 生成的圖像經(jīng)過的處理

1.1 新建一個空白圖像img_50,尺寸大小為50*50 

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

為什么我這里要先生成50*50的空白圖像?

    因為圖像背景(50*50像素的畫布)初始化的時候設(shè)置為白色(顏色數(shù)組(255, 255, 255)),而背景色之外的其實是黑色;

  之后需要進(jìn)行旋轉(zhuǎn)處理,如果直接新建30*30像素的畫布,旋轉(zhuǎn)之后邊上會出現(xiàn)黑邊,如圖6所示;

  所以我新建了一個50*50,然后旋轉(zhuǎn)之后從中間裁出來一個30*30的圖像出來;

圖6 直接用30*30像素的畫布寫字旋轉(zhuǎn)(會出現(xiàn)黑邊)

1.2 利用PIL在圖像上寫文字

  利用PIL的ImageDraw,創(chuàng)建畫筆,然后利用draw.text在指定位置寫字;

  xy=(18,11)是從圖像左上角開始的坐標(biāo),取值自己根據(jù)需求調(diào)整;

# 創(chuàng)建畫筆
 draw = ImageDraw.Draw(img_50_blank)

# 生成隨機(jī)數(shù)1-9
num = str(random.randint(1, 9))

# 設(shè)置字體,這里選取字體大小25
font = ImageFont.truetype('simsun.ttc', 20)

# xy是左上角開始的位置坐標(biāo)
draw.text(xy=(18, 11), font=font, text=num, fill=(0, 0, 0))

1.3 將圖像隨機(jī)旋轉(zhuǎn)一定角度

  利用 rotate(angel) 進(jìn)行旋轉(zhuǎn)圖像,angel取的是度數(shù),這里讓它隨機(jī)旋轉(zhuǎn)-10到+10度:

# 隨機(jī)旋轉(zhuǎn)-10-10角度
 random_angle = random.randint(-10, 10)
 img_50_rotated = img_50_blank.rotate(random_angle)

1.4 圖像扭曲

  這里是生成“手寫體”數(shù)字的核心步驟,一個正常的圖像經(jīng)過扭曲之后就可以得到想要的驗證碼了:

# 圖形扭曲參數(shù)
params = [1 - float(random.randint(1, 2)) / 100,
      0,
      0,
      0,
      1 - float(random.randint(1, 10)) / 100,
      float(random.randint(1, 2)) / 500,
      0.001,
      float(random.randint(1, 2)) / 500]

# 創(chuàng)建扭曲
img_50_transformed = img_50_rotated.transform((50, 50), Image.PERSPECTIVE, params)

2.py源碼介紹

2.1 generate_folders_1to9.py

  因為我們要將指定的圖像分類放入指定文件夾,所以我們需要先在項目目錄下面新建9個文件夾:

?。ó?dāng)然你也可以自己新建,新建9個文件夾工作量還不大,但是如果要生成的驗證碼包含英文字母那就比較多了,大寫A-Z共24個+小寫a-z共24個+數(shù)字1-9共9個=57個子文件夾)

# 2018-01-9
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie/
# generate_folders_1to9.py
# 在目錄下生成用來存放數(shù)字1-9的9個文件夾,分別用1-9命名


import os

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

# 1-9
for i in range(49,58):
  if (os.path.isdir(path_folders + chr(i))):
    pass
  else:
    # print(i,": ",path_1+chr(i))
    # 生成目錄
    os.mkdir(path_folders+chr(i))

圖7 自動生成的用來存放指定圖像的文件夾

2.2 generate_pngs.py

  根據(jù)給定隨機(jī)次數(shù)samples, 生成samples個手寫體數(shù)字1-9,然后存放到本地文件夾1-9生成數(shù)據(jù)集;

  在49行可以修改生成圖像的大小,我這里取的是30*30像素;

# 2018-01-9
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie/
# generate_pngs.py
# 生成手寫體數(shù)字


import random
from PIL import Image, ImageDraw, ImageFilter, ImageFont

random.seed(3)

# 生成單張扭曲的數(shù)字圖像
def generate_single():

  # 先繪制一個50*50的空圖像
  img_50_blank = Image.new('RGB', (50, 50), (255, 255, 255))

  # 創(chuàng)建畫筆
  draw = ImageDraw.Draw(img_50_blank)

  # 生成隨機(jī)數(shù)1-9
  num = str(random.randint(1, 9))

  # 設(shè)置字體,這里選取字體大小25
  font = ImageFont.truetype('simsun.ttc', 20)

  # xy是左上角開始的位置坐標(biāo)
  draw.text(xy=(18, 11), font=font, text=num, fill=(0, 0, 0))

  # 隨機(jī)旋轉(zhuǎn)-10-10角度
  random_angle = random.randint(-10, 10)
  img_50_rotated = img_50_blank.rotate(random_angle)

  # 圖形扭曲參數(shù)
  params = [1 - float(random.randint(1, 2)) / 100,
       0,
       0,
       0,
       1 - float(random.randint(1, 10)) / 100,
       float(random.randint(1, 2)) / 500,
       0.001,
       float(random.randint(1, 2)) / 500]

  # 創(chuàng)建扭曲
  img_50_transformed = img_50_rotated.transform((50, 50), Image.PERSPECTIVE, params)

  # 生成新的30*30空白圖像,(在此處可以更改生成的圖像大?。?
  img_30 = img_50_transformed.crop([10, 10, 40, 40])

  return img_30, num

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


# 生成手寫體數(shù)字1-9存入指定文件夾1-9

# 用cnt_num[1]-cnt_num[9]來計數(shù)數(shù)字1-9生成的個數(shù),方便之后進(jìn)行命名
cnt_num = []
for i in range(10):
  cnt_num.append(0)

# 生成次數(shù)
samples = 200

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

  # 調(diào)用生成圖像文件函數(shù)
  img, generate_num = generate_single()

  # 取灰度
  imgray = img.convert('1')

  # 計數(shù)生成的數(shù)字1-9的個數(shù),用來命名圖像文件
  for j in range(1, 10):
    if(generate_num == str(j)):
      cnt_num[j] = cnt_num[j]+1

      # 路徑如 "F:/code/***/P_generate_handwritten_number/data_pngs/1/1_231.png"
      # 輸出顯示路徑
      print(path_pic + str(j) + "/" + str(j) + "_" + str(cnt_num[j]) + ".png")
      # 將圖像保存在指定文件夾中
      imgray.save(path_pic + str(j) + "/" + str(j) + "_" + str(cnt_num[j]) + ".png")

# 輸出顯示1-9的分布
print("\n", "生成的1-9的分布:")
for k in range(9):
  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的分布:
: 25 張
: 17 張
: 21 張
: 19 張
: 20 張
: 22 張
: 25 張
: 24 張
: 27 張

修改 generate_pngs.py中的samples, 你就可以生成指定大小的數(shù)據(jù)集;

2.3 generate_single_png.py

  更改27行的char=" "(可以是數(shù)字/字母/漢字),生成單張手寫體扭曲圖像:

# 2018-01-9
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie/
# generate_single_png.py
# 生成手寫體數(shù)字/字母/漢字


import random
from PIL import Image, ImageDraw, ImageFilter, ImageFont

random.seed(3)

# 生成單張扭曲的數(shù)字圖像
def generate_single():

  # 先繪制一個50*50的空圖像
  img_50_blank = Image.new('RGB', (50, 50), (255, 255, 255))

  # 創(chuàng)建畫筆
  draw = ImageDraw.Draw(img_50_blank)

  # 設(shè)置字體,這里選取字體大小25
  font = ImageFont.truetype('simsun.ttc', 20)

  # xy是左上角開始的位置坐標(biāo)
  # text是你想要顯示的內(nèi)容,數(shù)字/字母/漢字
  char ="呵"
  draw.text(xy=(12, 11), font=font, text=char, fill=(0, 0, 0))

  # 隨機(jī)旋轉(zhuǎn)-10-10角度
  random_angle = random.randint(-10, 10)
  img_50_rotated = img_50_blank.rotate(random_angle)

  # 圖形扭曲參數(shù)
  params = [1 - float(random.randint(1, 2)) / 100,
       0,
       0,
       0,
       1 - float(random.randint(1, 10)) / 100,
       float(random.randint(1, 2)) / 500,
       0.001,
       float(random.randint(1, 2)) / 500]

  # 創(chuàng)建扭曲
  img_50_transformed = img_50_rotated.transform((50, 50), Image.PERSPECTIVE, params)

  # 生成新的30*30空白圖像
  img_30 = img_50_transformed.crop([10, 10, 40, 40])

  return img_30, char

path_pic = "F:/code/python/P_generate_handwritten_number/"


# 調(diào)用生成圖像文件函數(shù)
img, generated_char = generate_single()
imgray = img.convert('1')

print(path_pic + "test.png")
# 將圖像保存在指定文件夾中
imgray.save(path_pic + "test.png")

2.4 del_pngs.py

  刪除指定目錄下子文件夾1-9中的所有圖片:

# 2018-01-9
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie/
# del_pngs.py
# 刪除路徑下生成的圖像文件

import os

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

#刪除路徑下的圖片
def del_pic():
  for i in range(1, 10):
   #  print(path_png+chr(i))
    namedir = os.listdir(path_pic+str(i))

    for tmppng in namedir:
      if( tmppng in namedir):
       # print(tmppng)
        os.remove(path_pic+str(i)+"/"+tmppng)

del_pic()

3.總結(jié)

  自己動手豐衣足食,有興趣可以自己做手寫體數(shù)字?jǐn)?shù)據(jù)集,字母和漢字的數(shù)據(jù)集稍加修改也可以做;

# GitHub: https://github.com/coneypo/Generate_handwritten_number

相關(guān)文章

  • 使用keras實現(xiàn)BiLSTM+CNN+CRF文字標(biāo)記NER

    使用keras實現(xiàn)BiLSTM+CNN+CRF文字標(biāo)記NER

    這篇文章主要介紹了使用keras實現(xiàn)BiLSTM+CNN+CRF文字標(biāo)記NER,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python使用re模塊實現(xiàn)正則表達(dá)式操作指南

    Python使用re模塊實現(xiàn)正則表達(dá)式操作指南

    在Python中需要通過正則表達(dá)式對字符串進(jìn)?匹配的時候,可以使??個python自帶的模塊,名字為re,下面這篇文章主要給大家介紹了關(guān)于Python使用re模塊實現(xiàn)正則表達(dá)式操作的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Python的條件語句與運算符優(yōu)先級詳解

    Python的條件語句與運算符優(yōu)先級詳解

    這篇文章主要介紹了Python的條件語句與運算符優(yōu)先級,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • python 調(diào)用有道api接口的方法

    python 調(diào)用有道api接口的方法

    今天小編就為大家分享一篇python 調(diào)用有道api接口的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 提升Python Web應(yīng)用性能的10個關(guān)鍵技巧

    提升Python Web應(yīng)用性能的10個關(guān)鍵技巧

    Python作為一種強(qiáng)大的編程語言,在Web開發(fā)領(lǐng)域也有著廣泛的應(yīng)用,通過結(jié)合Python的靈活性和一些高性能的框架和工具,我們可以構(gòu)建出高性能的Web應(yīng)用程序,本文將介紹一些關(guān)鍵的技術(shù)和方法,幫助你在Python環(huán)境下構(gòu)建高性能的Web應(yīng)用程序,需要的朋友可以參考下
    2024-07-07
  • keras的get_value運行越來越慢的解決方案

    keras的get_value運行越來越慢的解決方案

    這篇文章主要介紹了keras的get_value運行越來越慢的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python隨機(jī)函數(shù)庫random的使用方法詳解

    Python隨機(jī)函數(shù)庫random的使用方法詳解

    這篇文章主要介紹了Python隨機(jī)函數(shù)庫random的使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python+PyQt5實現(xiàn)開發(fā)Memcached客戶端

    Python+PyQt5實現(xiàn)開發(fā)Memcached客戶端

    這篇文章主要介紹了如何使用Python和PyQt5來制作一個Memcached客戶端,以便我們可以輕松地與Memcached服務(wù)器進(jìn)行交互,感興趣的小伙伴可以了解一下
    2023-06-06
  • Python爬蟲爬取博客實現(xiàn)可視化過程解析

    Python爬蟲爬取博客實現(xiàn)可視化過程解析

    這篇文章主要介紹了Python爬蟲爬取博客實現(xiàn)可視化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • python 公共方法匯總解析

    python 公共方法匯總解析

    這篇文章主要介紹了python 公共方法匯總解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09

最新評論

达日县| 噶尔县| 北川| 岳西县| 锡林郭勒盟| 田林县| 团风县| 漯河市| 岳池县| 武冈市| 县级市| 阿坝县| 环江| 沂源县| 金溪县| 青海省| 阜康市| 林芝县| 新余市| 垫江县| 洞头县| 始兴县| 买车| 阿勒泰市| 白银市| 尚义县| 陇南市| 丹阳市| 赫章县| 赞皇县| 安丘市| 彩票| 宣城市| 昌黎县| 吉安市| 青州市| 鹿泉市| 呼伦贝尔市| 牟定县| 星座| 英超|