快捷搜索:  汽车  科技

opencv如何编码(深度学习OpenCV最常用的操作)

opencv如何编码(深度学习OpenCV最常用的操作)图4:图像二值化操作方法对于一张图像来说,使用OpenCV读取到之后,该图像数据中是包含三个通道的,而对于字符识别来说,黑白图像就完全能够进行识别,因此,第一步就是要将RGB图像转化为二值化的图像,具体操作如图4所示。图2:真实的文本图像下面我们利用OpenCV,实现将上述的文本块变成如图3所示的独立字符。图3 :字符分割的结果

opencv如何编码(深度学习OpenCV最常用的操作)(1)

在前面的文章中,我们对于OpenCV的一些基本操作进行了简要的说明,今天将结合一个实际的例子对OpenCV中的一些复杂操作进行学习。

引言

深度学习的发展可以追溯到很早,但是真正的实用系统是1998年LeCun等人在手写体数字识别上进行的研究,如图1所示是手写体数字识别的数据集MINIST。目前,在该数据集上使用深度学习的方法识别率能够达到99%以上。其识别的主要思路是将该问题定义成一个分类问题,然后设计一个深度学习模型,通过大量训练,最后得到结果。

opencv如何编码(深度学习OpenCV最常用的操作)(2)

图1:MINIST数据集示例

即使是对于中文字符,在足够规模的训练集下,也能够达到很好的效果(模型的定义及训练将在后续逐步进行展开)。但是细心的同学可能会发现,我们平时在实际中看到的往往是一长串手写体数字,或者是如图3所示的文本图像。即使我们有一个训练好的字符识别模型,也没有办法直接应用到实际的场景中去,因为我们的模型只能识别一个个的字符,而无法识别整块的文本。

opencv如何编码(深度学习OpenCV最常用的操作)(3)

图2:真实的文本图像

下面我们利用OpenCV,实现将上述的文本块变成如图3所示的独立字符。

opencv如何编码(深度学习OpenCV最常用的操作)(4)

图3 :字符分割的结果

图像的二值化

对于一张图像来说,使用OpenCV读取到之后,该图像数据中是包含三个通道的,而对于字符识别来说,黑白图像就完全能够进行识别,因此,第一步就是要将RGB图像转化为二值化的图像,具体操作如图4所示。

opencv如何编码(深度学习OpenCV最常用的操作)(5)

图4:图像二值化操作方法

其中四个关键操作及作用如下:

第5行:图像灰度化。简单说来就是将RGB的图像转化成灰度图像,灰度图像是RGB通道的一个线性组合,公式为: Gray = R*0.299 G*0.587 B*0.114。

第6行:图像二值化。通过二值化操作,可以将灰度图转化为二值化的图。在该函数中,第1个参数是输入图像,第2个参数是阀值,第3个参数是Maxval,第4个参数是转换模式。通过设置不同的阀值,可以实现背景噪声的消除。其中可指定的转换模式如下:

THRESH_BINARY:当前点值大于阈值时,取Maxval,也就是第3个参数,下面再不说明,否则设置为0。

THRESH_BINARY_INV:当前点值大于阈值时,设置为0,否则设置为Maxval。

THRESH_TRUNC:当前点值大于阈值时,设置为阈值,否则不改变。

THRESH_TOZERO:当前点值大于阈值时,不改变,否则设置为0。

THRESH_TOZERO_INV:当前点值大于阈值时,设置为0,否则不改变。

通过

第7行:颜色反转。在图像中,文字是黑色的,其像素值是0,背景是白色的,其值为255。而在计算时往往希望表示文字的值大于0,因此进行颜色反转,使得文字部分的数值大于0。

第8行:图像腐蚀。该操作主要目的是消除一些孤立的毛刺,第2个参数是腐蚀的大小,需要注意该参数的大小,如果选择过大,可能导致文字部分被破坏。

以上操作的结果如图5所示,可以看到原始的图像被转化成为黑底白字的图像,而且每个像素值的大小要么为255,要么为0。

opencv如何编码(深度学习OpenCV最常用的操作)(6)

图5:图像二值化效果

投影法字符分割

对于一张二值化的图像,有很多的方法,可以从中分割出字符。对于本问题这种印刷体字符的分割,我们可以使用一种简便易行的方法:投影法。具体的操作及效果如图6所示,关键的操作是第13行和第14行,实现按照指定的维度将数据进行累加。该函数的具体用法大家可以参考numpy的用户手册。

opencv如何编码(深度学习OpenCV最常用的操作)(7)

图6:图像投影操作及效果

Tips:在前面图像的基本操作中讲过图像数据的存储方式是按行存储,第1个维度(axis=0)是行数,第2个维度(axis=1)是列,需要注意不要弄混。

从图6中可以看到,投影到y轴上的数据出现了非常明显的空隙,对比可以发现,这些空隙与文本图像中的行与行之间的间隔是一一对应的,因而,只要按照这些数据空隙进行分割就能够将文本按行分割。

图7显示的按行分割方法的实现步骤,以及第一行文本的分割及投影效果。从图中我们可以看到,对于包含单行文本的图像,投影到x轴上的数据出现了比较明显的空隙,而这与字符之间的间隔又是相对应的。同理,我们就可以从单行文本中分割出一个一个的字符。

opencv如何编码(深度学习OpenCV最常用的操作)(8)

图7:按行分割方法及结果展示

至此,通过一系列操作,我们实现了从一张原始的图像中将字符分割出来。但是这种方法只适用于图片质量相对比较好,特别是横平竖直的图像,一但图像出现旋转,在投影法分割图像时就可以出错,具体解决方法将在下次给出。

作者:花木兰

申明:本文为易学智能原创内容,未经允许请勿转载

欢迎关注“易学智能”头条号,评论区有问必答

www.easyaiforum.cn论坛提在线开发和学习平台

猜您喜欢: