当前位置: 首页 > news >正文

【OCR】合同上批量贴印章

一、需求

        OCR算法在处理合同等文件时,会由于印章等遮挡导致文本误识别。因此在OCR预处理时,有一个很重要的步骤是“去除印章”。其中本文主要聚焦在“去除印章”任务中的数据构建步骤:“合同+伪印章”的数据构建。下面直接放几张批量合成后效果。

二、原理实现      

        合成合同印章的步骤有三个“随机”需要控制。1.印章样式需要“随机”;2.印章“随机”角度、位置贴在合同上的;3.合同版面色泽需要“随机”。

2.1 随机印章样式

        我采用的是第三方接口,这里借鉴了这位大佬方法二的思路:【Python】实现公章自动化生成以及自动盖章效果-CSDN博客,实现批量生成。主要的调用思路是,通过调用第三方印章生成网址跑批生成。

def func_get_stamp_png(name,use,seal_type):# 定义API的地址out_put_name =  os.path.join(seal_output_path,name+".png")url = "http://www.yinzhang8.com.cn/seal/index.php?name={}&str={}&type={}".format(str(name),str(use),str(seal_type))# 发送HTTP请求response = requests.get(url)assert response.status_code == 200assert 1<=types<=4# 将返回的二进制数据保存为本地文件with open(out_put_name, "wb") as f:f.write(response.content)

然而第三方网址需要公司名,这里我采用的是faker库,随机生成公司名然后去调用跑批。代码如下。这里公司长度一般在[8,11]字长范围较合适

    #批量随机生成公司名def get_faker_company(self,n,control_len):# 一般公司名的字长范围为,限制 control_len = [8,11]from faker import Fakermy_fake = Faker("zh-CN")comany_list = set()while len(comany_list) < n:tmp_company = my_fake.company()if control_len[0]<=len(tmp_company)<=control_len[1]:comany_list.add(tmp_company)return list(comany_list)

 2.2 随机印章位置角度

        在贴上合同的时候,需要用PIL的paste函数中的position来实现控制位置,随机角度需要采用PIL.Image库首先将印章完成旋转,然后再贴上去。部分代码如下。

 # 随机选择一个倾斜角度
angle = random.randint(-15, 15)
watermark = watermark.rotate(angle)
# 计算印章可以放置的位置范围
x_range = [int(doc_width * 0.2),int(doc_width * 0.8)]
y_range = [int(doc_height * 0.5),int(doc_height * 0.9)]
# 随机选择一个位置
x_position = random.randint(x_range[0], x_range[1])
y_position = random.randint(y_range[0], y_range[1])
watermark = watermark.resize((int(doc_width*0.1),int(doc_height*0.1)))
# 将水印添加到基本图像
base_image.paste(watermark, (x_position,y_position), watermark)

2.3 随机合同样式

        这部分考虑到,由于是做图像复原任务,所以在torch里做比较好,对image和label做同一个转换,就能保持图像前后的一致性。

三、秀效果

        随便贴张图,展现效果。全部源码传送门:coming soon。

http://www.lryc.cn/news/190616.html

相关文章:

  • Stable diffusion 用DeOldify给黑白照片、视频上色
  • 在服务器上解压.7z文件
  • 【opencv】windows10下opencv4.8.0-cuda C++版本源码编译教程
  • 软碟通制作启动盘
  • Tomcat和HPPT协议
  • Acwing.4736步行者(模拟)
  • 前端预览、下载二进制文件流(png、pdf)
  • 搞定ESD(三):ESD干扰耦合路径深入分析(一)
  • 广州华锐互动:炼钢工厂VR仿真实训系统
  • 适用于音视频的弱网测试整理
  • 【Spring MVC研究】DispatcherServlet如何处理请求(doDispatcher方法)
  • 解决github加载过慢问题
  • 利用python批量处理nc数据
  • popen() 获取 ping 命令结果解析
  • 【pytorch】深度学习准备:基本配置
  • etcd随笔
  • 0基础学习VR全景平台篇 第107篇:全景图调色和细节处理(上,地拍)
  • Verilog功能模块——同步FIFO
  • Unity ToLua热更框架使用教程(1)
  • 车载相关名词--车载数据中心方案
  • helm使用
  • Python in Visual Studio Code 2023年10月发布
  • Webmin远程命令执行漏洞复现报告
  • webstorm自定义文件模板(Vue + Scss)
  • 楔子-写在之前
  • 第 5 章 数组和广义表(稀疏矩阵的三元组顺序表存储实现)
  • 【RabbitMQ 实战】11 队列的结构和惰性队列
  • Python3-批量重命名指定目录中的一组文件,更改其扩展名
  • 渗透测试KAILI系统的安装环境(第八课)
  • 如何正确方便的理解双指针?力扣102 (二叉树的层序遍历)