(机器视觉]使用python自动识别验证码详解

  

前言   

验证码全称的全自动区分计算机和人类的图灵测试,即全自动区分人机的图灵测试。这也是验证码诞生的主要任务。但是随着近年来大数据运算和机器视觉的发展,用机器视觉识别图像已经变得非常容易,过去用于区分人机的验证码也开始变得不再安全。

  

接下来就让我们从零开始,深入图像处理和算法构建,来看看使用机器视觉来识别过时的验证码(如下所示)究竟可以有多简单。

  

[机器视觉]使用python自动识别验证码详解

  

载入需要的程序包,设置全局变量

        进口的要求   导入的时间   从io进口BytesIO   从公益诉讼导入图像   进口操作系统   进口numpy np      #获取验证码的网址   CAPT_URL=" http://xxxxxxxxxxxx.cn/servlet/ImageServlet "      #验证码的保存路径   CAPT_PATH=??   如果不是os.path.exists (CAPT_PATH):   os.mkdir (CAPT_PATH)      #将验证码转为灰度图时用到的“查找表”   阈值=165   附近地区阈值+[1]=[0]* *(256 -阈值)   之前      

从网站获取验证码

  

capt_fetch()方法非常简单,我们直接从网站获取验证码,将其转换为图片对象,等待被训练和测试等环节调用。

        def capt_fetch ():   ”“”   从网站获取验证码,将验证码转为图像对象      :需要请求:进口请求   需要时间:导入时间   :需要BytesIO:从进口BytesIO io   :要求从公益诉讼形象:进口的形象      参数:   :返回上校:一个图像对象   ”“”   #从网站获取验证码   capt_raw=requests.get (CAPT_URL)      #将二进制的验证码图片写入IO流   f=BytesIO (capt_raw.content)      #将验证码转换为图片对象   上校=Image.open (f)      返回上校   之前      

保存验证码到本地

  
      <李>一个强大的机器学习模型,是离不开强大的训练集作支持的。这里我们也必须先有一个预先打好标签(预分类)的验证码图片集,才能开始训练模型。   <李> capt_download()方法就是我们用来建立训练图像集的方法。它会调用capt_fetch()方法,将获得的图像对象展示给用户,等待用户输入验证码中的字符,然后将图片命名为用户输入的字符存储起来。   <李>当然,为了避免文件名重复(比如获取到了两张字符完全相同的验证码),capt_download()方法将系统时间也加入到了文件名中。   
        def capt_download ():   ”“”   将图像类型的验证码对象保存到本地      :要求从公益诉讼形象:进口的形象   :需要操作系统:进口操作系统      :要求capt_fetch():从相关网站获取验证码   :需要CAPT_PATH:验证码保存路径      参数:   返回:   ”“”   上校=capt_fetch ()   capt.show ()      文本=raw_input(“请输入验证码中的字符:")   后缀=str (int (time.time () * 1 e3))      capt.save (CAPT_PATH +文字+“_”+后缀+ " . jpg ")   之前      

,图像预处理

  
      <李> capt_process()方法会先将验证码转为灰度图,然后再根据全局变量中定义的附近地区将灰度图转化为黑白图片。并按照验证码中四个字符所在的位置进行切割。   <李>从彩色图片到灰度图,再到黑白图,看似验证码中的信息损失了很多,实际上这样做的目的是为了使字符的特征更加明显。   <李>其实我们最终得到的黑白图像会有一些噪点存在,这主要是由于前景色与背景色不存在严格的区分度,我们可以使用滤波器过滤掉这些噪点,但少量的噪点会被训练模型当作误差处理,并不影响我们分类。至于过滤噪点的方法,我会专门写一篇帖子。   
        def capt_process (capt):   ”“”   图像预处理:将验证码图片转为二值型图片,按字符切割      :要求从公益诉讼形象:进口的形象   :需要附近地区:一个查找表,包含256个值      :param上校:验证码图像对象   :返回capt_per_char_list:一个数组包含四个元素,每个元素是一张包含单个字符的二值型图片   ”“”   capt_gray=capt.convert (“L”)   capt_bw=capt_gray。点(附近地区,“1”)      capt_per_char_list=[]   因为我在范围(4):   x=5 + i * 15   y=2   capt_per_char=capt_bw。作物(x + 15日,x, y, y + 18))   capt_per_char_list.append (capt_per_char)      返回capt_per_char_list   

(机器视觉]使用python自动识别验证码详解