paip.手写OCR识别方法总结--基于验证码识别
paip.手写OCR识别方法总结--基于验证码识别... 1
前言
很多情况下,我们需要手写识别文字处理…对于印刷体我们可以用OCR来解决..
但对于手写体的识别。则效果不佳。即使有训练功能的OCR。。
而验证码的识别技术则很大程序上与手写OCR识别相同
需要达到的技术指标
识别文字: 英文手写体(正规大写),数字,标点
字号限制:可以适当限制普通字号
识别时间:机器方式1秒, 人工打码 10秒左右..
识别率: 需要达到99%左右
书写纸张:普通纸张,最好有格式线,可以限定行的位置.。纸颜色为白色
书写工具:普通笔
图片来源:最好扫描仪
文字颜色:常用的兰色或者黑色
书写时的注意事项:全部大写,尽可能正规书写..标点符号写在中间,要醒目..单词间的间隔适当多一些空白..以利于识别
版面分析与分行
分行可以使用指定TOP和HEIGHT来人工做模块进行分行,以简化操作
分词截取图片
由于是基于验证码进行手写体的识别,所以必须进行分词来识别,否则过长无法识别..
去色--灰度处理
将文字图片去色(将彩色转换为灰度)去色是为了进一步做成黑白双色图片。
C# code
Color c = sourcebm.GetPixel(x、y); int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);//转换灰度的算法 sourcebm.SetPixel(x、y、Color.FromArgb(luma、luma、luma));
去噪点
将周边噪点去除…然后文字周围的离散的点去除..
去杂色,转换为黑白图片
从灰度图片中可以看出,数字的颜色比较深,而杂色都是比较浅,所以可以设定一个临界颜色值,颜色高于或等于这个值的设置为白色,低于这个值的设置为黑色。
C# code
Color c = sourcebm.GetPixel(x、y); if (c.R >= critical_value) sourcebm.SetPixel(x、y、Color.FromArgb(255、255、255));
C# code
else sourcebm.SetPixel(x、y、Color.FromArgb(0、0、0));
分割图片
书写的时候尽可能每个字母宽度一致,字母间要有空白..以利于切割单个字母图片
得到每个字符的特征码
在每个字符的边界内,检测每个像素,如果象素为白色则为「0」,如果象素为黑色则为「1」,将「0」「1」连起来就是该数字或字符的特征码。
C# code
Color c = sourcebm.GetPixel(x、y); if (c.R == 0) str = str + "1"; else str = str + "0";
进行字母特征码匹配与单词拼写检查
特征码与库的进行匹配。。可以使用字串匹配算法进行匹配。。
然后再结合单词字典进行拼写检查…从而得出最佳匹配字符..
Deathbycaptcha人工打码
Deathbycaptcha提供的验证码服务可以来用识别手写文字..95%的识别率,结合字典进行拼写检查,应该可以达到99%的识别率.. 好向不能识别标点符号..
不过唯一的缺点是成本。。识别一个单词大约需要1分钱。..一篇文章识别下来估计就要一百块了,成本太高了..
GOOGLE reCAPTCHA社会化工程
GOOGLE reCAPTCHA比较好.。。可以大规模实施降低成本…
参考
【转】C#识别验证码—百度空间
天涯博客里的评论验证码为例,说明验证码识别的基本思路和方法: