字符串验证码的识别与破解
字符串验证码是指包含有一串数字或其它字符的一幅图片,图片里加上一些干扰项。字符串验证码的破解主要分为以下几步:图像分割,去除噪点,分割字符串,识别字符
step1:图像分割
将验证码的目标从背景中分离出来。图像阈值化分割是一种常见的分割算法,其基本原理是通过设定不同的特征阈值,把图像像素点分成若干个类。(图像二值化)
阈值分割算法:
- 分位数法
- 最大类间方差法二值化
- 最小误差阈值二值化
- 熵方法
- 最小偏态法
- 矩量保持法
step2:去除噪点
阈值二值化之后,有些验证码还有噪点,需要处理掉这些噪点。
去除噪点算法
去除孤立点(dotNeighbors一般设定5左右)
(1)遍历图片,当遇到黑色像素时,检查黑色像素周围8个联通区域的白色像素点的个数count。
(2)如果白色像素点的个数count>=阈值,则将黑色像素点改成白色像素点。1
2
3
4
5
6
7
8
9
10
11
12
13
14for w in range(p.Width):
for h in range(p.Height):
count = 0
if p.getpixel(w, h) == 0: # 黑白二值化后,黑色为0,白色为1
fow x in [-1, 0, 1]:
for y in [-1, 0, 1]:
# 如果是边界
if w+x<0 or h+y<0 or w+x>=p.Width or h+y>=p.Height:
count += 1
else:
if p.getpixel(w+x,h+y) == 1:
count += 1
if count>= dotNeighbors:
p.setpixel(w,h,255)膨胀与腐蚀
区域边界点是它的一个领域中既有对象点,又有背景点。内边界点是本点为对象点,但领域中有背景点。外边界点是本点为背景点,但领域中有对象点。内边界点与外边界点是紧挨在一起的两层像素,它们总和称为形态学边界。腐蚀运算是把区域的内边界点变成背景,使区域缩小一圈;膨胀运算是将区域的外边界变成对象点,使区域扩大一圈。腐蚀运算施行于对象像素,膨胀运算施行于背景像素。可以使用4联通或者8联通边界腐蚀去燥。
4联通边界
+ | ||
---|---|---|
+ | + | |
+ |
8连通边界
+ | + | + |
---|---|---|
+ | + | |
+ | + | + |
- 中值滤波
- 连通去噪
step3:分割字符串
字符串分割是是获得较高字符串识别率的条件之一。
分割字符串算法
(1)垂直投影字符分割算法
(2)上下边界投影法
(3)模板匹配字符分割算法
(4)聚类分析字符分割法
(5)联通切割法
(6)笔段组合法
(7)基于颜色空间的分割
step4:识别字符
knn算法