OpenCV字符简单识别

(1)写在前面

环境:Win10+VS2017+OpenCV3.4.6
详细代码及附件见本人GitHub repository:https://github.com/BenJaminB1ue/carriage_number_detection_using_OpneCV

(2)问题分析

OpenCV字符简单识别_第1张图片
本项目源于笔者的一项课堂作业。
对于一些给定的带有序列号的列车图片,我们如何用计算机视觉与图像处理的方法,实现序列号文本的自动定位与文本字符的识别呢?OpenCV字符简单识别_第2张图片

(3)主要思想/架构

输入图像 ——>灰度处理 ——>阈值处理 ——>形态学处理(闭运算、开运算 ——>Canny边缘检测 ——>闭运算开运算) ——>投影直方图切割字符 ——>模板匹配 ——>输出文本序列

本工作运用了形态学处理的方法对字符位置进行粗定位,结合模板匹配得到结果。

1.经过图像预处理和一系列开闭运算和canny边缘检测后,原图中只有局部纹理特征丰富而且连成矩形块状,周围空旷的文字部分能够有效地保存下来。
2.用投影的方法,分割出每个二值字符。
3.度量这些字符与character_template库中模板的欧氏距离,进行匹配。
4.将匹配结果最好的字符输出文本至原图。

(4)详细步骤

4.1图像预处理

首先,我们对需要输入的RGB图片做灰度处理,将它变成单通道的图像,减少计算量,如下图所示。
OpenCV字符简单识别_第3张图片
接下来做阈值化处理,将灰度图变成二值图,进一步减少计算量,如下图所示。
OpenCV字符简单识别_第4张图片
4.2形态学处理

由于该二值图中存在细线、小形黑色区域,我们需要对它选取适当的卷积核做闭运算处理,消除图像中的小形黑色区域,如下图所示。
OpenCV字符简单识别_第5张图片
我们还需要对图像选取适当的卷积核,对图像继续进行开运算处理,消除闭运算后产生的白色空洞,以及原二值图中存在的白色细线。如下图所示。
OpenCV字符简单识别_第6张图片
对于修复后的图像,我们用canny算子检测它的边缘信息,如下图所示。
OpenCV字符简单识别_第7张图片
对图像再进行一次闭运算和开运算,如下图所示。
OpenCV字符简单识别_第8张图片OpenCV字符简单识别_第9张图片
经过上述形态学操作后,我们可以发现,在输入的列车图像中,只有局部纹理特征丰富而且连成矩形块状,周围空旷的文字部分能够有效地保存。

4.3投影直方图分割

为了方便后续的模板匹配操作,我们将获得的图进行反色处理,如下图所示。
OpenCV字符简单识别_第10张图片
我们用投影法将图像中的黑色像素投影到y轴,获得投影直方图。直方图的长度表示该行黑色像素的个数。如下图所示。
OpenCV字符简单识别_第11张图片
接着我们按照累计像素值最大的行进行切割操作,并且认为该行具有整张图中最大的语义信息,即为目标字符区域所在的行,并且记录起始的y坐标值。
相似地,我们对该行用投影法将图像中的黑色像素投影到x轴,获得投影直方图。直方图的高度表示该行黑色像素的个数。如下图所示。
OpenCV字符简单识别_第12张图片
记录黑色像素点在投影直方图上的起始位置,便可以得到字符区域的x坐标起始值。
结合之前得到的字符区域y坐标起始值,可以在输入的RGB原图上用矩形框标记出字符区域。如下图所示。
OpenCV字符简单识别_第13张图片
对文字区域部分切片的x轴投影直方图在像素值波谷处进行切割,可以得到每个字符的二值图像。如下图所示。
在这里插入图片描述
4.4模板匹配

考虑到任务中给出的序列号只存在“R”“W”“Y”“Z”四个字母以及0-9十个数字的情况,我们自己制作了用于匹配的模板数据集。其中字母模板的大小为2025像素,数字为1625像素。如下图所示

OpenCV字符简单识别_第14张图片
在这里插入图片描述
将切割好的所有字符图片以循环的方式与模板数据集中的所有图片进行匹配。首先将其调整至与模板图像同样大小,然后将两张图片按照对应像素度量欧氏距离,将每两个像素间的欧式距离值累加,遍历整个图像矩阵。我们认为累加和最小的模板即为匹配模板。匹配结果如下图所示。
OpenCV字符简单识别_第15张图片
OpenCV字符简单识别_第16张图片
最终,我们把每个字符匹配好的模板对应的文本字符打印在输入的RGB原图上,实现字符的识别过程,如下图所示。
OpenCV字符简单识别_第17张图片

(5)局限性分析

该工作目前只能对“1 Carriage number”文件夹内的“carriage3”图像取得较好的识别。

首先,该方法中涉及的参数过多,如阈值化参数、Canny算子的滞后性阈值参数、开闭运算的卷积核参数等。
由于很难在多张不同环境下的图像中找到一套通用的参数,该方法的可迁移性较差;
除此之外,该方法也未能考虑图片视角的问题,仅对正对着的列车图片能够取得较好的识别效果。

为了解决上述问题,我们可以考虑设置自适应阈值自行调整参数,或者采用滑动条的方式,让用户逐步地、交互式地选择最优参数;
在文字序列粗定位阶段,我们也可以用鲁棒性较高的文字特征梯度算子替代形态学的方法;
除此之外,为了解决多视角下的识别问题,该工作还需要引入透视矫正,水平矫正,仿射变换等方法。

迫于时间和个人能力有限,以上想法虽曾尝试但始终未能成功,这还需要后续更多的研究工作。

你可能感兴趣的:(VC,Win10,图像处理,计算机视觉,OpenCV,文本识别,列车序列号识别)