字符串验证码的识别与破解

  字符串验证码是指包含有一串数字或其它字符的一幅图片,图片里加上一些干扰项。字符串验证码的破解主要分为以下几步:图像分割去除噪点分割字符串识别字符

step1:图像分割

  将验证码的目标从背景中分离出来。图像阈值化分割是一种常见的分割算法,其基本原理是通过设定不同的特征阈值,把图像像素点分成若干个类。(图像二值化)
  阈值分割算法:

  • 分位数法
  • 最大类间方差法二值化
  • 最小误差阈值二值化
  • 熵方法
  • 最小偏态法
  • 矩量保持法
step2:去除噪点

  阈值二值化之后,有些验证码还有噪点,需要处理掉这些噪点。
  去除噪点算法

  • 去除孤立点(dotNeighbors一般设定5左右)
    (1)遍历图片,当遇到黑色像素时,检查黑色像素周围8个联通区域的白色像素点的个数count。
    (2)如果白色像素点的个数count>=阈值,则将黑色像素点改成白色像素点。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for 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算法