如何利用Python 做验证码识别

如何利用Python 做验证码识别,第1张

用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章。我大体看了一下,主要方法有几类:一类是通过对进行处理,然后利用字库特征匹配的方法,一类是处理后建立字符对应字典,还有一类是直接利用ocr模块进行识别。不管是用什么方法,都需要首先对进行处理,于是试着对下面的验证码进行分析。

一、处理

这个验证码中主要的影响因素是中间的曲线,首先考虑去掉中的曲线。考虑了两种算法:

第一种是首先取到曲线头的位置,即x=0时,黑点的位置。然后向后移动x的取值,观察每个x下黑点的位置,判断前后两个相邻黑点之间的距离,如果距离在一定范围内,可以基本判断该点是曲线上的点,最后将曲线上的点全部绘成白色。试了一下这种方法,结果得到的效果很一般,曲线不能完全去除,而且容量将字符的线条去除。

第二种考虑用单位面积内点的密度来进行计算。于是首先计算单位面积内点的个数,将单位面积内点个数少于某一指定数的面积去除,剩余的部分基本上就是验证码字符的部分。本例中,为了便于操作,取了55做为单位范围,并调整单位面积内点的标准密度为11。处理后的效果:

二、字符验证

这里我使用的方法是利用pytesser进行ocr识别,但由于这类验证码字符的不规则性,使得验证结果的准确性并不是很高。具体哪位大牛,有什么好的办法,希望能给指点一下。

三、准备工作与代码实例

1、PIL、pytesser、tesseract

(1)安装PIL:下载地址:http:// www pythonware com/products/pil/(2)pytesser:下载地址:http :/ /code google com/p/pytesser/,下载解压后直接放在代码相同的文件夹下,即可使用。

(3)Tesseract OCR engine下载:http: / / codegoogle com/p/tesseract-ocr/,下载后解压,找到tessdata文件夹,用其替换掉pytesser解压后的tessdata文件夹即可。

2、具体代码

复制代码

#encoding=utf-8

###利用点的密度计算

import Image,ImageEnhance,ImageFilter,ImageDrawimport sys

from pytesser import

#计算范围内点的个数

def numpoint(im):

w,h = imsize

data = list( imgetdata() )

mumpoint=0

for x in range(w):

for y in range(h):

if data[ yw + x ] !=255:#255是白色

mumpoint+=1

return mumpoint

#计算55范围内点的密度

def pointmidu(im):

w,h = imsize

p=[]

for y in range(0,h,5):

for x in range(0,w,5):

box = (x,y, x+5,y+5)

im1=imcrop(box)

a=numpoint(im1)

if a<11:##如果55范围内小于11个点,那么将该部分全部换为白色。

for i in range(x,x+5):

for j in range(y,y+5):

imputpixel((i,j), 255)

imsave(r'imgjpg')

def ocrend():##识别

image_name = "imgjpg"

im = Imageopen(image_name)

im = imfilter(ImageFilterMedianFilter())enhancer = ImageEnhanceContrast(im)

im = enhancerenhance(2)

im = imconvert('1')

imsave("1tif")

print image_file_to_string('1tif')

if __name__=='__main__':

image_name = "1png"

im = Imageopen(image_name)

im = imfilter(ImageFilterDETAIL)

im = imfilter(ImageFilterMedianFilter())enhancer = ImageEnhanceContrast(im)

im = enhancerenhance(2)

im = imconvert('1')

##a=remove_point(im)

pointmidu(im)

ocrend()

题主你好,

python中创建新实例的时候, 如果相应的类中定义了__init__()方法的话, 会自动调用这个方法 你可能认为名称"init"和"__init__"差不多, 但计算机其实是个很笨的东西, 它会完全按照设计去执行 也就是说,在设计的时候就已经定死了, 默认情况下, 创建新实例的时候, 会自动调用类中定义的__init__()方法, 只要你的方法名和__init__有一点不一样也不行

下图是我在官网上找的关于__init__()调用的简单说明:

高亮部分说的大概意思就是上面讲的,如果相应类中定义了__init__()方法,则在创建该类实例的时候会自动调用里面定义的__init__()方法

-----

希望可以帮到题主, 欢迎追问

这个类似于单例模式吧

print '----------------------方法1--------------------------'

#方法1,实现__new__方法

#并在将一个类的实例绑定到类变量_instance上,

#如果cls_instance为None说明该类还没有实例化过,实例化该类,并返回

#如果cls_instance不为None,直接返回cls_instance

class Singleton(object):

def __new__(cls, args, kw):

if not hasattr(cls, '_instance'):

orig = super(Singleton, cls)

cls_instance = orig__new__(cls, args, kw)

return cls_instance

class MyClass(Singleton):

a = 1

one = MyClass()

two = MyClass()

twoa = 3

print onea

#3

#one和two完全相同,可以用id(), ==, is检测

print id(one)

#29097904

print id(two)

#29097904

print one == two

#True

print one is two

#True

集合是一个无序的,不重复的数据组合,它有着两个主要作用:去重以及关系测试。去重指的是当把一个列表变成了集合,其中重复的内容就自动的被去掉了

关系测试指的是,测试两组数据之间的交集、差集、并集等关系。

去重测试代码如下:

# 创建一个列表 -- 里面存在一些重复值

test_list = [1,2,3,4,2,2,3,4,3,2,3,4]

# 利用集合将列表中重复的内容去掉

test_list = set(test_list)

# 打印测试并且查看test_list 被赋予新值后的数据类型print(test_list,type(test_list))   #  {1, 2, 3, 4}

Tip:需要注意的是,集合和字典一样都是无序的。

获取交集需要使用集合中的方法intersection方法,获取两个集合中的交集代码如下:

# 创建两个集合,并且获取集合的交集

test_list_01 = set([\'YanYan\',\'LiBai\',\'LuLu\',\'YangMi\'])

test_list_02 = set([\'YanYan\',\'LiuDeHua\',\'ZhangXueYou\',\'LiBai\'])

# 在上面的两个集合中,存在相同的值,那么现在我们取出两个集合中的交集

test_intersection = test_list_01intersection(test_list_02)print(test_intersection)  # {\'YanYan\', \'LiBai\'}

获取并集的方式需要采用集合中union方法,获取两个集合的并集代码如下:

# 创建两个集合,并且获取集合的交集

test_list_01 = set([\'YanYan\',\'LiBai\',\'LuLu\',\'YangMi\'])

test_list_02 = set([\'YanYan\',\'LiuDeHua\',\'ZhangXueYou\',\'LiBai\'])

# 采用集合中的union方法获取并集

test_list_union = test_list_01union(test_list_02)

print(test_list_union)  # {\'LiBai\', \'LuLu\', \'ZhangXueYou\', \'LiuDeHua\', \'YangMi\', \'YanYan\'}

获取差集的方式要采用集合中的difference方法,获取两个集合的差集的代码如下所示:

# 创建两个集合,并且获取集合的交集

test_list_01 = set([\'YanYan\',\'LiBai\',\'LuLu\',\'YangMi\'])

test_list_02 = set([\'YanYan\',\'LiuDeHua\',\'ZhangXueYou\',\'LiBai\'])

# 使用集合中的difference 方法来获取差集

test_difference = test_list_01difference(test_list_02)

test_difference2 = test_list_02difference(test_list_01)

print(test_difference) # {\'LuLu\', \'YangMi\'}print(test_difference2) # {\'ZhangXueYou\', \'LiuDeHua\'}

判断一个集合是否是另外一个集合的子集可以使用issubset()方法,同样,还可以使用issuperset()方法判断一个集合是否是另外一个集合的父级

代码如下:

# 创建两个集合

list_set  = set([1,2,3,4])

list_son = set([2,3])

# 判断list_son是否是list_set的子集print(list_sonissubset(list_set))  # True# 判断list_set 是否是list_son的父级print(list_setissuperset(list_son)) # True

对称差集(又有人称之为叫做反向差集),指的是取出两个集合中互相都没有的值取出放在一个集合中。

代码如下:

# 创建两个集合

list_set_num1 = set([1,3,5,7,9])

list_set_num2 = set([2,3,4,6,9,10])

# 获取两个集合的对称差集print(list_set_num1symmetric_difference(list_set_num2))  # {1, 2, 4, 5, 6, 7, 10}

如果上述的难以理解的话,可以对 对称差集理解为去掉两个集合中都存在的内容,将剩余的内容取到一个新的集合中。

除了上述的这些方法实现的关系功能之外,还有一个方法 isdisjoint() ,功能是判断两个集合中是否有相同的值,如果两个集合中没有相同的值(即没有交集),那么返回True

代码如下:

# 创建集合

test_set_num1 = set([1,2,3,4])

test_set_num2 = set([5,6,7,8])

test_set_num3 = set([1,3,7,8])

# 使用isdisjoint()方法来判断print(test_set_num1isdisjoint(test_set_num2)) # Trueprint(test_set_num1isdisjoint(test_set_num3)) # False

通过运算符来进行关系测试

在上面的应用中,主要是通过python中的方法进行的关系测试,那么在python中,除了使用方法以外,还可以使用关系运算符来进行关系测试。

实例代码如下:

test_list_01 = set([\'YanYan\',\'LiBai\',\'LuLu\',\'YangMi\'])

test_list_02 = set([\'YanYan\',\'LiuDeHua\',\'ZhangXueYou\',\'LiBai\'])

# 获取交集 &print(test_list_01 & test_list_02) # {\'LiBai\', \'YanYan\'}

# 获取并集 |print(test_list_01 | test_list_02) # {\'LuLu\', \'LiBai\', \'LiuDeHua\', \'YanYan\', \'ZhangXueYou\', \'YangMi\'}

# 获取差集  -print(test_list_01 - test_list_02) # {\'LuLu\', \'YangMi\'}print(test_list_02 - test_list_01) # {\'LiuDeHua\', \'ZhangXueYou\'}

# 获取对称差集print(test_list_01 ^ test_list_02) # {\'ZhangXueYou\', \'YangMi\', \'LuLu\', \'LiuDeHua\'}

集合的增删改查

添加

语法: Setadd()

代码如下:

# 创建一个集合

test_set = set([\'YanYan\'])

# 添加

test_setadd(\'LiBai\') # 添加一项

test_setupdate([\'LuLu\',\'JingJing\']) # 一次性向集合中添加多项

# 输出集合

print(test_set) # {\'YanYan\', \'LuLu\', \'LiBai\', \'JingJing\'}

删除

删除集合中的某一个元素可以使用remove方法

代码如下:

# 创建一个集合

test_set = set([\'YanYan\'])

# 使用remove方法删除元素

test_setremove(\'YanYan\')print(test_set)  # set()

删除项目除了使用remove以外,还可以使用pop()方法,但是pop()方法删除内容不能够指定,只是随机删除。

pop方法会把删除的内容返回,示例代码如下:

# 创建一个集合

test_set = set([20,9,\'a\',1,2,3,4])print(test_setpop()) # 1print(test_setpop()) # 2print(test_setpop()) # 3

删除元素还可以使用discard()方法,这个方法没有返回值,如果打印返回值的话会输出None

# 创建一个集合

test_list = set([1,2,3,4,5])

# 使用discard()方法删除 -- 注意,discard()方法删除返回None,也就是没有返回值print(test_listdiscard(3))  # None# 此时原集合中的3已经被删除了print(test_list)  # {1, 2, 4, 5}

查询

x in s # 判断 x是否是s 的成员

x not in s  判断x 是否是s的成员

len(x) # 查看x的长度

s <= t # 测试是否s中的每一个元素都在t中

s >= t # 测试是否 t 中的每一个元素都在 s 中

Python程序开发之简单小程序实例

(3)-打印99乘法口诀表

一、项目功能

在屏幕中打印格式化的九九乘法口诀表。

二、项目分析

按九九乘法口诀的运算顺序,打印的口诀表共有9行9列,第1行只有1列,第2行有2列……,第9行共有9列,如下所示:

1 1

1 2 2 2

1 3 2 3 3 3

……

……

1 9 2 9 3 9 4 9 5 9 6 9 7 9 8 9 9 9

要按格式控制输出,需定义2个循环,其中一个循环(我们称其为外循环,在其内定义变量i)嵌套另一个循环(我们称其为内循环,在其内定义变量j),外循环(变量i)控制行,循环次数大于等于1且小于10,内循环(变量j)控制列,循环次数取决于外循环变量i的值。

三、程序源代码

#!/usr/bin/python36

# -- coding: GBK --

print("九九乘法口诀表")

for i in range(1, 10):

print()

for j in range(1, i+1):

print ("%d%d=%d" % (j, i, ij), end=" " )

四、代码解释:

在程序的第一行为引用python版本,本实例为python36

第二行是程序编码引用,因为在程序中包含有中文字符,所以必须引用GBK,否则就会报错。

第三行为输出标题“九九乘法口诀表”

第四行至第七行为程序主体,由两个循环嵌套组成,在循环内的第五行,为一个控制行格式输出语句print(),用于换行操作。

五、运行后的输出结果

下一篇:《Python程序开发之简单小程序实例(4)》

打开APP

python简单程序实例-python简单项目实例

2020-10-28 20:39:43

编程大乐趣

码龄10年

关注

语言多元化是PayPal编程文化中一个重要的组成部分。在C++和Java长期流行的同时,更多的团队选择了Jva和Scala。同时,Braintree的收购也引入了一个久经世故的Ruby社区。Python作为一门特别的语言,在eBay和PayPal有很长的历史。而且其流行程度依然有增不减。

eBay的开发者支持Python这个应用于基层领域多年的语言。甚至在eBay管理层官方支持Python以前,技术人员就开始使用Python。我在几年前加入PayPal并选择Python来写内部应用,然而,我却发现了PayPal中将近15年以前的Python代码。

目前,Python 支撑着 超过50个项目, 包括:

功能和产品型, 例如 eBay Now 和 RedLaser运营和基础设施型, 从开放的 OpenStack 到专有设施中间层服务和应用型, 例如 PayPal 用来设定价格以及检测用户可用功能的那个(服务/应用)监测代理和接口型, 用于涉及到部署和安全的一些用例批处理任务型, 例如数据导入,价格调整,及其它项目以及不计其数的开发者工具

在接下来的文章里我将详细介绍那些使得 eBay 和 PayPal 的 Python 生态系统从2011年的不超过25个工程师到2014年超过260个工程师所使用的技术和举措。对于本文,我则会专注于10个不得不予以揭露的关于 eBay 和 PayPal 的企业环境的谬误。

谬误 #1: Python 是一门新语言

伴随着所有的初创公司正在使用它以及孩子们最近也在学习它的事实,这个谬误为何仍然存在是可以理解的。实际上 Python 已经 超过23岁了, 它最初发布于1991年, 早于 HTTP 10协议 5年且早于 Java 4年 目前比较有著名的很早就使用 Python 的例子是在1996年: Google 的第一个成功的网络爬虫。

如下:

1、index函数:用于从列表中找出某个值第一个匹配项的索引位置。

2、index方法语法:listindex(x[, start[, end]])。

3、参数:x-- 查找的对象。start-- 可选,查找的起始位置。end-- 可选,查找的结束位置。

4、返回值:该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。

5、实例:

代码:str1 = "this is string examplewow!!!";str2 = "exam"。

index函数为print(str1index(str2))。

python中index函数怎么用?

Python中index方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python find方法一样,只不过如果str不在string中会报一个异常。

index函数一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错。

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/jiehun/3072552.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-11
下一篇2023-08-11

发表评论

登录后才能评论

评论列表(0条)

    保存