OCR字符自动生成工具

可以将各种字体的字符生成图片,用于训练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()

结果就是各种字体的图片

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值