手写数字识别系统之数字提取

2016-07-30 ruki 更多博文 » 博客 » GitHub »

手写数字识别 神经网络 人工智能 数字提取 聚类分割

原文链接 https://waruqi.github.io/2016/07/30/hnr-extract-digital.cn/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


引言

所谓数字分割就是指将经过二值化后的图像中的单个数字区域进行提取的过程。数字分割在数字识别中是一个必不可少的关键步骤,只有能够将数字进行准确的提取,才能将其一一识别。

数字分割的方法

数字分割的方法相当多,主要有以下几种:

基于直方图的分割

此类方法就是对每行和每列黑色像素数进行统计,生成行直方图和列直方图,并采用某种阈值选取法分别对图像进行行列分割。

这种方法简单快速,对于按矩阵分布的规则数字的分割效果相当好,但是无法对不规则分布的数字进行分割,因此具有一定的局限性。

基于聚类的分割

聚类就是一个将数据集划分为若干组或类的过程,通过聚类使得同一组内的数据对象具有较高的相似度,而不同组中的数据对象则是不相似的,由于数字图像的特征正好符合这类情况,因而可以使用聚类来达到分割数字的效果。

其方法主要包括基于距离矩阵的聚类分割、k-均值聚类分割、模糊C-均值聚类分割

此类分割方法对数字的位置和大小没有限制,非常适合对位置和大小不规则的数字进行,但这种方法也有明显的不足,其中基于距离矩阵的聚类分割的计算量太大,尤其是对较大的图像,而且矩阵的占用空间相当多,因此在实际中无法使用。

而k-均值聚类分割、模糊C-均值聚类分割这些动态聚类虽然解决了这些问题,但是他们对于初始中心的选取极为敏感,虽然已经有各种对于中心选取得优化算法,但是其分类个数必须人为指定之一限制,最终使此类算法无法应用到实际的数字分割中。

基于二值图像连通区域标记的分割

二值图像连通区域标记是指将图像中符合某种连通规则的目标像素点用相同的标号表示出来。

因此这种方法非常适用于数字分割,因为每个数字本身就是一个连通区域,而且这种方法不受分类数的限制,也适用于不规则分布的数字图像,实现简单快速,是一种相当好的分割方法。

而本文采用这种方法进行图像数字区域的分割,并对其进行了适当的改进。

到目前为止,二值图像连通区域标记方法主要有以下几类:

  • 两次扫描法
第一次扫描时, 将临时标号存储在一个与图像大小一样的二维数组中并形成等价对。

扫描结束时,通过某种搜索方法合并等价标号; 第二次扫描时, 用等价标号中最小的标号值赋予所有等价标号对应的像素点。
  • 双向反复扫描法:
第一次扫描时, 将每个目标像素点标记为一个唯一的标号。

然后, 通过正向和反向反复扫描标号图像, 并在每个像素的邻域内传播最小标号, 直到没有标号变化时为止。
  • 区域增长法
依次扫描二值图像的每一个像素点。当找到某个未标记的目标像素点时, 将其压入堆栈并从该点开始反复标记其邻域, 直到堆栈为空。

考虑到数字分割仅仅是数字识别的一小步,如果在此处耗费太多的时间是相当能够不值得的,因此我采用速度相对较快的两次扫描法进行分割。

而在两次扫描法中,合并等价标号是相当关键的一步,因此如何提高其合并速度是相当重要的,因此我主要采用如下改进的区域标记方法:

1. 构造一散列表,以标号作为关键字进行散列,说白了就是一数组。每个元素指向一个双向链表,在链表中存储同一类别的像素点坐标。
2. 构造一个与图像同样大小的标记矩阵,用于存储每个像素的分类标号
3. 初始化标记矩阵,并对图像第一行和第一列中的黑色像素进行标记,标记依次递增,并将相应的像素点位置保存到对应标记的散列表中。
4. 依次遍历其它各行各列,若当前像素点为黑色,则将其左前、左上角、正上、右上角这四个邻点中为黑色的像素的最小标记赋给当前点,并将这四点中为黑色的像素点归并到最小标记中,具体归并方法为:将四点中为黑色的像素点的原标记在散列表中所指向的像素链表与最小标记所在链表进行合并,并更新标记值。若其四个邻点中没有黑色像素点,那么当前点属于新类,创建一个新的标记值及相应的链表。
5. 若当前像素点为白色,则标为无效标记,继续第(4)步。

过滤无效区域

由于图像或多或少会存在些许噪声、无效块,通常在分割前需要做一些去噪、过滤非数字区域等工作,才能达到良好的分割效果。

考虑到数字本身具有细长等特点,因此不太适合中值滤波这些去椒盐噪声的算法。

在这我采用最简单的离散去噪,仅仅取出一些离散噪声点,对于其它大块的无效区域,我通过统计分类样本的平均高度和宽度,设定合适的阈值进行过滤,并对明显高宽比不符合数字特征的区域也一一进行过滤。

从实验结果中可以看到,这样的效果还是相当好的。

实验结果

extract_digital_1 extract_digital_2

但是可以看到,由于是按行进行标记,因此标记好的顺序对样本区域的高度相当敏感,高低稍有不同,分割后就会打乱其原始的顺序(尤其是针对那些原本排列较为规则的图像),若要按顺序分割,必须在处理后期,进行额外的排序操作才行,其具体步骤为:

  1. 将原先按标记散列的分类图像,转化为按区域图像中心的矩阵散列,此时生成的矩阵为稀疏矩阵,只有位于区域中心的点指向所对应的数字图像
  2. 按一定的阈值把矩阵按行切分,由于矩阵中的点角为稀疏,因此阈值较为好取,分割效果也较好,不需要过多的进行优化,就能达到很好的效果。
  3. 对每行的区域图像按中心位置的横坐标值进行排序,即可恢复原先的数字分布。其效果如下:

extract_digital_3

而且,区域标记的一大优点就是对数字分布极为不规则的图像的处理效果也是相当好的,可以很好的解决数字缠绕在一起,难以分割的问题,其效果如下:

extract_digital_4

总结

虽然使用区域标记法进行分割的效果已经相当令人满意,但是还是存在一些不足的地方,比如说只能对具有良好连通性的数字进行分割,而对于那些具有断层的数字就无法实现较好的分割,为此,在分割前需要进行额外的断层修复,而断层修复的过程较为复杂,且修复效果有限。

因此,要实现具有高度通用性的数字分割算法,还有待进一步研究。

参考文献

如果想要了解更多数字图像处理相关的内容,可以去我的书柜看看,冈萨雷斯写的那本书数字图像处理还是非常经典的。。