倾斜校正主要有两种,一种是整体倾斜校正,另一种是局部倾斜校正。
由于本文主要研究具有不规则分布的多数字识别,因此只需要关注经过提取后的数字校正问题,也就是图像的局部校正。
目前的校正算法有很多,比如说:
对于整体倾斜校正可以采用统计图像左右两边的平均像素高度,通过计算整体倾斜度来进行校正。
这种方法对于像素较多的图像的处理效果明显,而且实现简单快速,但是对于那些已经经过提取得单一数字图像并不适用,因为此时的图像一般较小,且笔画较细,由于所需信息太少统计后的结果并不正确。
其实校正的核心就是使图像的倾斜度的接近为0,因此可以把它看作是一个最优化问题:
即寻找需要调整多少角度,才能使图像的倾斜度最小,可见倾斜度决定了最终图像的好坏,考虑的数字的特征,都是具有狭长的特点,我们可以考虑将图像的高宽比最为图像倾斜度的依据。
而到底需要调整多少才合适呢,本文所采用的方法,并不估算图像的倾斜度,而是通过二分搜索
的思想,在倾斜45度的范围内进行二分查找,寻找最佳调整点,使其结果近似最优,其具体步骤如下:
1. 设置最大调整角度,一般倾斜度不会超过45度,如果超过调整也就没有意义了。
2. 计算图像高宽比,也就是倾斜度,如果倾斜度比上次的有所减小,则调整角度减半,继续搜索,如果倾斜度趋于稳定,则退出查找,并使用此时的调整角度进行调整。
3. 对于实际的调整过程,一般会选择进行旋转变换操作,比较简单,但是考虑到实际人们书写数字时的倾斜往往并不是旋转造成的,而是可能姿势不正而引起的侧斜,因此仅仅通过旋转并不能达到较好的效果,因此可以通过水平侧向校正来实现,即保持像素点的高度不变,仅仅通过调整水平位置,进行适当的调整。
所谓的细化就是经过一层层的剥离,从原来的图中去掉一些点,但仍要保持原来的形状,直到得到图像的骨架。
骨架,可以理解为图象的中轴,例如一个长方形的骨架是它的长方向上的中轴线;正方形的骨架是它的中心点;圆的骨架是它的圆心,直线的骨架是它自身,孤立点的骨架也是自身。
通过基于数学形态学的腐蚀细化法,通过刚才的删除条件,进行匹配删除,由于是直接判断,省了模板匹配的这一步。
针对3*3的八邻域,进行操作:
p3 | p2 | p9 | ||||
p4 | p1 | p8 | ||||
p5 | p6 | p7 |
所谓数字分割就是指将经过二值化后的图像中的单个数字区域进行提取的过程。数字分割在数字识别中是一个必不可少的关键步骤,只有能够将数字进行准确的提取,才能将其一一识别。
数字分割的方法相当多,主要有以下几种:
此类方法就是对每行和每列黑色像素数进行统计,生成行直方图和列直方图,并采用某种阈值选取法分别对图像进行行列分割。
这种方法简单快速,对于按矩阵分布的规则数字的分割效果相当好,但是无法对不规则分布的数字进行分割,因此具有一定的局限性。
聚类就是一个将数据集划分为若干组或类的过程,通过聚类使得同一组内的数据对象具有较高的相似度,而不同组中的数据对象则是不相似的,由于数字图像的特征正好符合这类情况,因而可以使用聚类来达到分割数字的效果。
其方法主要包括基于距离矩阵的聚类分割、k-均值聚类分割、模糊C-均值聚类分割
此类分割方法对数字的位置和大小没有限制,非常适合对位置和大小不规则的数字进行,但这种方法也有明显的不足,其中基于距离矩阵的聚类分割的计算量太大,尤其是对较大的图像,而且矩阵的占用空间相当多,因此在实际中无法使用。
而k-均值聚类分割、模糊C-均值聚类分割这些动态聚类虽然解决了这些问题,但是他们对于初始中心的选取极为敏感,虽然已经有各种对于中心选取得优化算法,但是其分类个数必须人为指定之一限制,最终使此类算法无法应用到实际的数字分割中。
二值图像连通区域标记是指将图像中符合某种连通规则的目标像素点用相同的标号表示出来。
因此这种方法非常适用于数字分割,因为每个数字本身就是一个连通区域,而且这种方法不受分类数的限制,也适用于不规则分布的数字图像,实现简单快速,是一种相当好的分割方法。
而本文采用这种方法进行图像数字区域的分割,并对其进行了适当的改进。
最近有很多用户反馈xmake在windows上编译体验不是很好,不方便进行调试和开发。。
其实xmake的定位主要还是以直接编译为主,提供跨平台的编译和部署,不依赖第三方IDE工程,不过目前确实在windows的体验还不是很好
尽管我已经优化了在windows下的编译速度,并且提供了xmake run -d xxxx
方式,直接加载调试器进行源码调试
但是毕竟整体开发上,没有IDE的支持,对于习惯IDE开发的用户来讲,就不是那么友好了。(虽然我个人觉得用编辑器+printf的方式已经够用了)
因此我下一步计划(原本打算先做好包管理的),打算优先开始支持对Visual Stdio工程文件的生成,到时候会通过project
插件的方式提供,例如:
创建vs2008工程文件:
$ xmake project -k vs2008
每个开发者在写了一段时间代码后,都会有自己一套适合自己的代码规范。
最近,也看到很多人聊起这些风格上的事,什么命名规则那个好啊,什么的。。
这些我个人不做评价,每个人观点和审美观都不一样,永远都争不出一个结果来,其实只要代码看着简洁明了,整个项目的规范统一就行了。。
这里,我只说说我在写tbox时候,对于一些代码规范上的一些个人经验,以及其演进过程。。