可以将各种字体的字符生成图片,用于训练OCR
这里的各种字体来自于window自带的字体库
这是生成字符的函数,以及对字符有效性的判断,有的字体里不存在某些字符,会显示黑色或者矩形框。
from PIL import Image, ImageDraw, ImageFont
import matplotlib.font_manager as fm
import os
import numpy as np
import cv2
def create_text_image(text, font_path, img_size=(100,100), text_color="black", bg_color="white"):
try:
font = ImageFont.truetype(font_path, int(img_size[0] * 0.8)) # 80%的图片高度
except:
return None # 字体加载失败时返回None
image = Image.new("RGB", img_size, bg_color)
draw = ImageDraw.Draw(image)
# 使用ImageFont对象来计算文本尺寸
text_width, text_height = draw.textsize(text, font=font)
text_x = (img_size[0] - text_width) / 2
text_y = (img_size[1] - text_height) / 2
draw.text((text_x, text_y), text, font=font, fill=text_color)
open_cv_image = np.array(image)
# 转换颜色通道从RGB到BGR
open_cv_image = cv2.cvtColor(open_cv_image, cv2.COLOR_RGB2BGR)
return open_cv_image
def CheckRect(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化处理
vmax=np.max(gray)
if vmax<100:
return False
_, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
# 近似轮廓
approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True)
# 如果近似轮廓有4个点,我们可以认为它是一个矩形
if len(approx) == 4:
return False
return True
这是生成数据集的程序
def CreateDataSet():
dir_dataset="FrontData"
import string
# 创建一个列表,包含数字0-9
digits = [str(num) for num in range(10)]
# 获取所有小写字母
lowercase_letters = list(string.ascii_lowercase)
# 获取所有大写字母
uppercase_letters = list(string.ascii_uppercase)
# 合并所有列表
character_list = digits + lowercase_letters + uppercase_letters
# 获取系统字体列表
fonts_list = fm.findSystemFonts(fontpaths=None, fontext='ttf')
# 指定需要生成图片的汉字
#chinese_chars = ["汉", "字"] # 这里可以替换为您想要的汉字
# 为每个汉字的每种字体生成图片
for ic,char in enumerate(character_list):
dir_char=os.path.join(dir_dataset,str(ic))
if os.path.exists(dir_char)==False:
os.makedirs(dir_char)
for ifc,font_path in enumerate(fonts_list):#fonts_list也可以替换成chinese_chars,用于绘制中文字符
img = create_text_image(char, font_path)
if img is not None:
#cv2.imshow("char",255-img)
#cv2.waitKey(1)
img=255-img
if CheckRect(img):
fn="%03d.png"%(ifc)
fn_full=os.path.join(dir_char,fn)
cv2.imwrite(fn_full,img)
然后调用这个程序就可以了。
if __name__=="__main__":
CreateDataSet()
结果就是各种字体的图片