用OpenCV进行OCR字符分割

news/2024/11/30 0:26:59/

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.ppmy.cn/news/512031.html

相关文章

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

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

Apache Zeppelin系列教程第十篇——SQL Debug In Zeppelin

SQL Debug介绍 首先介绍下什么是SQL Debug? 但是经常有这样一个需求,一大段sql 跑出来之后,发现不是自己想要的结果?比如: demo 1: select id,name from ( select id,name from table1 union all select id,name fr…

python多进程使用

目录 背景单个输入参数多个输入参数 背景 在工作或者生活中,可能会遇到大量的for循环处理逻辑,这些逻辑完全可以并行(比如读取一个文件夹中的所有图片,然后将其resiz到最长边不超过960),此时我们可以使用多…

前端3D Three.js 在本地搭建一个官方网站

上文Web前端 3D开发入门规划 3D效果将不再是桌面应用的专利我们说了说 WEB 3D的一个发展和学习方向 那么 我们还是先搞定文档使用的问题 我们可以访问http://www.yanhuangxueyuan.com/Three.js/这里面可以查到使用方法 但不是最新的 而是别人用官方文档改的 真正的官方文档地址…

黑客都用什么牌子的电脑?

【黑客联盟2017年06月05日讯】你知不知道,全世界的黑客都凑在一间屋子里,是一种怎样的体验? 朋友:神马?有这种事?屋子里有床吗? 你:是全世界的黑客,不是全日本的演员。。…

推荐这几款好用的电脑软件

软件一:Sticky Notes Sticky Notes(便笺)是Windows系统自带的便签应用程序,它可以帮助用户快速创建、编辑、保存和查看文本便笺。用户可以在便笺上记录备忘、灵感、待办事项等内容,方便日常生活和工作中的信息管理。 …

推荐7 款实用好用的电脑软件

EasyCharts EasyCharts 是一个简单好用 的Excel 插件。 使用它可以快速制作出美观高大上的图表。 它支持多种图表,什么柱线图,散列图,折线图等等。而且还能美化配色图表。 它还可以使用数据分析命令自动绘制复杂的图表。 关注…

好用的电脑软件

好用的软件 1.装机必备 1)火绒安全中心 这里我推荐火绒的原因很简单,就是没有广告,还能给你屏蔽广告和弹窗。 火绒官网 2)火狐浏览器 没有广告的浏览器 火狐官网 3)BindiZip 高效快捷的解压软件,之…