KNN算法实战:验证码的识别

28 sec read

识别验证码的方式很多,如tesseract、SVM等。前面的几篇文章介绍了KNN算法,今天主要学习的是如何使用KNN进行验证码的识别。

数据准备

本次实验采用的是CSDN的验证码做演练,相关的接口:https://download.csdn.net/index.php/rest/tools/validcode/source_ip_validate/10.5711163911089325

目前接口返回的验证码共2种:

  •   纯数字、干扰小的验证码,简单进行图片去除背景、二值化和阈值处理后,使用kNN算法即可识别。
  •  字母加数字、背景有干扰、图形字符位置有轻微变形,进行图片去除背景、二值化和阈值处理后,使用kNN算法识别

这里选择第二种进行破解。由于两种验证码的图片大小不一样,所以可以使用图片大小来判断哪个是第一种验证码,哪个是第二种验证码。

下载验证码

分割字符

下载过后,就需要对字母进行分割。分割字符还是一件比较麻烦的工作。

灰度化

将彩色的图片转化为灰度图片,便于后面的二值化处理,示例代码:

处理前:

处理后:

二值化

灰度化以后,有颜色的像素点为0-255之间的值。二值化就是将大于某个值的像素点都修改为255,小于该值的修改为0,示例代码:

二值化输出的结果:

去除边框

从二值化输出的结果可以看到除了字符,还存在边框,在切割字符前还需要先将边框去除。

字符切割

由于字符与字符间没有存在连接,可以使用比较简单的“投影法”进行字符的切割。原理就是将二值化后的图片先在垂直方向进行投影,根据投影后的极值来判断分割边界。分割后的小图片再在水平方向进行投影。

代码实现:

整体代码

数据集准备

在完成图像切割后,需要做将切分的字母建立由标签的样本。即将切分后的字符梳理到正确的分类中。比较常见的方式是人工梳理。

由于图像比较多,这里使用使用Tesseract-OCR进行识别。

官方项目地址:https://github.com/tesseract-ocr/tesseract

Windows安装包地址:https://github.com/UB-Mannheim/tesseract/wiki

Tesseract-OCR的安装

下载完安装包后,直接运行安装即可,比较重要的是环境变量的设置。

  • 将安装目录(D:\Program Files (x86)\Tesseract-OCR)添加进PATH
  • 新建TESSDATA_PREFIX系统变量,值为tessdata 文件夹的路径(D:\Program Files (x86)\Tesseract-OCR\tessdata)
  • 安装Python包pytesseract(pip install pytesseract)

Tesseract-OCR的使用

使用起来非常的简单,代码如下:

由于Tesseract-OCR识别的准确率非常的低,完全不能使用,放弃~,还是需要手工整理。

图片尺寸统一

在完成人工处理后,发现切割后的图片大小不一。在字符识别前需要对图片进行的尺寸进行统一。

具体实现方法:

使用cv2.resize时,参数输入是 宽×高×通道,这里使用的时单通道的,interpolation的选项有:

  • INTER_NEAREST 最近邻插值
  • INTER_LINEAR 双线性插值(默认设置)
  • INTER_AREA 使用像素区域关系进行重采样。 它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。 但是当图像缩放时,它类似于INTER_NEAREST方法。
  • INTER_CUBIC 4×4像素邻域的双三次插值
  • INTER_LANCZOS4 8×8像素邻域的Lanczos插值

另外为了让数据更加便于利用,可以将图片再进行二值化的归一。具体代码如下:

归一化的类型,可以有以下的取值:

  • NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
  • NORM_INF:此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)
  • NORM_L1 :  归一化数组的L1-范数(绝对值的和)
  • NORM_L2: 归一化数组的(欧几里德)L2-范数

字符识别

字符图片 宽6个像素,高10个像素 ,理论上可以最简单粗暴地可以定义出60个特征:60个像素点上面的像素值。但是显然这样高维度必然会造成过大的计算量,可以适当的降维。比如:

  • 每行上黑色像素的个数,可以得到10个特征
  • 每列上黑色像素的个数,可以得到6个特征

这里直接使用了sklearn中的KNN方法,如需了解更多见:使用 Scikit-learn 进行 KNN 分类

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

使用GridSearchCV进行网格搜索

GridSearchCV简介 在机器学习模型中,需要人工选择的参数称为超参数。比如随机森林中决策树的个数,人工
49 sec read

PageRank算法学习与研究

什么是PageRank PageRank,简称PR,是Google排名运算法则(排名公式)的一部分,是Goog
2 min read

多经纬度坐标的中心点计算方法

在实际的应用场景,通常会遇到计算多个经纬度中心的需求。而在计算经纬度中心点通常有三种方式,每种方式对应不同的需
1 min read

发表评论

电子邮件地址不会被公开。 必填项已用*标注