python 验证码提取自动登录 黑白图片转换

来源:互联网 发布:多益网络论坛注册 编辑:程序博客网 时间:2024/04/30 08:30

我遇到的图片是黑底白色字符外加各种不同颜色的像素点,为了更好测试多多上次几张

如下图所示:

     


引用的头文件:

# 以下为图像识别引用import Image,ImageEnhance,ImageFilterimport sysfrom PIL import Imagefrom pytesser import *


经过在网上多次搜索和查询,以及自己的测试,发现 直接对这样的图片,经过这种处理后

im=im.convert('1')

并不能完全很好的得到图片中的验证码字符

code=image_to_string(img)


而且这函数貌似对白底黑色处理比较好.

所以,我要对图片处理成白底黑字的方式

网上搜索了一圈,并没有现成的代码可供参考.

对于这样的图片处理,大概思路就是:

使用黑色填充白色,使用白色填充非白色

所以在将图片处理称灰色后,将图片进行反白:

def InverseWhite(img):w,h=img.sizedata=list(img.getdata())for x in range(w):for y in range(h):#img.putpixel((x,y),255-data[y*w+x])if data[y*w+x]!=255:#255是白色 0是黑色img.putpixel((x,y),0)else:img.putpixel((x,y),255)return img

这样修改后的图片基本不需要继续处理,可以直接匹配里面的代码了.

所以全部代码差不多就是这样

由于这类验证码都只是简单的纯数字型的,而且都是固定的4位,使用python的匹配是会出现字母以及特殊字符的

所以需要对这类图片获得的验证码进行一些处理,经过多次的验证,我得到了一下替换方案:

rep={'O':'0','()':'0','<)':'0','@':'0','I':'1','L':'1','i':'1','f':'1','l':'1','/':'1','\\':'1','Z':'2','z':'2','$':'3','A':'4','a':'4','\'S':'5',';':'7','S':'8','s':'8','%':'8','P':'','p':'','-':'','*':'',',':'','(?':'0'};


得到后的验证码需要进行一些替换:

主要应用为

code=image_to_string(img)text=codefor r in rep:text=text.replace(r,rep[r])


综上所得到的全部代码如下

#!/usr/bin/python # -*- coding: utf-8 -*-import Image,ImageEnhance,ImageFilterimport sysfrom PIL import Imagefrom pytesser import *# 黑白反色,白色替换# 此处N直接为255# 小于N的 被替换成黑色# 大于等于N的 被替换成白色def InverseWhite(img):w,h=img.sizedata=list(img.getdata())for x in range(w):for y in range(h):if data[y*w+x]!=255:#255是白色 0是黑色img.putpixel((x,y),0)else:img.putpixel((x,y),255)return imgrep={'O':'0','()':'0','<)':'0','@':'0','I':'1','L':'1','i':'1','f':'1','l':'1','/':'1','\\':'1','Z':'2','z':'2','$':'3','A':'4','a':'4','\'S':'5',';':'7','S':'8','s':'8','%':'8','P':'','p':'','-':'','*':'',',':'','(?':'0'};if __name__=='__main__':image_name = u"image\\"#这个自己修改,我的测试图片都保存在这里,而且都是从1.png到n.png的形式for i in range(1,20):im = Image.open(image_name+"%s.png"%(i))im=im.convert('1')#反白 转换成白底黑字img=InverseWhite(im)im.save(u"%s.jpg"%(i))code=image_to_string(img)text=codefor r in rep:text=text.replace(r,rep[r])print "[+]:%s:%s---->%s"%(i,code,text)



需要这里提一下的是,上面的代码针对这样的图片并不是能够完全100%的匹配到验证码.

但是这对于模拟登录并不是难题,匹配不到一个可以重新换一个匹配,经过我自己的测试一般3-5次就能成功登录.

希望有碰到类似图片的处理的你有一些帮助



0 0