- 浏览: 20427 次
最新评论
使用Python进行验证码识别
2010年06月14日
很多网站都会使用验证码来防止机器攻击
例如刷人气或者别的,这里转了一篇文章,使用python来识别图片数字验证的,以下部分都是转来的。
这几天在写一个程序的时候需要识别验证码,因为程序是Python写的自然打算用Python进行验证码的识别。
以前没用Python处理过图像,不太了解PIL(Python Image Library)的用法,这几天看了看PIL,发现它太强大了,简直和ImageMagic,PS可以相比了。(这里有PIL不错的文档)
由于上面的验证码是24位的jpeg图像,并且包含了噪点,所以我们要做的就是去噪和去色,我拿PS找了张验证码试了试,使用PS滤镜中的去噪效果还行,但是没有在PIL找到去噪的函数,后来发现中值过滤后可以去掉大部分的噪点,而且PIL里有现成的函数,接下来我试着直接把图像转换为单色,结果发现还是会有不过的噪点留了下来,因为中值过滤时把不少噪点淡化了,但转换为音色时这些噪点又被强化显示了,于是在中值过滤后对图像亮度进行加强处理,然后再转换为单色,这样验证码图片就变得比较容易识别了:
上面这些处理使用Python才几行:
PYTHON:
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.show()
接下来就是提取这些数字的字模,使用shell脚本下载100幅图片,抽出三张图片获取字模:
PYTHON:
#!/usr/bin/env python
#encoding=utf-8
import Image,ImageEnhance,ImageFilter
import sys
image_name = "./images/81.jpeg"
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
#im.show()
#all by pixel
s = 12 #start postion of first number
w = 10 #width of each number
h = 15 #end postion from top
t = 2 #start postion of top
im_new = []
#split four numbers in the picture
for i in range(4):
im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))
im_new.append(im1)
f = file("data.txt","a")
for k in range(4):
l = []
#im_new[k].show()
for i in range(13):
for j in range(10):
if (im_new[k].getpixel((j,i)) == 255):
l.append(0)
else:
l.append(1)
f.write("l=[")
n = 0
for i in l:
if (n%10==0):
f.write("\n")
f.write(str(i)+",")
n+=1
f.write("]\n")
把字模保存为list,用于接下来的匹配;
提取完字模后剩下来的就是对需要处理的图片进行与数据库中的字模进行匹配了,基本的思路就是看相应点的重合率,但是由于噪点的影响在对(6,8)(8,3)(5,9)的匹配时容易出错,俺自己针对已有的100幅图片数据采集进行分析,采用了双向匹配(图片与字模分别作为基点),做了半天的测试终于可以实现100%的识别率。
PYTHON:
#!/usr/bin/env python
#encoding=utf-8
import Image,ImageEnhance,ImageFilter
import Data
DEBUG = False
def d_print(*msg):
global DEBUG
if DEBUG:
for i in msg:
print i,
else:
pass
def Get_Num(l=[]):
min1 = []
min2 = []
for n in Data.N:
count1=count2=count3=count4=0
if (len(l) != len(n)):
print "Wrong pic"
exit()
for i in range(len(l)):
if (l == 1):
count1+=1
if (n == 1):
count2+=1
for i in range(len(l)):
if (n == 1):
count3+=1
if (l == 1):
count4+=1
d_print(count1,count2,count3,count4)
min1.append(count1-count2)
min2.append(count3-count4)
d_print(min1,"\n",min2)
for i in range(10):
if (min1 <= 2 or min2 <= 2):
if ((abs(min1 - min2)) <10):
return i
for i in range(10):
if (min1 <= 4 or min2 <= 4):
if (abs(min1 - min2) <= 2):
return i
for i in range(10):
flag = False
if (min1 <= 3 or min2 <= 3):
for j in range(10):
if (j != i and (min1[j] <5 or min2[j] <5)):
flag = True
else:
pass
if (not flag):
return i
for i in range(10):
if (min1 <= 5 or min2 <= 5):
if (abs(min1 - min2) <= 10):
return i
for i in range(10):
if (min1 <= 10 or min2 <= 10):
if (abs(min1 - min2) <= 3):
return i
#end of function Get_Num
def Pic_Reg(image_name=None):
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.show()
#all by pixel
s = 12 #start postion of first number
w = 10 #width of each number
h = 15 #end postion from top
t = 2 #start postion of top
im_new = []
#split four numbers in the picture
for i in range(4):
im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))
im_new.append(im1)
s = ""
for k in range(4):
l = []
#im_new[k].show()
for i in range(13):
for j in range(10):
if (im_new[k].getpixel((j,i)) == 255):
l.append(0)
else:
l.append(1)
s+=str(Get_Num(l))
return s
print Pic_Reg("./images/22.jpeg")
这里再提一下验证码识别的基本方法:截图,二值化、中值滤波去噪、分割、紧缩重排(让高矮统一)、字库特征匹配识别。
这里只是针对一般的验证码,高级验证码的识别这里有篇不错的文章,太复杂的话涉及的东西就多了,那俺就没兴趣了,人工智能(好恐怖),俺只喜欢简单的东西。
本文来源于可可熊的窝 http://cocobear.info/blog , 原文地址: http://cocobear.info/blog/2008/08/04/python-pic-recognize/
发表评论
-
Mvvm Light Toolkit for wpf/silverlight系列之数据绑定
2012-01-20 02:01 1294Mvvm Light Toolkit for wpf/silv ... -
君正4750开发板使用日记6-UCOS(minios)的开发配置试验
2012-01-20 02:01 1869君正4750开发板使用日记 ... -
Ipmsg
2012-01-20 02:01 724Ipmsg 2010年12月22日 ipmsg全称:IP ... -
配置文件(Web.Config)加密解密详细说明
2012-01-20 02:01 1327配置文件(Web.Config)加密解密详细说明 2010年 ... -
三周学习总结
2012-01-20 02:01 584三周学习总结 2010年06月28日 学习工作总结 ... -
下载安卓源代码过程
2012-01-19 09:49 892下载安卓源代码过程 2011年12月23日 linux和 ... -
OPENCV + PYTHON 安装进行时
2012-01-19 09:49 1636OPENCV + PYTHON 安装进行时 2011年06月 ... -
珍藏技术日志---windows下的Python环境搭建
2012-01-19 09:49 828珍藏技术日志---windows下的Python环境搭建 2 ... -
用Python 下载网页
2012-01-19 09:49 799用Python 下载网页 2011年01月05日 因为需 ... -
撼动IT界的10大编程语言
2012-01-17 02:22 664撼动IT界的10大编程语言 ... -
安装安卓虚拟机。XP亲测,win7请自行检验。
2012-01-17 02:22 1824安装安卓虚拟机。XP亲测,win7请自行检验。 2011年1 ... -
PKI作业之证书加密导入导出C#操作
2012-01-17 02:22 1172PKI作业之证书加密导入 ... -
淘宝JS压缩工具tbcompressor 2.4.2
2012-01-17 02:22 981淘宝JS压缩工具tbcompressor 2.4.2 201 ... -
QT--QSocketNotifier类介绍
2012-01-15 22:01 1606QT--QSocketNotifier类介绍 2011年12 ... -
AIX微码升级全过程
2012-01-15 22:01 692AIX微码升级全过程 2011年01月18日 首先是把微 ... -
PHP DDOS攻击的处理办法
2012-01-15 22:01 611PHP DDOS攻击的处理办法 ... -
手把手教你如何搭建PHP本地测试环境和MYSQL数据库的建立和使用
2012-01-15 22:01 967手把手教你如何搭建PHP ... -
centos 内核升级(2.6.18-194.el5升2.6.30)
2012-01-15 22:01 858centos 内核升级(2.6.18-194. ...
相关推荐
python2.7 验证码识别 库 可识别验证码图片
(一)python爬虫验证码识别(去除干扰线)https://blog.csdn.net/weixin_40267472/article/details/81384624
python验证码识别库,大家可以研究一下
验证码案例-从简单到复杂 可用于图像文字识别 Python验证码识别 MATLAB验证码识别均可用.rar
python识别字符验证码
基于python使用LibSVM实现验证码识别
网页旋转验证码识别 Python
识别验证码通常是这几个步骤: 1、灰度处理 2、二值化 3、去除边框(如果有的话) ... 用到的几个主要的python库: Pillow(python图像处理库)、OpenCV(高级图像处理库)、pytesseract(识别库)
将文件夹解压到 桌面 安装 python-3.6.5-amd64.exe 到 C:\Python36 拷贝 PIL pytesseract 文件夹 至 ...cd C:\Users\Admin\Desktop\Python简单验证码识别教程 执行 python test.py 可以看到结果 其他可 参考url.txt
python验证码识别源码,可应对网上大部分验证码,适合新手!
相应的,验证码识别大体可以分为下面几个步骤: 灰度处理 增加对比度(可选) 二值化 降噪 倾斜校正分割字符 建立训练库 识别 由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码...
首先贴一张验证码上来做案例: 第一步先通过二值化处理把干扰线去掉: from PIL import Image # 二值化处理 def two_value(): for i in range(1,5): # 打开文件夹中的图片 image=Image.open('./Img/'+str(i)+'....
毕业设计 - 题目:基于python的验证码识别 - 机器视觉 验证码识别(csdn)————程序
python 验证码图片识别源代码,适合学生课程设计、毕业设计参考资料。
关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL 3免责声明 本文研究所用素材来自于某旧Web框架的网站完全对外公开的公共图片资源。 本文只做了该网站对外公开的公共图片资源进行了爬取,并未越权做任何多余
用Python编写的一个登陆验证码识别,主要用于登录时输入的验证码,需要安装类库。
使用python+robot framework识别图片验证码 前提:安装PIL
Keras-master python基于BI-LSTM+CRF的中文命名实体识别 PytorchChinsesNER-pytorch-master Python_毕业设计基于Opencv的车牌识别系统VLPR-master python 基于torch进行验证码识别,识别率达94%captcha_identify....
自动识别验证码源码
python简单验证码识别的实现方法