[英]How to create images with English alphabets (A-Z, a-z, 0-9) in Python?
我想准備一個用於識別英文字母數字字符的數據集。 我想訓練我的深度學習 model 來識別字符。 圖像大小應為 32 * 32 或 28 * 28。字符應隨圖像的高度和寬度縮放。 下面給出的是預期的 Output。
我試過 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")
解決方案很簡單:創建字體后創建圖像。
與其創建 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.