图像处理案例06 OCR应用

OCR应用

  • 1 OCR读取账单
    • 1.1 背景及思路
    • 1.2 代码

1 OCR读取账单

1.1 背景及思路

  1. 思路
    目标是读取图片中账单的信息。首先要截取图片上的账单,考虑到账单并非都是整齐摆放,为了保持算法的通用性,通过透视变换对扣取的账单摆正,然后调用工具识别账单上的信息。

  2. 步骤
    1) 读取图像,做二值化。
    2)开运算除噪声。
    3)找到图像的最大外部轮廓,根轮廓得到账单的最小外接矩形的坐标,根据坐标对账单做透视变换。
    4)识别账单上的信息。

在这里插入图片描述

1.2 代码

img_rgb = cv2.imread('OCR识别账单文字/note.jpg')
img_gray = cv2.imread('OCR识别账单文字/note.jpg', 0)
img = img_gray.copy()
_ ,benary = cv2.threshold(img_gray,0,240,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
plt.imshow(benary,"gray")
k=np.ones((10,10),np.uint8)
r1=cv2.morphologyEx(benary,cv2.MORPH_OPEN,k)  # 除掉了噪声
plt.imshow(r1,"gray")
ret, binary = cv2.threshold(r1,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# ret, binary = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 
        
rect = cv2.minAreaRect(contours[0])
points = cv2.boxPoints(rect)
points = points.astype(np.int32)
image=cv2.drawContours(img_rgb.copy(),[points],0,(255,255,255),2)

# 透视变换
pts = np.zeros((4, 2), np.float32)
res = np.sum(points, axis=1)
pts[0] = points[np.argmin(res)]
pts[2] = points[np.argmax(res)]
res = np.diff(points, axis=1)
pts[1] = points[np.argmin(res)]
pts[3] = points[np.argmax(res)]
pts = np.array(pts, np.float32)

#计算边长
w1 = np.sqrt((pts[0][0] - pts[1][0]) ** 2 + (pts[0][1] - pts[1][1]) ** 2)
w2 = np.sqrt((pts[2][0] - pts[3][0]) ** 2 + (pts[2][1] - pts[3][1]) ** 2)
w = int(max(w1, w2))

h1 = np.sqrt((pts[1][0] - pts[2][0]) ** 2 + (pts[1][1] - pts[2][1]) ** 2)
h2 = np.sqrt((pts[0][0] - pts[3][0]) ** 2 + (pts[0][1] - pts[3][1]) ** 2)
h = int(max(h1, h2))

#计算目标图像的尺寸
dst = np.array([
    [0, 0],
    [w - 1, 0],
    [w - 1, h - 1],
    [0, h - 1]
], np.float32)

#透视变换
mat = cv2.getPerspectiveTransform(pts, dst)
img = img_gray.copy()
img = cv2.warpPerspective(img, mat, (w, h))
plt.imshow(img,"gray")

# 二值化
img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
text = pytesseract.image_to_string(img)
print(text)
'''
Berghotel
    
 
Srosse Scheidegg
SBI Geindehald
Fate Rotter
Rech te A572 2.07. 2007/18:29:17
bar Tech Y/0t
Qieatta Macehial 4450 OF 9.00
‘ubloxt a 500 oF s.09
nGcheotnscettzel & 22.00 OF 2200
worsespstzt) 850 OF HEBD
 
Jorat: oF 54,56
Incl, 1.8% St $850.08: 3.85
Fntsprteht tn Euro $6.33. EUR
Es bedtente Sta: Ursuta
  
Tht Hee: 430-234 |
Tel. 088 853.67 16
Fax, : 088 858 87 19
Ennai ls srassesche angeBbiuevie.ch
'''

在这里插入图片描述
上图中左图为原图,右图为二值化后的图像,观察发现,二值化后的图像有噪声,影响寻找账单的轮廓。

对二值化后的图像做开运算可以消除图像上的噪声,方便寻找图像的轮廓,右图为
根据图像最外轮廓得到的账单,并对账单做透视变换的结果,根据右图可以做检测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/976133.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TVS管学习记录

文章目录 前言一、TVS是什么?二、TVS关键参数1.反向截至电压**实际意义** 2.钳位电压**定义与作用****选择依据** **4. 实际应用示例****场景:通信端口的ESD保护** 3.反向截至电压和钳位电压的关联和区别**. 小结** 三、实际应用电路举例总结 前言 TVS管…

java编译和c语言编译区别

java import和c include区别 AI回答 Java中的import关键字和C语言中的#include预处理指令在功能和用途上有显著的区别。以下是它们之间的一些主要差异: ‌作用机制‌: ‌Java import‌:import关键字用于从其他包或类中导入类型(如…

conda 基本命令

1、查询当前所有的环境 conda env list 2、创建虚拟环境 conda create -n 环境名 [pythonpython版本号] 其中[pythonpython版本号]可以不写 conda create -n test python3.12 我们输入conda env list看到我们的环境创建成功了,但是发现他是创建在我们默认的C盘的…

关于单调栈问题的本质的思考

单调栈问题的本质在于利用序列中的单调性,通过维护一个有序的栈结构,高效地排除不可能的解,从而快速确定每个元素的前后特定条件元素。其核心可总结为以下几点: 维护单调性,减少无效比较 通过保持栈内元素的单调递增或…

Unity汽车笔记

汽车的移动和转向 我们知道,汽车的前进后退是变速运动。按w,汽车开始加速,到最大速度后保持匀速,松开w,汽车受到阻力加速。如果按s减速,则以更大的加速度减速。后退反之。 按A/D时前轮偏转。只有前进后退…

RT-Thread+STM32L475VET6——USB鼠标模拟

文章目录 前言一、板载资源二、具体步骤1.配置icm20608传感器2.打开CubeMX进行USB配置3. 配置USB3.1 打开USB驱动3.2 声明USB3.3 剪切stm32xxxx_hal_msp.c中的void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd)和void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd)函数至board.c3.…

鸿蒙开发深入浅出04(首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影)

鸿蒙开发深入浅出04(首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影) 1、效果展示2、ets/pages/Home.ets3、ets/views/Home/SearchBar.ets4、ets/views/Home/NavList.ets5、ets/views/Home/TileList.ets6、ets/views/Home/PlanList.ets7、后端…

SOME/IP-SD -- 协议英文原文讲解2

前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.2 S…

Spring AI + Ollama 实现调用DeepSeek-R1模型API

一、前言 随着人工智能技术的飞速发展,大语言模型(LLM)在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型,凭借其强大的自然语言处理能力和丰富的知识储备,迅速成为业界关注的焦点。无论是文本生…

验证码介绍及生成与验证

验证码介绍及生成与验证 验证码 验证码(全自动区分计算机和人类的图灵测试,‌CAPTCHA ,C‌ompletely ‌A‌utomated ‌P‌ublic ‌T‌uring test to tell ‌C‌omputers and ‌H‌umans ‌A‌part)是一种用于区分用户是人类还是…

点击修改按钮图片显示有问题

问题可能出在表单数据的初始化上。在 ave-form.vue 中,我们需要处理一下从后端返回的图片数据,因为它们可能是 JSON 字符串格式。 vue:src/views/tools/fake-strategy/components/ave-form.vue// ... existing code ...Watch(value)watchValue(v: any) …

陀螺匠·企业助手v1.8 产品介绍

陀螺匠企业助手是一套采用Laravel 9框架结合Swoole高性能协程服务与Vue.js前端技术栈构建的新型智慧企业管理与运营系统。该系统深度融合了客户管理、项目管理、审批流程自动化以及低代码开发平台,旨在为企业提供一站式、数字化转型的全方位解决方案,助力…

C++ QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法

C QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法 记录一下 qmake .pro文件的配置 QT core gui printsupportgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compil…

【附源码】基于opencv+pyqt5搭建的人脸识别系统

文章目录 前言一、人脸检测二、人脸识别1.训练识别器2.识别人脸 三、界面相关1.Qlabel展示图片2.表格跟随内容而增加和减少3.选择图片文件4.警告框 四、源码获取总结 前言 人脸识别技术作为人工智能领域的一颗璀璨明珠,正逐渐渗透到我们生活的每一个角落&#xff0…

DeepSeek 提示词:高效的提示词设计

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(一)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(一) 第一部分:网络平台搭建与设备安全防护任务书DCRS:DCFW:DCWS:WAF: 第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&…

【Java】—— 二叉树

一、树型结构 树形结构是一种重要的数据结构,它类似于现实生活中的树的结构,由结点和边构成。树形结构具有以下特点: 树形结构是一种层次化的结构,由根结点、内部结点和叶子结点组成。根结点是树的顶部结点,没有父结点…

AWS - Redshift - 外部表读取 Parquet 文件中 timestamp 类型的数据

问题: 通过 Redshift Spectrum 功能可以读取 S3 中的文件,当读取 Parquet 文件时,如果列格式设置为 timestamp, 通过 psql 客户端读取会出现以下错误: testdb# select * from myspectrum_schema_0219.test_ns; ERROR…

即插即用Transformer、扩散模型、机器人规划、长文本检索增强生成 | Big Model Weekly 第57期...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 01 ProTransformer: Robustify Transformers via Plug-and-Play Paradigm 近年来,基于Transformer的架构在机器学习的各个领域占据了主导地位。本文介绍了一种新颖的鲁棒性注意力机制,旨…

[ComfyUI] 【AI】如何获得一张人物图片的优质描述

在使用ComfyUI时,获取一张人物图片的优质英文描述非常重要,尤其是在涉及图像生成、自动化标签和多模态AI任务时。以下是一个简单的流程,可以帮助你快速从一张人物图片中提取出精确且高质量的英文描述。 1. 打开 Hugging Face 网站 首先,您需要访问 Hugging Face 提供的 J…