用OpenCV进行OCR字符分割

news2024/9/23 13:25:16

1. 引言

本文重点介绍如何利用传统的图像处理的方法来进行OCR字符切分,进而可以用分割后的单个字符做相应的后续任务,虽然现在计算机视觉依然是卷积神经网络的天下,但是对于一些相对简单的落地场景传统方案还是很有效的。
闲话少说,我们直接开始吧!

2. 基本概念

OCR: 全称 Optical Character Recognition , 光学字符识别
Segmentation: 是指在图像处理领域中将整张图像分解为多个子部分以进行进一步处理的过程。
OCR Segmentation: 是指将包含文本的图像分解成多个小部分,以识别背景中的文本。
在这里插入图片描述

本文主要通过Python中的计算机视觉处理库OpenCV来实现上述过程。

3. 读入图像

一旦我们拥有了包含文本的数字图像,或者通过扫描仪扫描某些文档并将其存储为数字图像,接着就可以开始下一步,即预处理。这里我们将使用以下图像作为例子,如下所示。

myImage= cv2.imread('pngImgs/t20.png')
cv2.imshow('Text Image', returnImage)
cv2.waitKey(0)

结果如下:
在这里插入图片描述

4. 图像二值化

在我们开始分割文本图像之前,有几个步骤,这些步骤如下:
灰度化:将输入图像转换为灰色图像,使系统能够轻松识别图像中的不同形状并去除相关颜色信息。

grayImg = cv2.cvtColor(myImage, cv2.COLOR_BGR2GRAY)

结果如下:
在这里插入图片描述

二值化:这意味着将灰度图像转换为二值图像,换句话说,二值化后的图像将只包含两个值:[0,1]或黑白。

 ret, thresh = cv2.threshold(grayImg, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)

结果如下:
在这里插入图片描述

5. 形态学操作

接着我们可以选择并使用多种算法从上述二值图像中提取信息,例如直方图均衡、傅立叶变换、形态学等。
在这个应用程序中,我们决定选择形态算法来提取所需的信息。
代码如下:

horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (18, 18))
dilation = cv2.dilate(thresh1, horizontal_kernel, iterations=1)

结果如下:
在这里插入图片描述

6. 查找轮廓

接着我们需要找到轮廓线,这样我们才能将图像与背景逐行分离。

horizontal_contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in horizontal_contours:
        x, y, w, h = cv2.boundingRect(cnt)
        rect = cv2.rectangle(im2, (x, y), (x + w, y + h), (255, 255, 255), 1)

得到结果如下:
在这里插入图片描述

7. 单词和字符分割

接着我们通过以下步骤对裁剪出的轮廓子图进行单词分割:

1-预处理(灰度、阈值),
2-形态学算法,
3-找到边界并绘制它们,
4-进入单个字符分割

进而我们将对输出图像中的每个单词再次重复相同的步骤进行单个字符的分割:

1-预处理(灰度、阈值),
2-形态学算法,
3-找到边界并绘制它们,
4-停止

最终我们得到的结果如下:
在这里插入图片描述

上图中的绿色框为可能的单词框,蓝色框为可能的包含字符的框,黑色框为找到的潜在的包含外轮廓的最小外接矩形框。

8. 其他示例

我们将上述处理过程应用于其他图像,得到结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9. 结论

本文重点介绍了在传统图像处理中,如何利用常见的形态学方法进行字符轮廓查找进而切分字符的样例,并给出了相应的代码实现。对于一些字符分布简单,字符间隔较大的场景下,可以取得一定的效果;由于是传统方案,改方法的泛化性还是非常局限的,后续可以考虑使用神经网络的方法来实现更加鲁棒的算法。

代码链接: 戳我

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

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

相关文章

底盘线控悬架智能化趋势

摘要: 汽车的底盘主要由行驶系、传动系、转向系和制动系四部分组成,其中行驶系又由汽车的车架、车桥、车轮和悬架等系统组成。底盘的悬架系统不仅是汽车重要的组成部分,而且还关乎到一辆汽车在行驶过程中的质感,影响车辆的操控性…

CSDN周赛59期简要题解

本期题目相对比较友好,而且在比赛报名界面还提示了非编程题考察的章节——诚不欺我: 本期非编程题需要选手阅读的章节是第2章“逆向思考——从递推到递归”—2.3节“堆栈和队列:遍历的数据结构” 选择和判断都考到了栈的数据结构&#xff0…

【MySQL进阶】:子查询与HAVING/SELECT的完美结合

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL子查询在HAVING/SELECT字句中使用、及相关子查询和WITH/EXISTS字句的讲解✨ 目录 前言一、在HAVING/SELECT字句中使用子查询二、相关子查询三、WITH/EXISTS、NOT EXISTS字句四、总结 一、在HAVING/SELECT字句中…

【Python 基础篇】Python 字典及字典常用函数

文章目录 导言一、字典的创建和访问二、字典的增删改查1、增加元素2、删除元素3、修改元素4、查找元素 三、字典常用函数及操作1、len()2、keys()3、values()4、items()5、字典的遍历 总结 导言 在Python中,字典(Dictionary)是一种无序的数据…

使用它或失去它!谷歌即将清理不活跃账号

如果你很长时间没有登录你的谷歌账号,最好尽快登录,否则你很可能会失去账号。 2023年5月16号,谷歌宣布,将开始删除至少两年不活跃的账号。 如果谷歌帐户至少两年未被使用或登录,可能会删除该帐户及其内容,包…

04. 青龙面板通知配置 邮箱 pushPlus 企业微信机器人(保姆级图文)

目录 1. qq邮箱通知2. pushPlus通知3. 企业微信机器人总结 欢迎关注 『青龙面板』 专栏,持续更新中 欢迎关注 『青龙面板』 专栏,持续更新中 1. qq邮箱通知 emailUser:填写你的邮箱 emailPass:填写邮箱密钥授权码 邮箱密钥获取教…

【从零开始学习JAVA | 第六篇】面向对象综合训练

目录 前言: 1.文字版格斗游戏: 2.对象数组1 前言: 前面我们已经讲解了JAVA面向程序对象思想的关键要素:封装。我们将利用本篇进行几个小型的练习,帮助我们更好的理解面向对象编程这种思想。 1.文字版格斗游戏&#x…

C++哈希表

目录 介绍哈希概念哈希冲突哈希函数解决哈希冲突 闭散列介绍线性探测二次探测负载因子 实现哈希表结构哈希函数元素查找插入元素删除元素 开散列介绍实现哈希表结构元素查找插入元素删除元素析构函数 介绍 哈希概念 了解过搜索二叉树与红黑树后,它们的结构特点主要…

8.批量消息发送与批量消息消费

highlight: arduino-light 4.4 批量消息 4.4.1 发送限制 生产者进行消息发送时可以一次发送多条消息,批量发送消息能显著提高传递小消息的性能。 不过需要注意以下几点: 批量发送的消息必须具有相同的Topic批量发送的消息必须具有相同的刷盘策略批量发送…

统计数组中非零元素的个数统计数组中每列中非零元素的个数统计数组中每行中非零元素的个数numpy.count_nonzero()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 统计数组中非零元素的个数 统计数组中每列中非零元素的个数 统计数组中每行中非零元素的个数 numpy.count_nonzero() 选择题 以下说法错误的是? import numpy as np anp.array([[0,1,2,3],[3,…

文件加密后怎么打开?打开加密文件的方法

当我们把重要文件加密后,可以有效地保护文件数据安全,那么文件加密后该怎么打开使用呢?下面我们就一起来了解一下吧。 EFS加密 作为Windows系统提供的文件加密方法,EFS加密并不需要密码。在我们使用加密时登录的系统账号时&…

使用HTML制作一个赛龙舟小游戏

在这个信息爆炸的时代,开发者们肩负着前所未有的责任与挑战,以屈原名言 路漫漫其修远兮,吾将上下而求索 为指引,使用HTML制作一个赛龙舟小游戏,以此激励广大开发者在技术征途上不断求索,追求极致。 一、前期…

忘记了谷歌Gmail账号名怎么办?用这种方法轻松找回谷歌邮箱地址

有些朋友以前注册过谷歌邮箱,但很久很久没有再去使用。 现在注册ChatGPT需要谷歌邮箱,于是打算把尘封已久的谷歌邮箱找出来,可是这时候你才发现,谷歌邮箱的账号名早已忘掉了。 今天重点来说说如何找回谷歌账号,希望能够…

ANTLR实战

ANTLR(Another Tool for Language Recognition)是目前非常活跃的语法生成工具,用Java语言编写,基于LL(∗)解析方式,使用自上而下的递归下降分析方法。ANTLR可以用来产生词法分析器、语法分析器和…

【运维知识进阶篇】zabbix5.0稳定版详解5(SNMP网络管理协议监控)

简单网络管理协议(SNMP)是专门设计用于在IP网络管理网络节点(服务器、工作站、路由器、交换机及HUBS网络枢纽等)的一种标准协议,它是一种应用层协议。 目录 SNMP三种版本 监控SNMP SNMP:OID和MIB介绍可以…

深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)

1.ResNet18原理 2.文件存储 一个样本存放的文件夹为dataset 下两个文件夹 train和test文件(训练和预测) 3.训练和测试的文件要相同。下面都分别放了 crane (鹤)、elephant(大象)、leopard(豹子) 4.编写预测的Python文件:code.py 跟dataset是同级路径。 5.code.p…

ROS从入门到精通2-7:Gazebo仿真之动态生成障碍物

目录 0 专栏介绍1 动态生成障碍应用场景2 基于Gazebo动态生成障碍2.1 spawn_model服务2.2 动态构造障碍物URDF2.3 请求服务与动态生成 3 实测演示 0 专栏介绍 本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实…

CSS | 解决html中img标签图片底部存在空白缝隙的问题

目录 问题描述 原因分析 解决方案 写在最后 问题描述 在学习CSS的过程中&#xff0c;我们经常会遇到图片底侧存在空白缝隙的问题。 代码示例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" />&l…

SpringCloudAlibaba之Sentinel源码分析--protoc-3.17.3-win64

Sentinel源码分析 文章目录 Sentinel源码分析1.Sentinel的基本概念1.1.ProcessorSlotChain1.2.Node1.3.Entry1.3.1.自定义资源1.3.2.基于注解标记资源 1.4.Context1.4.1.什么是Context1.4.2.Context的初始化1.4.2.1.自动装配1.4.2.2.AbstractSentinelInterceptor1.4.2.3.Contex…

【C++初阶】string类常见题目详解(一)—— 仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C初阶】…