赞
踩
## 简单的图文识别算法
市面上有很多识别文字的软件,基本上分三种,第一种是免费的,但是效果比较差的,准确率只有80%左右,第二种是比较精确的,例如百度OCR的精确识别,能达到98%,但是速度慢,并且收费贵。第三种是类似于大漠插件的识字,这种确实很厉害,速度快,准确度高,还便宜。但是因为很多人将大漠插件用于一些不好的用途,导致大漠被很多软件检测,没法用。于是自己仿造大漠研究了一种,准确度还行。
主要有四个步骤,像素值,点阵字符串,字库,对比算法。
先说像素值,计算机上的图片,例如大小为800600,就表示有48万个像素,每一个像素,在RGB模式下,都有固定的像素值。在PS中,利用取色工具,可以直接看到一个点的RGB值分别是多少。比如,0/0/0,或255/255/255。RGB的最小数为0,最大数为255.这里说的是10进制,转化成16进制,255=0xff.0xFF是16进制中的最大的两位数。所以RGB每个维度的值,都可以用两位的16进制数字表示,每一个像素,都可以用一个六位的16进制数表示,最黑是0x000000,最白是0xFFFFFF。48万个像素,每个像素都可以转化为6位数字,所以,一张800600的图片,可以转化成486=288万位数的数字。当然,这个数字长度太大,直接拿来使用,会显得程序比较低级。所以说几种简单的转化方法:第一种,绝大多数相连的像素,值是一样的。比如连续10个像素的值都是0xFFFFFF,这个时候我们可以用一个符号,来记住这个连续值。比如H。连续20个,我们设置一个V。这在很大程度上缩小了位数。第二种,利用公式,0xFFFFFF,我们可以写成[F6],10个0xFFFFFF,我们可以写成[f60].
点阵,普遍来说,中文汉字在屏幕上是个正方形,或者说,是个没有填满的正方形。如果背景是白色,字体是黑色。比如一个“十”字,长5个像素,宽5个像素。把笔画覆盖到的地方,也就是黑色的像素点设为1,没有覆盖到的,白色的像素点设为0,就会得到一个矩阵,把这个矩形平铺开来:00100,00100,11111,00100,00100。可以推论出,每一个汉字,都可以转化为一个数字矩形,这个矩形平铺后,就是一串数字。把这个叫做点阵字符串。同样,我们也可以将这串数字进行转化,将二进制转成十六进制,然后按照像素值的转换方式进行二次转化,尽量缩短长度,这样以后对比的时候,运算量小。
字库,可以想象一个表格,第一列里面存的是字,第二列存的是对应的点阵字符串。当我们获取了一个点阵字符串,就来这个表格里面比对。如果有一模一样的,就获取到了这个汉字。如果没有一模一样的,就采用模糊度对比,看与哪个最接近。精确对比很容易,没的说。模糊度对比的话,有很多优化算法,也说不尽。
对比度也可以被叫做模糊度,主要有两个方面。一个是像素值的模糊程度。用黑色举个例子:墨水是黑色的,但是分“很黑”和“有点黑”。标准黑的像素值是(0,0,0),像素(0,0,1)和(1,1,1)离标准黑都有一定的差距,差距越小,颜色就越接近。对于图片,绝大部分的像素值是接近而不统一的,需要设置一个容错值,来获取这些很接近的像素。第二个模糊度指的是点阵字符串的相似程度。在获得点阵字符串之后,要去字库进行对比,如果找不到精确的,就要找相似的。这里需要设置一个最低的相似值,比如0.7.如果字库没有哪个字与这个点阵串的相似度超过0.7.你就需要考虑把这个点阵串添加到字库里面。这种方式,其实也就是人工智能的数据喂养,喂养的时间越长,库越丰富,能找到的几率也就越大,找的也就越准确。
当你的字库比较小的时候(数量小或者点阵串长度小),找起来自然很快,例如word文档上的小字,一般是2020或1717的像素,转化成点阵串的长度也就十几位,运算起来就很快。如果比较大,例如一些验证码里面的文字,像素达到200200,找起来就会比较慢,介绍一种建立索引的方法。分两步,我们假设一个5000字的字库,每个字库的点阵串长度为5万.一个长度为5万左右的点阵串“X”进来找字,每一个字需要对比5万次。最差的情况全部对比完需要2亿5千万次。这个运算量非常大,也完全没必要。第一步,我们建立头部索引,在字库的每个汉字对应的点阵串中,截取前100个有效字符,作为头信息,保存在库中。当X进来的时候,我们同样截取前100个有效字符,与头信息进行对比,远算量为100次。如果相似度低于0.7,直接跳过对比下一个汉字。第二步,在每个汉字的点阵串中,分别在5个位置(比如6千,1万,2万3,3万5,4万1)抽取长度为100的有效字符,拼合成一个新的字符串,保存在库中。如果X过了第一步,头部信息相似度超过0.7,那么在X的相同位置截取相同长度的字符串,进行拼合,并且对比。运算次数为500次。如果相似度超过0.7.再进行全部的对比。这样,能够很大程度的减少运算量。还有一种,四角判断法,步骤复杂,但是效果超级好。谷歌上有,可以去查。
基本上,这种图文识别的方法,只要字库建立正确,在像素值很接近的程度下,准确度能到95%以上,如果像素相差大,字的笔画残缺,能达到80%以上。但是对不同的字体,不同的大小。要么建立不一样的字库,要么需要各种偏离算法来纠正。幸运的是,对于同一款软件,字体和大小基本是固定的。感兴趣的可以试试看。
PS:实际上,我觉得词库比字库好用,词库的建立虽然比字库麻烦,但是无论是精确匹配还是各种偏移算法,效果都好得多。****
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。