knn&parzen窗的验证码识别程序的实现

这是一个基于knn和parzen窗的简易的验证码识别程序,是我入门图像处理&模式识别这个领域写的第一个程序,主要是为了完成模式识别的作业。代码量不大只有一千行,涉及到图像的绘制,预处理,提取字符,提取简单的特征,以及两个基本的估计概率密度的方法:parzen窗和knn。在文章的最后,给出了代码的链接。这个
摘要由CSDN通过智能技术生成

1.写在前面

作为一个新入门图像处理&计算机视觉&模式识别领域的学生,我非常希望可以得到这样的一份代码来帮助我快速入门:该代码完成了一项具体的工作,代码长度在1000行左右,结构比较清楚,注释相对较全,适合新手阅读;并且在每个关键的函数上有说明该操作的名称(原理),以及应用在此场景的原因,最好能引出一些相关的其他应用。可能是我搜索水平有限,却始终没有如愿以偿,至今仍在入门的边缘摸爬滚打。最近模式识别课要实现K-Nearest Neighbor和parzen window两种算法,刚好借此机会,查阅了一些相关资料,做了一个验证码识别的小程序,大概有不到一千行。因为是一个入门2周的新手写的程序,程序大概前后写了一周,所以没有用到什么高深的算法,应该算是简单易懂,适合入门者了解一些基本的图像处理操作和这两个算法。前人栽树,后人乘凉,我希望把自己的曲折道路以及路上的探索都记录下来,以便后入门者可以少走弯路,从应用出发快速地入门这个领域。

2.综述

本程序包含以下5个部分:
1. 验证码生成:生成验证码,用于后续的生成训练集合测试集
2. 验证码预处理:对生成的验证码做预处理

3. 字符分割:分割出验证码的字符,并提取分割后的区域

4. 特征提取:对分割出来的字符提取特征,用于识别字符
5. 字符识别:用knn和parzen窗计算概率密度,对字符分类
代码中包含以下5个文件:
1. main.cpp : 程序的主体部分,顺序地执行生成训练集->生成parzen窗算法的参数->测试并且显示->测试正确率
2. generateCode.cpp : 生成验证码,生成训练集
3. codeProcess.cpp : 所有与图像处理相关的函数都在这个文件下面,包括预处理,图像分割,特征提取,字符识别等函数。
4. ml.cpp : 所有与机器学习相关的代码都在这个文件下面,包含knn,parzen窗,以及简易的直方图等估计概率密度的方法。
5. constant.h : 一些预处理的宏定义,一些参数的宏定义,以及一个结构体和宏定义操作

3.分步详解

3.1图像处理相关

3.1.1图像显示

如下图所示,整个结果图像会显示在一个这一个窗口之中,此窗口是一个三通道图:

整个图片由下面的Mat产生,所有的小图片(验证码,预处理结果,分割结果,识别结果,真实值)都是在mat中提取兴趣域,然后将图片复制到兴趣域上面显示的。

Mat Background(window_height, window_width, CV_8UC3, Scalar(192, 192, 192));
int n = 0;
其中n为循环的标志,从0开始,表示这是n+1个用于显示的测试样例。因为要提取较多的兴趣域,所以我将提取兴趣域用一个宏定义写出:
//创建一个兴趣区
#define ADDRIO(_dst,_image,_width,_n,_start) do{\
	_start += gap;\
	_dst=_image(Range(gap * ((_n)+2) + ((_n)+1)*code_height, ((_n) + 2)*(code_height + gap)), Range((_start), (_start) + (_width))); \
	_start += (_width);\
}while (0)
其中code_height,gap分别代表验证码的高度和显示列表的间隙,详见constant.h文件。
这段代码从Mat _image中提取一个宽度为_width,高度为code_height的兴趣域,其中初始的高度为第n+1层的高度,初始的左边缘为_start,并将感兴趣域赋给_dst;

以makeTitle为例讲一下这个图片的具体构造,下面的显示验证码部分的原理相同。
void makeTitle(Mat& Background){
	int start = 0;
	Mat rio1, rio2, rio3, rio4,rio5;//创建五个兴趣域
	ADDRIO(rio1, Background, code_width, -1, start);
	putText(rio1, "CodeImage", Point2d(0, 4 * code_height / 5), 4,
		0.7, Scalar(0, 0, 0), 1, 8);
	ADDRIO(
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值