热度 23
2012-11-19 10:10
1697 次阅读|
5 个评论
字符识别是一个有趣的问题,你在写字板上写下需要识别的字符,然后就是算法大显身手了,这里的主要办法在于模板的匹配,其实很多的算法都是基于这样的一种方法,而且这种方法在大多数情况下是十分实用的,当然如果你编程实现过类似的算法或者是功能,你可能会说这种办法不是那么的给力,不是那么的有效,常常会出错,是的,的确是的。 但是还有一点,就是我在最近发现的,其实就算是模板的匹配这种方法,其模板的选择也是很有讲究的,不是简单的选取,当然,不反对简单的选取,但是这样子的效果确实不怎么样,所以就算是模板,也需要认真的考虑,怎样的模板才是最好的呢?就我看来,最好的模板有一定的适应能力,而不是一个“偏执狂”,在一般的意义上的模板,也就是我之前编程匹配的时候使用的那种,是对于位置极其敏感的,这种模板有它自己的好处,那就是对于十分标准的输入,它可以做到几乎不出错的判断,这正是我们所需要的,但是,别忘了,这是在十分标准的输入的情况下,在手写这种情况下,怎么办呢?没有办法,几乎全是错误,那叫一个惨不忍睹啊。所以,你制作模板的时候用的是标准的字符,而你给出识别的内容时,却是完全变了样子的东西,你说你是不是特别不够意思呢? 所以,在以前我并没有意识到这个问题,还一味苛求二进制的大脑进行复杂的多维的复杂思考,真是有点不靠谱,好在前两天网上看到一个办法,也是模板匹配,突然觉得很有意思,试了一下,效果还真的很不错! 所以说,很多的时候,不是程序写的有问题,是写的很有问题,根本的不去改变,那就啥也改变不了。 好了,废话不多说了,上方法吧,我的测试环境你可能没有听说过,不过没关系,就是java语言,只要有算法,走到哪里都不怕,这句话真是越来越有感触了。 这次的模板是基于一种统计的办法做出来的,也不能说和位置没有关系,在模板匹配这种方法中,和位置无关这句话基本就是扯淡。至少个人感觉是如此。 好了,这里主要的就是描述一下这种算法,至于具体的代码,就不是难事了,在一幅存在字符的图片中,我们现在讲的是只有一个字符的图片中,当然,有很多的字符也是可以的,只不过在分割的时候比较的痛苦,也不是难事,其实就是一些循环语句上的判断,然后进行一些数学的运算,然后给出边界,然后进行分别的识别,这里讲的是一个字符,首先是定出这个字符的边界,便于精细的处理,这个边界非常重要,如果没有这个边界,很多的噪声是会产生出来影响的,所以这一步必不可少。 其次是进行画方格,画方格干啥呢?主要是为了后面的分片的统计,写到这里有些读者应该明白我后面要干啥了,这里分的是5×5的方格,其实可以更加的精细,但是并不建议去画超过9×9的方格,因为我们的字符的区域毕竟是有限的,而且这样子也是需要一定的程序运行的时间的,而且模板的规模和所需的存储的空间也会随之增大,所以这样看来,5×5的确是可以了,有一点需要提前声明,我给的这个模板的方法不是能够达到100%的正确的识别率的,所以如果你所要求的是万无一失,我建议你就不用在往下看了,之前的时间的浪费很不好意思。 好了,分好了空间,我们开始进行统计,对于每一块方格,其中有很多的点,就是像素点,首先你需要能够读取到图像的确定的一个位置的像素值,也就是颜色,这之前最好进行一下图像的二值化处理,而由于这里是用于手写识别,所以提供的背景为白色,然后写的字就是黑色的,所以比较的好处理,就相当于直接得到的就是二值化的图像了,何为二值化,不就是图像中存在的像素点只有两种吗?恩,如果你的应用环境有类似的情景,比如只有黄色和红色,那么也不用处理,然后我们统计在每一个方块中出现的字符的对应的颜色值的数量,在我这里,就是黑点的数量,然后这个数量和这个方块中的总的点的数量有一个比值,我们把这个比值记录下来,这样子,对所有的25个方块进行统计,然后把这些数据存在程序中的一个数组中,好了,大部分的工作都完成了,下面进行识别啦!激动人心和见证奇迹的一刻终于到来了!