粘连字符验证码的分割识别

0x00

机器识别验证码越来越普遍 现状就是某些网站为了安全而提高验证码的复杂度致使人眼也很难去分辨

目前的网上的验证码大致分为几类:

  1. 纯数字 or 纯字母
  2. 数字 + 字母
  3. 随机噪音背景 + 数字 + 字母
  4. 粘连字符 + 随机噪音背景 + 字体造型扭曲

前三类属于简单验证码 按照正常的二值化灰度处理图片 用python自带的库pytesseract就可以准确识别 识别率应该在90%以上 然而网上大多数的验证码都是这种 基本学校网站的验证码也都属于这类 (个人认为这类验证码完全没有必要采用机器学习…

0x01 图片灰度处理

这次试验的是CSDN家的验证码 首先介绍一下CSDN家的特点:

  • 字符不是单一的颜色 单个字符的每个像素点的颜色接近
  • 噪音背景
  • 部分粘连

复杂程度不算太难 但想提高识别率也要经过特殊处理

网上大部分的文章都是用PIL库自带的函数 Image.open(img).convert('L')
个人认为CSDN家的验证码不适合 这里我用的是提取每个像素点的亮度值HSL 再设置一个阈值(我设置的是127 小于127为黑 大于127为白

原图(经过放大后:

0x02 切割粘连部分图片

CSDN的字符属于角度正常 没有造成扭曲 难度降低了一下 原理很简单 只要循环全部像素点 找到黑色点连续长度大于单个字符平均长度 就是我们要的粘连部分


0x03 分割单一字符(大水滴惯性滴水算法

滴水算法的决定因素主要包括:起始点 移动规则以及方向的确定

  • (a)中n0表示当前的位置 水滴下一步位置由它左右两个像素点 下方三个像素点 这五个像素点共同决定
  • (b)中表示水滴下落规则

具体内容参考这里

ps:这段代码其实是按照一个java代码改的 = =






切割后的图片:

单个字符切割好了 剩下的就简单了 可以用pytesseract识别 识别率就已经很高了

S <=> 5 
6 <=> b
8 <=> B
Z <=> 2
O <=> 0
I <=> 1
g <=> 9
3 <=> E

部分混淆字符也可以用SVM模型 这篇文章说的很详细了-> 传送门

0x04

又到了每篇文章的废话烂尾部分(-в-)
这学期没有挂科 大学的选修课学分全部修完了 下学期平均一周两节课吧
每天很日常 也不是很开心 下半年也不知道何去何从 各位师傅的公司有没有愿意收留我的哈哈 shell也不在了 小姐姐又是自己一个人了 没有总结前一年展望新一年的习惯 说得好像写下那些计划就能一一去实现一样
网易云上周婕纶的歌单没有了 花海能循环一整晚 生化危机2月17号上映 妈的这么多年总算结束了 节奏大师突然更新了 一晚刷了70关_(┐「ε:) 不知道从什么时候开始 回家也很少和朋友出去聚了
还有三天就三十了 提前给你们拜年了 :)