前言
验证码全称的全自动区分计算机和人类的图灵测试,即全自动区分人机的图灵测试。这也是验证码诞生的主要任务。但是随着近年来大数据运算和机器视觉的发展,用机器视觉识别图像已经变得非常容易,过去用于区分人机的验证码也开始变得不再安全。
接下来就让我们从零开始,深入图像处理和算法构建,来看看使用机器视觉来识别过时的验证码(如下所示)究竟可以有多简单。
载入需要的程序包,设置全局变量
进口的要求 导入的时间 从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自动识别验证码详解