簡體   English   中英

如何在 Python 中創建帶有英文字母(AZ、az、0-9)的圖像?

[英]How to create images with English alphabets (A-Z, a-z, 0-9) in Python?

我想准備一個用於識別英文字母數字字符的數據集。 我想訓練我的深度學習 model 來識別字符。 圖像大小應為 32 * 32 或 28 * 28。字符應隨圖像的高度和寬度縮放。 下面給出的是預期的 Output。

用圖像縮放的字符“A”

我試過 getsize() 但我無法用圖像大小縮放字符。

from PIL import Image, ImageDraw, ImageFont
import os,glob
import numpy as np
import random

parentPath=r"CaptchaDataset\\"


charactersList=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']
fontTypes=[]

for font in glob.glob("fonts\\*"): # Create Image for every font
    fontTypes.append(os.path.abspath(font))
    
for index,character in enumerate(charactersList):
    
    path=os.path.join(parentPath,character+"_"+str(index))
    os.mkdir(path)
    
    
    for imageCounter in range(len(fontTypes)):
        for repeats in range(3): #Number of Images
            img = Image.new('1', (28, 28), color = 'black')
            fnt = ImageFont.truetype(fontTypes[imageCounter], random.randint(30,50))
            w,h=fnt.getsize(character)
            d = ImageDraw.Draw(img)
            d.text(((28-w)/2-5,((28-h)/2)-5), character, font=fnt, fill=(255),align="center") #TO ALIGN CHARACTER IN CENTER
            img=np.pad(img,pad_width=10, mode='constant', constant_values=0) #Manually added padding
            img=Image.fromarray(img)
            img.save(path+"\\"+str(imageCounter)+"_"+str(repeats)+".jpg")

上述程序的意外 Output。 “g”被裁剪

解決方案很簡單:創建字體后創建圖像。

與其創建 28x28 像素的圖像,並繪制一個可能比圖像大的字符,不如創建字體,獲取大小,然后根據字體大小創建圖像。

  • 創建字體,並獲取字體的大小:

     fnt = ImageFont.truetype(fontTypes[imageCounter], random.randint(30, 50)) w, h = fnt.getsize(character)
  • 根據字體大小設置圖像大小並創建圖像:

     img_w, img_h = w + 20, h + 20 # Add 20 pixels padding (assume 10 pixels from each side). img = Image.new('L', (img_w, img_h), color='black') # Replace '1' with 'L' (8-bit pixels, black and white - we fill 255 so we can't use 1 bit per pixel)
  • 在圖像的中心繪制角色:

     d.text(((img_w-w)/2, (img_h-h)/2), character, font=fnt, fill=255, align="center") # TO ALIGN CHARACTER IN CENTER

這是一個完整的(更新的)代碼:

from PIL import Image, ImageDraw, ImageFont
import os,glob
import numpy as np
import random

parentPath = "CaptchaDataset\\"

charactersList=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']
fontTypes=[]

for font in glob.glob("fonts\\*"): # Create Image for every font
    fontTypes.append(os.path.abspath(font))
    
for index,character in enumerate(charactersList):    
    path = os.path.join(parentPath,character + "_" + str(index))

    if not os.path.exists(path):
        os.mkdir(path)
     
    for imageCounter in range(len(fontTypes)):
        for repeats in range(3): # Number of Images
            #img = Image.new('1', (28, 28), color = 'black')
            fnt = ImageFont.truetype(fontTypes[imageCounter], random.randint(30, 50))
            w, h = fnt.getsize(character)
            img_w, img_h = w + 20, h + 20  # Add 20 pixels padding (assume 10 pixels from each side).
            img = Image.new('L', (img_w, img_h), color='black')  # Replace '1' with 'L' (8-bit pixels, black and white - we fill 255 so we can't use 1 bit per pixel)
            d = ImageDraw.Draw(img)
            d.text(((img_w-w)/2, (img_h-h)/2), character, font=fnt, fill=255, align="center") # TO ALIGN CHARACTER IN CENTER
            #img = np.pad(img, pad_width=10, mode='constant', constant_values=0) #Manually added padding
            #img = Image.fromarray(img)
            img.save(path + "\\" + str(imageCounter) + "_" + str(repeats) + ".jpg")

少量樣本結果:
在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述

在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM