ocr数据不够,怎么造数据

2024-06-20 11:52
文章标签 数据 怎么 ocr 不够

本文主要是介绍ocr数据不够,怎么造数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.确定特定字体类型;

2.收集合适的图片作为背景

3.在背景图上填写特定字体的字符内容

1)字体无法确认时怎么办?

方法一:可以将文本行裁剪出来去网站上确认,网站链接:字体识别-在线扫一扫图片找字体-搜字体!

方法二:将文字输入到文档文件中,更换不同的字体,看是否与字体目标匹配;

字体可以去网上下载,也可以在本机查找;本机的字体所在位置:

个人用户字体文件:~/.local/share/fonts
系统字体文件:/usr/share/fonts
字体配置文件:/etc/fonts/

下面是我处理的代码,仅供参考:

def check_dir1(path):if not os.path.exists(path):os.mkdir(path)else:files = os.listdir(path)for file in files:file_path = os.path.join(path, file)os.remove(file_path)
'''
制作一些文本行数据
'''
from PIL import ImageFont, ImageDraw
import PIL.Image as PImage
import random
import os
import numpy as np
import cv2
from rec.temporary_boundary.line_process import cut_line3_1
from result_process.preprocess import check_dir1if __name__=='__main__':cha_list = ['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']save_dir = '/home/fuxueping/4tdisk/data/certificate_reader/北京现场测试数据/20240614针对识别问题/SAU_name'check_dir1(save_dir)txt_parh = '/home/fuxueping/4tdisk/data/certificate_reader/北京现场测试数据/20240614针对识别问题/SAU_name.txt'bg_img_dir = '/home/fuxueping/4tdisk/data/certificate_reader/北京现场测试数据/20240614针对识别问题/bg'bg_imgs = os.listdir(bg_img_dir)f_save = open(txt_parh, 'w', encoding='utf-8')check_dir1(save_dir)num = 50while num:all_num = 0bg_img = random.choice(bg_imgs)num1=random.choice([2, 3])chr_str = ''all_num += num1while num1:chr_ = random.choice(cha_list)chr_str += chr_num1 -=1char_med = ''for i in range(3):num2=random.choice([5,6,7,8])chr_str2=''all_num += num2while num2:chr_ = random.choice(cha_list)chr_str2 += chr_num2 -= 1if i == 0:char_med += chr_str2+', 'elif i == 1:char_med += chr_str2 + ' 'elif i == 2:char_med += chr_str2 + ' 'chr_1 = random.choice(cha_list)result_str = chr_str+' '+char_med+chr_1all_num += 1im = PImage.open(os.path.join(bg_img_dir, bg_img))w, h = im.sizefont_size = 24w_len = int(0 + all_num * (font_size-3) + 4)if w_len > w:num -= 1continuename_font = ImageFont.truetype('/home/fuxueping/4tdisk/data/certificate_reader/北京现场测试数据/20240614针对识别问题/fonts/n019003l.pfb', font_size)draw = ImageDraw.Draw(im)y_len = random.randint(0, h-font_size-5)color = tuple([random.randint(0, 20) for _ in range(3)])draw.text((2, y_len), result_str, fill=color, font=name_font)box = (0, y_len, w_len, y_len+font_size+5)rect_img = im.crop(box)image_array = np.array(rect_img)cv2_image = cv2.cvtColor(image_array, cv2.COLOR_RGB2BGR)result, _ = cut_line3_1(cv2_image)if len(result):region_rec = cv2_image[result[1]:result[3], result[0]:min(w, result[2]+2)]  # 裁剪出待识别的区域image_array = cv2.cvtColor(region_rec, cv2.COLOR_BGR2RGB)rect_img = PImage.fromarray(image_array)# image_array = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2RGB)# rect_img = PImage.fromarray(image_array)save_path = os.path.join(save_dir, str(num)+'_'+result_str+'.jpg')line = save_path+'\t'+result_str+'\n'f_save.write(line)rect_img.save(save_path)num -= 1f_save.close()
# 根据设定的阈值和图片直方图,找出波峰,用于分隔字符
def find_waves_row(threshold, histogram):#行数是59# up_point = -1  # 上升点# is_peak = False# if histogram[0] >= threshold:up_point = 0 #起始位置is_peak = Truewave_peaks = []top_cut = []for i, x in enumerate(histogram): #x是对应的像素和,i是行if is_peak and x >= threshold:if i - up_point >=2 :# top_cut.append((up_point, i)) #加这一行,相当于裁减掉多于的空行up_point = i-1else:up_point = iis_peak = Falseelif not is_peak and x < threshold:#随后找到字符消失的位置is_peak = Trueif 1 < i < histogram.shape[0]-1:#行数不是在开头也不在结尾wave_peaks.append((up_point, i+1))else:wave_peaks.append((up_point, i))up_point = i# if is_peak and up_point != -1 and i - up_point > 4:#     wave_peaks.append((up_point, i))if not is_peak and x >= threshold:#虽然数据已经结束,但是没有出现小于阈值的情况wave_peaks.append((up_point, i))return wave_peaksdef cut_line3_1(rgb_img, kernel_size = 3, y_len = 5, row_threshold=255 * 1, col_thresh = 255*1):'''切割出每一行,只保留高度满足条件的一行内容,然后切除掉每一行的前端后尾端的空白'''rgb_img = method_9(rgb_img) #高斯滤波# 使用sauvola进行二值化h, w = rgb_img.shape[:2]sau_bin = sauvola_bin(rgb_img) #sauvola二值化# cv2.imwrite('./../temp/sauvola_bin.jpg', sau_bin)# sau_bin = get_charcter_region(rgb_img)  # 局部区域算阈值二值化# cv2.imwrite('./../temp/sau_bin1.jpg', sau_bin)sau_bin_inv = 255 - sau_bin# cv2.imwrite('./../temp/sau_bin_inv1.jpg', sau_bin_inv)if kernel_size != 0:sau_bin_inv = cv2.medianBlur(sau_bin_inv, kernel_size)# cv2.imwrite('./../temp/sau_bin_inv_dinose1.jpg', sau_bin_inv)col_histogram = np.sum(sau_bin_inv, axis=1)wave_peaks = find_waves_row(col_thresh, col_histogram)result = []#找出高度最大的区域,只保留一行内容max_y = 0result_y = []if not len(wave_peaks):return [], sau_bin_invfor i, wave_peak in enumerate(wave_peaks):y1 = wave_peak[0]y2 = wave_peak[1]if y2 - y1 < y_len: #20之前是这个阈值 ,将高度不满足>=5的字符区域去掉continueif max_y < y2 - y1:max_y = y2 - y1result_y = [y1, y2]if len(result_y): #有时候裁剪的图片可能是没有字符,这种情况多出现在证件类别错误的情况y1 = result_y[0]y2 = result_y[1]else:return [], sau_bin_invline_img = sau_bin_inv[y1:y2, :]# line_img_bgr = rgb_img[wave_peak[0]:wave_peak[1], :]# save_other = os.path.join(save_path, file + '_'+str(i)+'.jpg')# cv2.imwrite(save_other, line_img)row_histogram = np.sum(line_img, axis=0)  # 数组的每一列求和# row_max = np.max(row_histogram)# row_threshold = row_max - 255*1wave_peaks_line = find_waves_col(row_threshold, row_histogram)# cv2.imwrite('./../temp/line_img.jpg', line_img)x1 = 0x2 = wresult_ = []for wave_ in wave_peaks_line:len_x = wave_[1] - wave_[0]if len_x > 5:result_.append(wave_)if len(result_):  # 有时候朝水平投影内容消失了,就用【0,w】代替x1 = result_[0][0]x2 = result_[-1][1]return [x1, y1, x2, y2], sau_bin_inv

这篇关于ocr数据不够,怎么造数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1078055

相关文章

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L