有些同志在QQ上与我说,虽然当了我的程序,但还是看不明白,让我作个说明,想一想,也是,我就有个深刻体会,看别人的程序实在有点费神,所以,还是来作个简要说明,再做一件好事吧,加起来应该有1001件了。
直入正题:
要识别图片上的文字,首先要找图片的共同点。咋一看,图片有不同大小、类型,字符有不同字体、字号、颜色,更可恶的是有些附加码还加了干扰,比如随机加了点。
如何找到附加码图片之共同点呢?让我仔细道来(只针对绝大多数附加码):
一、字符集有限,多不过键盘上的可输入符号(好象还没有用东方语言做附加码的),而用的最多最多的就是0~9了。
二、相同字符形状相同。0总是个鸡蛋,1总是一飘扬的旗帜,2总是个鸭子,它不会变成个鸡蛋!
三、附加码长度总是相同。
四、附加码每位字符位置固定。
五、图片大小相同。
有了上面五点就完全可以了。
有人可能会不断地想,那不同的附加码字体字号等等,如果你老是这样想,那你肯定会失败的罗,你想,字体完全可能别人有你没有呀。到那里找那么多字体?相信没有谁有那本事。
现在来一个一个解决问题:
第一步,如何解决图片颜色问题。
想一想,什么样的图片最好处理? 颜色单一! 好了,我们原来的图片首先变成位图(BMP格式),然后把它变成灰度的,然后再把它变成二色的(就是黑与白),好了,现在图片初始化完毕了。
第二步,如何去燥。
如果加了干扰点,如何去掉那该死的随机位置出现的点呢? 你学过位运算吗?什么是与运算? 呵呵,如果你聪明一点,就不用我讲了,看下一条吧。我们把几个相同字符的图片的效部份提出来,然后把这些图片中每一个相同位置的点的颜色相与,给果如何?清清楚楚的字符出来了!眯着眼睛,仔细再想一想,这是为什么? 可能你会晃然大悟,哦,原来最重要的原理在这里!
第三步,如何提取特征码。
其实解决了上述第二点,就已经解决了绝大部份问题。要提取特征码,实质就是找出字符的点阵,把它存起来,就是特征码。
第四步,什么是学习。
学习就是人先给程序一些图片(我的程序中是18张),并告诉它每个图片中的附加码。然后程序开始自动进行处理,得到所有字符有特征码并存起来。具体过程是这样的:
先将图片分为附加码长度个等分,得到几个图片范围,每个范围对应相应的字符,对每个字符与相应特征码的图片点的颜色相与,得到更新的特征码。
将所有的图片进行相同处理,得到最后的特征码,根据概率估计,特征码成功有机率非常高(我还没有遇到过不成功有情况呢,如何出现了,换一些图片重新学习就行了)。然后根据最后的特征码绘出所有字符集图,看看对不对?
多半不对!为什么?因为每一种附加码可能在生成的时候,会在图片上加一个左边界,所以我们还得用一个循环去掉左边界,并调整字符宽度,使之与现实相符。
把每一次分析得到的图片(根据最后的特征码绘出所有字符集图)和参数生成一个HTML文件,展示给使用者,让使用者选一最清楚的,作为最后的识别结果,把参数记下来,再用指定参数生成一次,把特征码存成文件。
第五步,根据特征码识别未知图片。
简单,判断它某一位置是不是某个字符就看相应位置(所有点)是不是都有这个字符的特征就够了。要注意某些字体的3与8的判断哟,所以我用的是一个减循环实现的。
第六步,完了,没有说的了。
随便说一句:大家可以把我的程序做成完全自动识别,不要人选参数决定最后的特征码,想想吧,就算留给大家的一个问题吧。