python脚本实现验证码识别

作者:y0nghum1ng 时间:2022-02-03 09:41:30 

最近在折腾验证码识别。最终的脚本的识别率在92%左右,9000张验证码大概能识别出八千三四百张左右。好吧,其实是验证码太简单。下面就是要识别的验证码。

python脚本实现验证码识别 python脚本实现验证码识别

我主要用的是Python中的PIL库。

首先进行二值化处理。由于图片中的噪点颜色比较浅,所以可以设定一个阈值直接过滤掉。这里我设置的阈值是150,像素大于150的赋值为1,小于的赋为0.


def set_table(a):
 table = []    
 for i in range(256):
   if i < a:
     table.append(0)
   else:
     table.append(1)
 return table

img = Image.open("D:/python/单个字体/A"+str(i)+".jpg")
pix = img.load()

#将图片进行灰度化处理
img1 = img.convert('L')

#阈值为150,参数为1,将图片进行二值化处理
img2 = img1.point(set_table(150),'1')

处理后的图片如下。

python脚本实现验证码识别

阈值不同产生的不同效果:

python脚本实现验证码识别

接下来对图片进行分割。遍历图片中所有像素点,计算每一列像素为0的点的个数(jd)。对于相邻两列,若其中一列jd=0,而另一列jd!=0,则可以认为这一列是验证码中字符边界,由此对验证码进行分割。这样分割能达到比较好的效果,分割后得到的字符图片几乎能与模板完全相同。


(Width,Height) = img2.size
pix2 = img2.load()
x0 = []
y0 = []

for x in range(1,Width):
 jd = 0
 # print x
 for y in range(1,Height):
   # print y
   if pix2[x,y] == 0:
     jd+=1
 y0.append(jd)
 if jd > 0:
   x0.append(x)

#分别对各个字符边界进行判断,这里只举出一个    
for a in range(1,Width):
 if (y0[a] != 0)&(y0[a+1] != 0):
   sta1 = a+1
   break

分割完成后,对于识别,目前有几种方法。可以遍历图片的每一个像素点,获取像素值,得到一个字符串,将该字符串与模板的字符串进行比较,计算汉明距离或者编辑距离(即两个字符串的差异度),可用Python-Levenshtein库来实现。

我采用的是比较特征向量来进行识别的。首先设定了4个竖直特征向量,分别计算第0、2、4、6列每一列像素值为0的点的个数,与模板进行比较,若小于阈值则认为该字符与模板相同。为了提高识别率,如果通过竖直特征向量未能识别成功,引入水平特征向量继续识别,原理与竖直特征向量相同。

另外,还可以通过局部特征进行识别。这对于加入了旋转干扰的验证码有很好效果。由于我写的脚本识别率已经达到了要求,所以并没有用到这个。

最后的结果是这样的:

python脚本实现验证码识别

最终在模板库只有25条的情况下,识别率在92%左右(总共测试了一万六千张验证码)。好吧,只能说验证码太简单。

来源:https://blog.csdn.net/y0nghum1ng/article/details/45171125

标签:python,验证码,识别
0
投稿

猜你喜欢

  • python自动化测试之如何解析excel文件

    2022-08-28 08:24:36
  • 用python实现批量重命名文件的代码

    2023-01-02 09:09:20
  • 一文带你了解Python中的输入与输出

    2023-11-26 12:05:24
  • Python使用cn2an实现中文数字与阿拉伯数字的相互转换

    2021-07-28 23:33:51
  • OpenCV+python手势识别框架和实例讲解

    2021-09-06 19:47:43
  • SQL Server中如何优化磁带备份设备性能

    2009-01-07 14:23:00
  • Mysql的MERGE存储引擎详解

    2024-01-25 22:26:49
  • python中dir函数用法分析

    2023-09-05 10:23:09
  • 新浪微博文字渐隐效果

    2011-04-29 12:33:00
  • Python 实现Mac 屏幕截图详解

    2021-06-16 13:43:52
  • Python Matplotlib条形图之垂直条形图和水平条形图详解

    2022-07-24 04:07:45
  • SQL Server中如何快速获取表的记录总数

    2008-12-05 15:59:00
  • python中Lambda表达式详解

    2021-12-06 22:40:26
  • python爬虫_实现校园网自动重连脚本的教程

    2021-10-12 22:56:37
  • 详解Python_shutil模块

    2023-06-24 00:32:19
  • python pygame实现五子棋小游戏

    2021-10-31 13:39:23
  • 实例讲解python函数式编程

    2022-10-30 22:14:35
  • python tornado使用流生成图片的例子

    2023-08-24 07:07:20
  • python向企业微信发送文字和图片消息的示例

    2021-09-18 15:42:08
  • 浅谈Python中的生成器和迭代器

    2023-04-08 02:23:46
  • asp之家 网络编程 m.aspxhome.com