python脚本实现验证码识别

 更新时间:2018年06月07日 10:46:25   作者:y0nghum1ng  
这篇文章主要为大家详细介绍了python脚本实现验证码识别的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

我主要用的是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') 

处理后的图片如下。

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

接下来对图片进行分割。遍历图片中所有像素点,计算每一列像素为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的点的个数,与模板进行比较,若小于阈值则认为该字符与模板相同。为了提高识别率,如果通过竖直特征向量未能识别成功,引入水平特征向量继续识别,原理与竖直特征向量相同。

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

最后的结果是这样的:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 解决Python 进程池Pool中一些坑

    解决Python 进程池Pool中一些坑

    这篇文章主要介绍了解决Python 进程池Pool中一些坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • pandas使用dtype/dtypes修改数据类型

    pandas使用dtype/dtypes修改数据类型

    在数据处理和分析中,经常需要对数据进行类型转换以满足特定的需求,本文主要介绍了pandas使用dtype/dtypes修改数据类型,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • python简单猜数游戏实例

    python简单猜数游戏实例

    这篇文章主要介绍了python简单猜数游戏,涉及Python随机数及流程控制的相关技巧,需要的朋友可以参考下
    2015-07-07
  • 浅析Python中的join()方法的使用

    浅析Python中的join()方法的使用

    这篇文章主要介绍了Python中的join()方法的使用,是Python入门中的基础知识,需要的朋友可以参考下
    2015-05-05
  • python 生成器和迭代器的原理解析

    python 生成器和迭代器的原理解析

    这篇文章主要介绍了python 生成器和迭代器的原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • python3将变量输入的简单实例

    python3将变量输入的简单实例

    在本篇文章里小编给大家整理的是一篇关于python3将变量输入的简单实例内容,有需要的朋友们可以参考下。
    2020-08-08
  • python空元组在all中返回结果详解

    python空元组在all中返回结果详解

    在本篇文章里小编给大家整理的是一篇关于python空元组在all中返回结果详解内容,有需要的朋友们可以学习参考下。
    2020-12-12
  • Python 常用模块threading和Thread模块之线程池

    Python 常用模块threading和Thread模块之线程池

    这篇文章主要介绍了Python threading和Thread模块之线程池,线程池如消费者,负责接收任务,并将任务分配到一个空闲的线程中去执行。并不关心是哪一个线程执行的这个任务,具体介绍需要的小伙伴可以参考下面文章详细内容
    2022-06-06
  • 解决python报错:AttributeError: 'ImageDraw' object has no attribute 'textbbox'

    解决python报错:AttributeError: 'ImageDraw' object h

    这篇文章主要给大家介绍了关于解决python报错:AttributeError: 'ImageDraw' object has no attribute 'textbbox'的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Python使用Bokeh实现交互式图表的创建

    Python使用Bokeh实现交互式图表的创建

    Bokeh 是一个流行的 Python 数据可视化库,可以生成高质量的交互式图表,这篇文章主要就介绍了Python如何使用Bokeh实现交互式图表的创建,需要的可以参考一下
    2023-06-06

最新评论