python制作印刷体数据集:数字符号数据集(字符串转图片)

做OCR项目,需要有很多印刷体的数据集,靠人工手动截图标注显然不现实,于是“人生苦短,我用python”

思路:数据集分两类,一类是长浮点数,模拟财务报表中的上亿元金额:
比如799,889,565.24
实验证明,识别模型经常把最后的小数点识别成,
还有一类就是随机的各种数字以及符号混合

生成完之后用pycharm的库将文本转为图片,把标签信息按格式写入label.txt中。

为了模拟扫描件效果,用opencv再打开,作图片(微小的)旋转,再保存。

最后的图片锐化处理模拟扫描(这个另讲)和数据集处理。
上代码:

#先导入所需的包
import pygame
import os
import string
import random
import shutil  
import cv2
import numpy as np

pygame.init()  #  初始化

def generate_random_str(geshu):#生成不规则字符串
    stringlist=list()
    for i in range(geshu):
        random_str = ''
        base_str = '-().%0123456789'
        length = len(base_str) - 1
        for i in range(random.randint(3,10)):
            random_str += base_str[random.randint(0, length)]
        # print(random_str)
        stringlist.append(random_str)
    return stringlist;
def get_correct(geshu):#生成随机两位浮点数
    stringlist=list()
    for i in range(geshu):
        j=random.randint(1,9)
        maxnum=pow(10,j)
        num=round(random.uniform(-maxnum, maxnum),2)
        # print("{:,}".format(num))
        stringlist.append("{:,}".format(num))
    return stringlist;


def rotate_bound(image, angle):
    #获取宽高
    (h, w) = image.shape[:2]
    (cX, cY) = (w // 2, h // 2)
  
    # 提取旋转矩阵 sin cos 
    M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])
  
    # 计算图像的新边界尺寸
    nW = int((h * sin) + (w * cos))
#     nH = int((h * cos) + (w * sin))
    nH = h
  
    # 调整旋转矩阵
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY
  
    return cv2.warpAffine(image, M, (nW, nH),flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

try:
	shutil.rmtree('image')#强制删除
except:
	pass
try:
	os.mkdir("image") #创建目录
except:
	pass
try:
	os.remove("label.txt")
except:
	pass
randomcount=eval(input("请输入生成的随机浮点数字符串数量:"))
numbercount=eval(input("请输入生成的随机符号字符串数量:"))
rotatedmaxangel=eval(input("请输入最大随机旋转角度:"))
randomstringlist = get_correct(randomcount)#在括号里输入生成数量
numberstringlist = generate_random_str(numbercount)#在括号里输入生成数量

list = numberstringlist+randomstringlist#列表合并
listcount=randomcount+numbercount
#设置字体大小及路径
font = pygame.font.Font(os.path.join("C:\\Windows\\Fonts\\STKAITI.TTF"), 26)

with open('label.txt','a') as file_handle:   # .txt可以不自己新建,代码会自动新建  
	for i in range(listcount):
		text = u"{0}".format(list[i])           #  引号内引用变量使用字符串格式化
		#设置位置及颜色
		rtext = font.render(text, True, (0, 0, 0), (255 ,255 ,255))
		#保存图片及路径
		path=".\\image\\"+str(i)+".png"
		pygame.image.save(rtext, path)
		image = cv2.imread(path)#再次读取
		rotated = rotate_bound(image, random.randint(-rotatedmaxangel,rotatedmaxangel))#转转转
		cv2.imwrite(path, rotated)#保存旋转的图片
		file_handle.write("image/"+str(i)+".png"+"\t"+list[i]+"\n")#写入标签文件

print("完成,请查看目录下内容")

其中图片旋转的代码是copy别人的,忘了是在哪个网站了……

在这里插入图片描述
这是生成的图片,想生成多少张就生成多少张,比人工标注高到不知道哪里去了。

在这里插入图片描述
这是对应的标签txt

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值