四联光电智能照明论坛

标题: 验证码识别实践:自己动手C#实现 [打印本页]

作者: admin    时间: 2016-11-3 09:32
标题: 验证码识别实践:自己动手C#实现
原文地址:
http://blog.csdn.net/stevenkylelee/article/details/8263890

http://blog.csdn.net/stevenkylelee/article/details/8270069
http://blog.csdn.net/stevenkylelee/article/details/8308772

验证码的识别。最主要有2大步骤。
1.字符的分割
2.字符的分类

字符的分割,其实是一个广义概念。
我最初以为把字符所在的那个子图给“抠”出来,就算是分割了。
其实不然,分割有:阈值分割,自适应阈值分割,提取连通分量,查找轮廓等
这些操作都最终都围绕着把字符的“形状”信息给提取出来的目的
阈值分割是让图像的信息减少,从而使后续操作简单。
(只处理二值图像当然简单了)
有些分割,会直接用到彩色图像。比如:字符具有某种颜色,
那么,就提取这种颜色的位置连通分量。

字符分类的话。就是把字符信息作为某种算法(或者称为分类器)的输入
然后,返回出这个形状属于那种分类(字符)

我做的这个识别程序,主要流程如下:
1.图像预处理。
2.字符分割
3.对分割后的信息提取特征
4.用特征和样本进行匹配

1.图像预处理。
我的图像预处理,就是二值化图像。
然后,统计一下,白色和黑色的比例。决定是否反转图像的颜色。
为什么要反转图像颜色呢。因为,有些验证码的字符的颜色是浅色背景是深色,
而有些是字符深色背景浅色。为了使后续的操作简单。
把它们都统一处理成字符黑色背景白色。
我的处理是,对于整个图像,如果黑色比例比白色多
那么,就认为黑色是背景。对整个图像进行颜色反转。

2.字符分割
字符的分割,我用的是提取连通分量的做法。
连通分量(Connected Component)是图论上的说法,
好像到了图像处理的书,一般都叫连通区域(Connected Region)
(这2个说法都是等价的吧?呵呵,我不知道,期待你来回答我)
提取连通分量的实现一般都是 DFS(深度优先搜索)算法啦。
我写的算法用的是8邻域连通,
把纯黑色的像素都提取出来。
(实际上有一个回调函数,可以在算法外部决定提取什么颜色)
返回的是这些像素的点的坐标。
(有坐标就足够了,已经能够表达形状了,这一步后,根本不需要字符的颜色信息)
数据结构如下:List<Point> Region ;

3.对分割后的信息提取特征
提取到连通分量后,就可以计算特征了。
特征计算目的就是把高维度的表示降成低维度的表示。
我的理解,就是说,“去掉很多细节表示,只留下个大概模糊的轮廓描述”
特征提取,方法很多。比如:矩(Moment)
因为我水平有限。!- -
So,这里使用的是一种简单的“N*M比例特征法“
就是把连通分量按照每个点的几何位置信息先套上一个最小包围矩形
然后,把这个矩形分割为N行M列的小格子。
再然后,把连通分量的点按照位置信息归类进对应的小格子中。
最后,计算小格子中的点的数量与小格子的面积的比值。
每个小格子最后对应一个标量。
我是5*5切分,所以,最后25个标量,
组成一个25维的向量作为一个连通分量的特征。

4.用特征和样本进行匹配
最后一步,分类。也就是识别。
分类器搞到很复杂的有什么:支持向量机,人工神经网络 等
同样是水平有限,这里,我实现了最简单的分类:最近邻法
最近邻法就是说,把要匹配的特征和样本库中的所有样本特征进行计算
取欧氏距离最短的那个样本的类别作为输出



作者: admin    时间: 2016-11-3 09:32
http://blog.csdn.net/dr_guo/article/details/51340104
作者: Xiaoxue    时间: 2016-11-3 09:35
http://blog.csdn.net/firehood_/article/details/8433077
作者: Xiaoxue    时间: 2016-11-3 09:36
http://www.cnblogs.com/neutra/archive/2012/02/26/2368358.html

验证码识别思路
作者: Xiaoxue    时间: 2016-11-3 09:44
验证码识别(Tess4J初体验)

http://blog.csdn.net/dr_guo/article/details/51340104




欢迎光临 四联光电智能照明论坛 (http://5xhome.com/) Powered by Discuz! X3.2