手写数字识别系统之图像分割

  背景

  本文,主要介绍我之前在学校时候,研究的一些跟手写数字识别相关的技术心得,主要涉及:数字图像处理、特征提取、神经网络等等相关的一些技术。。

  虽然很多用到的还是网上现有的比较成熟的算法,但是在这些基础上,我还是有做了不少算法上的改进的。。

  并且为了写这个项目,我当时还特地写了一整套神经网络库,从图像处理开始到最后的识别过程,没有使用任何第三方库,都是从0还是写起

  也没有用到opencv啊什么的。

  上层ui当时用的qt,虽然当时也算是为了跨平台,但那个时候毕竟还是学生,代码经验欠缺,因此我的基础库对跨平台处理的并不是很好。。

  那个基础库,我稍微简单说下,那是我的第一个开发库,是一个类似boost的c++模板库,里面用到了很多c++的模板元编程的特性,但是现在已经对c++无爱了,所以早已废弃不用了。

  不过也就是这个库的开发,很大程度上影响了我之后的编码风格,也是至此之后,我重点转向了对c的开发上。。

  这套识别系统,仅仅是我当时为了学习神经网络,拿来练手用的,没法跟那些成熟的相比,识别率不是很高哈,只能给大家用来参考学习了。

  简介

  本文在基本BP算法和数字图像与处理的基础上,通过改进网络、图像处理算法,并结合实践来探索如何实现具有高鲁棒的、高精度的、高效率的脱机数字识别。

  在这我主要研究脱机单体数字识别,其主要步骤为:

物联网

  overview_1

  数字样本的采集

  主要采用5行10列的数字样本规格。采集方式是通过扫描样本卡片来获取图像,也尽量避免样本了的失真,如图:

物联网

  overview_2

  图像二值化

  主要采用全局阈值分割法和自适应的局部阈值分割法,来实现在不同亮度背景下的自适应分割,并对结果进行比对。

  数字提取

  目前主要考虑聚类法、矩阵式分割法、连通区域标记法,并比较其优劣,选取效果最好的一种算法。

  图像归一化

  主要采用双线性内插和最邻近内插来实现放大,为了减少图像在收缩时带来的失真,目前打算采用求平均法来实现。

  特征提取

  主要采用逐像素提取法,PCA主成分提取两种方法来实现。

  样本学习

  主要采用基于BP算法(反向传播学习算法)的神经网络进行识别,并对BP进行一定的改进和优化,来改进训练效果并且适当的提高训练速率。

  目前,针对BP的改进算法,主要采添加动量项和自适应步长法。

  而对于BP算法,其主要步骤为:

  前向计算=〉反向计算=〉权值修正=〉循环迭代

  为了进一步改进网络,实现高精度、高效率的识别,打算考虑采用多网络集成法,来进行优化。

  主要针对不同权值、隐层数的基本BP网络进行集成。通过每个网络分类的结果进行加权输出,来达到有效的分类。

  阈值分割

  阈值分割法是一种基于区域的图像分割技术,其基本原理是:通过设定不同的特征阈值,把图像像素点分为若干类。

  在本文中,我们主要处理针对两类的分割,令阈值为T,图像像素对应的灰度级为f(x, y) ,那么经阈值分割后的图像 g(x, y) 定义为:

  split_1

  因此,标记为1的像素对应于对象,也就是前景,而标记为0的对象对应于背景,也就是我们通常所说的图像二值化。

  利用阈值分割进行图像二值化的主要难题就是阈值的选取,事实证明,阈值的选择的恰当与否对分割的效果起着决定性的作用。

  常用的阈值分割方法有以下三种:

  整体阈值法

  利用整幅图像的信息对图像求出最优阈值, 在二值化分割过程中只使用这一个固定阈值,因此计算量小,但对于亮度条件不好的图像的分割效果较差。