图像处理——以支票识别为例

news2024/11/15 12:56:35

  用到环境
1、pycharm community edition 2022.3.2
2、Python 3.10
后续应该会在资源上传项目,需要的话可以私信我。

流程

在这里插入图片描述

图1 扩展实验“金额识别”流程图

正文

  1. 导入 cv2、pytesseract、re 和 locale 模块。

  2. 使用 cv2.imread() 函数加载名为 cheque.jpg 的支票图像,然后使用 cv2.cvtColor() 函数将其转换为灰度图像并显示在窗口中。程序会等待用户按下键盘后继续执行。

  3. 根据实验一图像增强所学,使用 cv2.equalizeHist() 函数对灰度图像进行直方图均衡化,以提高对比度,增强金额提取效果,并将结果显示在窗口中。程序会等待用户按下键盘后继续执行。

  4. 设置 Tesseract 可执行文件的路径,以便后面使用 OCR 引擎识别文本。
      OCR (Optical Character Recognition) 的调用通常会使用卷积神经网络(Convolutional Neural Network, CNN)提取输入图像中的字符或文字特征。CNN 模型由多层卷积层、池化层以及全连接层OCR 的调用中有一种常见的技术叫做金字塔模型(Pyramid Model),它可以提高 OCR 的识别率。
      OCR技术也运用了金字塔模型。在 OCR 中,金字塔模型通常被用来处理输入图像的不同尺度,以便在不同尺度下检测和识别字符或文字。这是因为在实际应用中,输入图像的大小和分辨率可能会有很大差异,而字符或文字的大小也会有很大变化。如果只在单一尺度下进行 OCR,那么就很难同时兼顾识别准确率和效率。使用金字塔模型可以将输入图像缩小到多个尺度,然后在每个尺度上进行 OCR 处理,最后将结果合并起来得到最终的识别结果。组成,其中卷积层用于提取特征,池化层则用于减小特征图的尺寸和数量。

  5. 使用 pytesseract.image_to_string() 函数调用 OCR 引擎(Tesseract)来识别灰度图像中的文本,并将结果存储在变量 text 中。

  6. 正则化金额匹配:

  • 定义数字词典 numbers 和单位词典 units,用于后面将金额实体中的单词转换成相应的数字。
  • 使用正则表达式 re.search() 在变量 text 中寻找第一个匹配“单词”的字符串,并将其转换为小写并赋值给 amount_text 变量;如果没有找到,则输出 “No amount found.”。
  • 使用 for 循环,将 amount_text 中出现的数字单词替换为相应的阿拉伯数字,并将单位单词替换为相应的因子。替换使用了 re.sub() 函数和正则表达式。
  • 使用 re.search() 函数再次查找 amount_text 中的数字部分,并将其转换为浮点数类型。如果没有找到,则输出 “No amount found.”。
  • 使用 while 循环,查找 amount_text 中的单位单词,并将其转换为因子。每次循环将当前数字与单位相乘,并将相应的单位单词从 amount_text 中删除,直至没有单位单词了。
  • 使用 locale.currency() 函数将 amount_number 转换为格式化的货币字符串。在这个函数中,grouping=True 表示启用千位分隔符,symbol=‘CNY’ 则表示指定货币符号为 CNY。
  • 输出格式化后的货币字符串。

结果展示

在这里插入图片描述

图2 原图

在这里插入图片描述

图3 直方图均衡化后

分析:直方图均衡化后可以很好的增强图像,使得被提取金额更突出,利于后续OCR提取和金额提取。
在这里插入图片描述

图四 金额提取结果

分析:可以发现实验例图识别结果还不错,其原因主要基于三点,一是直接用OCR检测到右标的准确的数字,但是有时这个数字不明显,这时就可以利用中文大写,如图中“壹仟万元整”,或者利用字幕“一千万元”进行金额提取。基于此在算法设计时充分考虑上述三种情况,进行中文与阿拉伯数字的转换,单位如“千万”与阿拉伯数字的转换,取得了不错的效果。
在这里插入图片描述
在这里插入图片描述

图五 其他图片识别结果

分析:发现识别结果很好。

代码:

import cv2
import pytesseract
import re
import locale

# 加载支票图像并将其转换为灰度图像
image = cv2.imread('cheque.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('origin Image', gray)
# 等待用户按下键盘
cv2.waitKey(0)

#
# # 直方图均衡化  提高对比度
# gray = cv2.equalizeHist(gray)
# cv2.imshow('hist Image', gray)
# # 等待用户按下键盘
# cv2.waitKey(0)


# 设置Tesseract可执行文件的路径
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"


# 使用OCR引擎(例如Tesseract)来识别文本
text = pytesseract.image_to_string(gray, lang='eng', config='--psm 6')
print(text)

# 金额匹配

# 设置货币格式
locale.setlocale(locale.LC_ALL, '')

# 数字词典
numbers = {
    'zero': 0,
    'one': 1,
    'two': 2,
    'three': 3,
    'four': 4,
    'five': 5,
    'six': 6,
    'seven': 7,
    'eight': 8,
    'nine': 9,
    'ten': 10,
    'eleven': 11,
    'twelve': 12,
    'thirteen': 13,
    'fourteen': 14,
    'fifteen': 15,
    'sixteen': 16,
    'seventeen': 17,
    'eighteen': 18,
    'nineteen': 19,
    'twenty': 20,
    'thirty': 30,
    'forty': 40,
    'fifty': 50,
    'sixty': 60,
    'seventy': 70,
    'eighty': 80,
    'ninety': 90
}

# 单位词典
units = {
    'hundred': 100,
    'thousand': 1000,
    'million': 1000000,
    'billion': 1000000000
}

# 匹配金额实体
match = re.search(r'\b(\w+\s*)+\b', text)
if match:
    amount_text = match.group().lower()

    # 替换数字单词为阿拉伯数字
    for word, digit in numbers.items():
        amount_text = amount_text.replace(word, str(digit))

    # 替换单位单词为相应的数字
    for unit, factor in units.items():
        pattern1 = r'(?<!\d)one\s+{}\b'.format(unit)
        repl1 = lambda m: str(factor)
        amount_text = re.sub(pattern1, repl1, amount_text)

        pattern2 = r'\b(\d+)\s*{}\b'.format(unit)
        repl2 = lambda m: str(int(m.group(1)) * factor)
        amount_text = re.sub(pattern2, repl2, amount_text)

    # 提取金额数字部分
    match_number = re.search(r'\b\d+(?:\.\d+)?\b', amount_text)
    if match_number:
        amount_number = float(match_number.group())

        # 将数字与单位相乘
        match_unit = re.search(r'(hundred|thousand|million|billion)', amount_text)
        while match_unit:
            factor = units[match_unit.group()]
            amount_number *= factor
            amount_text = re.sub(match_unit.group(), '', amount_text)
            match_unit = re.search(r'(hundred|thousand|million|billion)', amount_text)

        # 输出格式化货币字符串
        formatted_amount = locale.currency(amount_number, grouping=True, symbol='CNY')
        print('Amount:', formatted_amount)
    else:
        print('No amount found.')
else:
    print('No amount found.')

编写不易,求个点赞!!!!!!!
“你是谁?”

“一个看帖子的人。”

“看帖子不点赞啊?”

“你点赞吗?”

“当然点了。”

“我也会点。”

“谁会把经验写在帖子里。”

“写在帖子里的那能叫经验贴?”

“上流!”
cheer!!!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS:结构

目录 前言一、设计者二、维护者三、系统架构四、ROS自身结构 前言 从不同的角度&#xff0c;对ROS架构的描述也是不同的&#xff0c;一般我们可以从设计者、维护者、系统结构与自身结构4个角度来描述ROS结构: 一、设计者 ROS设计者将ROS描述为“ROS Plumbing Tools Capab…

数仓工具Hive 概述

Hive Hive简介Hive架构HiveSQL语法不同之处建表语句查询语句 Hive查看执行计划Hive文件格式 Hive简介 Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 通过Hive可以将mapred…

数字IC前端学习笔记:仲裁轮询(三)

相关文章 数字IC前端学习笔记&#xff1a;LSFR&#xff08;线性反馈移位寄存器&#xff09; 数字IC前端学习笔记&#xff1a;跨时钟域信号同步 数字IC前端学习笔记&#xff1a;信号同步和边沿检测 数字IC前端学习笔记&#xff1a;锁存器Latch的综合 数字IC前端学习笔记&am…

mitmproxy抓包原理

文章目录 mitmproxy原理详解1 mitmproxy 基本原理2 作为中间代理获取HTTP请求信息2.1 应对显式HTTP请求2.2 应对隐式HTTP请求 3 作为中间代理获取HTTPS请求信息3.1 显式HTTPS请求1) 获取远程主机名2) 处理主题备用名称SAN3) 处理服务器名称指示SNI4) 显式HTTPS请求信息获取整个…

基于深度学习的高精度烟雾检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度烟雾检测识别系统可用于日常生活中或野外来检测与定位烟雾目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的烟雾目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

为什么数据库字段建议设置为NOT NULL?

目录 一、性能 二、开发的友好性 三、聚合函数不准确 四、null与其它值计算 五、distinct、group by、order by的问题 六、索引问题 七、其它问题 一、性能 如果查询中包含可为null的列&#xff0c;对MYSQL来说更难优化&#xff0c;因为可为null的列使得索引、索引统计…

NUCLEO-F411RE RT-Thread 体验 (9) - GCC环境 PWM的驱动移植以及简单使用

NUCLEO-F411RE RT-Thread 体验 (9) - GCC环境 PWM的驱动移植以及简单使用 驱动移植 驱动位于drv_pwm.c文件中&#xff0c;components层代码位于rt_drv_pwm.c中。 修改Makefile文件 修改配置文件rtconfig.h LED2链接PA5&#xff0c;而TIM2_CHANNEL1可从PA5输出PWM&#xff0…

ubuntu命令

查看当前用户 whoami 进入root权限 sudo su 修改用户名密码 sudo passwd username #修改用户密码 //username是用户设置用户名&#xff0c;记得替换 sudo passwd root #修改root密码 https://blog.csdn.net/m0_54647521/article/details/127521032 重启…

图形编辑器开发:以光标位置缩放画布

大家好&#xff0c;我是前端西瓜哥。 画布缩放是图形设计工具中很重要的基础能力。 通过它&#xff0c;我们可以像举着一台摄影机&#xff0c;在图形所在的世界到处游逛&#xff0c;透过镜头&#xff0c;可以只看自己想看的图形&#xff1b;可以拉近摄影机&#xff0c;看到图…

SpringBoot 如何使用 @ControllerAdvice 注解进行全局异常处理

SpringBoot 如何使用 ControllerAdvice 注解进行全局异常处理 在 Web 开发中&#xff0c;异常处理是非常重要的一环。在 SpringBoot 框架中&#xff0c;我们通常使用 ExceptionHandler 注解来处理 Controller 层的异常。但是&#xff0c;如果想要处理全局异常&#xff0c;我们…

【MySql】MySql事务常见操作

文章目录 准备工作事务常见操作方式总结 准备工作 将mysql的默认隔离级别设置成读未提交 set global transaction isolation level read uncommitted;注意&#xff1a;设置完毕之后&#xff0c;需要重启终端&#xff0c;进行查看 select tx_isolation 创建测试表 mysql>…

HTML5 的新特性

html基础知识html基础知识_上半场结束&#xff0c;中场已休息&#xff0c;下半场ing的博客-CSDN博客html5的新特性HTML5 的新特性_上半场结束&#xff0c;中场已休息&#xff0c;下半场ing的博客-CSDN博客 目录 1.0 HTML5 的新特性 1.1 HTML5 新增的语义化标签 1.2 HTML5 新增的…

LabVIEW何得知是谁在连接远程前面板

LabVIEW何得知是谁在连接远程前面板 想要知道连接远程前面板的用户的身份。如何来得知用户的身份和他们连接远程前面板的时间&#xff1f; 解答: 可以使用Remote Panel: Connections To Clients属性或者Remote Panel Client Connections方法来得知连接远程面板用户的身份。Re…

TypeScript ~ TS 掌握编译文件配置项 ⑤

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

【2023,学点儿新Java-20】流程控制语句关键字及其介绍:while、do、break、continue、return

前情回顾&#xff1a; 【2023&#xff0c;学点儿新Java-19】Java特殊空类型关键字 | Java流程控制语句关键字 | switch-case 选择结构的执行过程&注意点 | 详解&#xff1a;for循环的普通和增强版本【2023&#xff0c;学点儿新Java-18】Java关键字汇总说明 |附&#xff1a…

chatgpt赋能python:Python新手常见的报错提示及解决方法

Python新手常见的报错提示及解决方法 Python是一种非常流行的编程语言。对于新手来说&#xff0c;Python在学习过程中可能会遇到许多报错提示&#xff0c;这些提示可能会让人感到很困惑。本文将介绍Python新手常见的报错提示&#xff0c;并提供解决方法。 IndentationError: …

ninja的简单使用

文章目录 Ninja安装windows环境Linux环境 入门使用与CMake一起使用 Ninja安装 windows环境 问题的解决通常有多种方法。按照结果的好坏程度&#xff0c;可以将解决方法简单的划分为&#xff0c;上中下三个层次&#xff0c;见:为什么谋士总喜欢提上中下三策&#xff1f; 在w…

SpringBoot 如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理

SpringBoot 如何使用 RestControllerAdvice 注解进行 RESTful 异常处理 在 SpringBoot 应用程序中&#xff0c;RESTful 异常处理是一个非常重要的话题。当 RESTful API 出现异常时&#xff0c;我们需要对异常进行处理&#xff0c;以保证 API 的稳定性和可靠性。SpringBoot 提供…

【SpringBoot】SpringBoot的发展沿革,相关介绍,特点,重要策略以及安装步骤讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

Java·Map和Set

文章目录 &#x1f3ef;1. 搜索&#x1f3ef;1.1 概念及场景1.2 模型 &#x1f3f0;2. Map 的使用&#x1f3f0;2.1 关于Map的说明2.2 关于Map.Entry的说明2.3 Map 的常用方法说明2.4 TreeMap的使用案例2.5HashMap源码分析 ⛺️3. Set 的说明⛺️3.1 常见方法说明 &#x1f3ed…