在针对验证码,做一个简单的自动网上签到程序(二)
中已经进行了图像二值化、降噪等处理,也得到了非常好的验证码的二值化字符串。但是在进行的试验中发现出现一些错误,尤其是在二值化之后7变成1 的情况经常出现,其原因在于前面二值化的时候选取的阈值为200,而不是根据图像动态选取的阈值,阈值的选取并不能够包括全部字符信息。
为此查阅了文献,发现设定阈值有相当多的方法,我们选取较为常见的otsu法计算图像阈值。
#! /usr/bin/env python
#coding=utf-8
import Image,ImageEnhance,ImageFilter,ImageDraw
import ImageTk
def OtsuGray(image):
# 创建Hist
#image = Image.open("4.f")
image.convert('L')
hist = image.histogram()
print len(hist)
print hist
'''大津法由大津于1979年提出,对图像Image,记t为前景与背景的分割阈值,
前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。
图像的总平均灰度为:u=w0*u0+w1*u1。从最小灰度值到最大灰度值遍历t,
当t使得值g=w0*(u0-u)2+w1* (u1-u)2 最大时t即为分割的最佳阈值。
直接应用大津法计算量较大,因此我们在实现时采用了等价的公式g=w0*w1*(u0-u1)2。
部分计算过程如下'''
# 开始计算
# 计算总亮度
totalH = 0
for h in range(0,256):
v =hist[h]
if v == 0 : continue
totalH += v*h
print h,totalH,v*h
width = image.size[0]
height = image.size[1]
total = width*height
print width
print height
print "总像素:%d;总亮度:%d平均亮度:%0.2f"%(total,totalH,totalH/total)
# t=0和t=255的时候无法构成分割,所以从t=1开始计算一致到t=255
# 初始化v值
v = 0
gMax = 0.0
tIndex = 0
# temp
n0Acc = 0.0
n1Acc = 0.0
n0H = 0.0
n1H = 0.0
for t in range(1,255):
v = hist[t-1]
if v == 0: continue
n0Acc += v #灰度小于t的像素的数目
n1Acc = total - n0Acc #灰度大于等于t的像素的数目
n0H += (t-1)*v #灰度小于t的像素的总亮度
n1H = totalH - n0H #灰度大于等于t的像素的总亮度
if n0Acc > 0 and n1Acc > 0:
u0 = n0H/n0Acc # 灰阶小于t的平均灰度
u1 = n1H/n1Acc # 灰阶大于等于t的平均灰度
w0 = n0Acc/total # 灰阶小于t的像素比例
w1 = 1.0-w0 # 灰阶大于等于t的像素的比例
uD = u0-u1
g = w0 * w1 * uD * uD
print 'g=',g
#if debug > 2: print "t=%3d; u0=%.2f,u1=%.2f,%.2f;n0H=%d,n1H=%d; g=%.2f"\
# %(t,u0,u1,u0*w0+u1*w1,n0H,n1H,g)
print t,u0,u1,w0,w1,g
if gMax < g:
gMax = g
tIndex = t
# if debug >0 : print "gMaxValue=%.2f; t = %d ; t_inv = %d"\
# %(gMax,tIndex,255-tIndex)
print tIndex
return tIndex
#a=OtsuGray()
#print a
上述计算方法也是从javaeye摘抄来的,算法很简单。
这样计算了每幅图片的阈值之后发现仍然存在着图像缺失的问题等。因此需要考虑对图像再做进一步的处理,以便二值化后基本反映数字的轮廓又能够不丢失信息。
因此我们在二值化之前对图像进行二值化和边界增强处理。后面降噪的步骤可以去掉。
相应的部分代码改为
image = image.filter(ImageFilter.EDGE_ENHANCE())
image = image.filter(ImageFilter.MedianFilter())
image.show()
#enhancer = ImageEnhance.Contrast(im)
otsu1=otsu.OtsuGray(image)
#twoValue(image,200)
print otsu1
twoValue(image,otsu1)
这样我们的字模提取已经基本上全部完成,可以开始制作字模库。验证码的识别仅仅剩下最后一步,模板与验证码的对照步骤。现在处理的效果是这样的。
原图
处理后
虽然现在的处理效果没有前面的处理办法边缘平滑,数字清晰,但是对于每个验证码,反映的基本特征均比较清晰,稳定性也大大增强。
- 大小: 2 KB
- 大小: 1.2 KB
分享到:
相关推荐
本项目“迅雷自动签到,自动登录,使用大漠插件”是针对迅雷游戏加速器的一个自动化脚本,旨在帮助用户自动完成登录和签到流程,从而节省时间,避免手动操作的繁琐。以下将详细介绍该项目涉及的主要知识点: 1. **...
标题“天翼网盘自动签到.zip”表明这是一个与天翼网盘自动化签到相关的压缩文件,其中可能包含了实现这一功能的代码或脚本。描述中的“天翼网盘自动签到.zip”再次强调了文件内容的核心,即针对天翼网盘的每日签到...
它可能是一个Python脚本或者其他编程语言编写的程序,用户只需要运行这个"main"文件,就能启动自动签到功能。程序可能会模拟用户的登录行为,然后自动完成签到步骤,包括输入必要的信息、点击按钮等。由于是“傻瓜式...
【52签到小助手V2.1.93.zip】是一个包含自动化签到功能的软件包,主要用于提高用户在日常签到活动中的效率。这个软件的版本号为V2.1.93,是V2.2版本之前的最后一个可用更新,意味着它可能包含了开发者认为稳定且功能...
标题中的“百度贴吧一键签到源码”指的是一个程序代码,用于实现自动化签到功能,主要针对百度贴吧这个在线社区平台。源码是程序员编写的原始指令集合,它揭示了软件内部的工作机制,通常用于学习、修改或扩展功能。...
"IAPP职教云自动签到助手源码.zip" 是一个包含源代码的压缩文件,其中的源代码是为实现自动签到功能而设计的,针对的是"IAPP职教云"这个平台。IAPP职教云可能是某职业教育平台的移动应用,提供了在线学习、签到等...
描述进一步确认了脚本的功能,即用于自动签到以获取支付宝会员积分。在日常生活中,许多应用程序,包括支付宝,提供了会员积分系统,用户可以通过签到等方式积累积分,兑换各种奖励。通过使用这样的脚本,用户可以...
《基于Android的签到点名系统》是一款专为移动端设计的应用程序,主要应用于教育机构、企业等场合,方便进行日常的签到与点名管理。本文将深入探讨该系统的架构设计、功能实现以及技术选型。 一、系统架构 基于...
1. "联通免码每日领取1GB流量日包v1.2.exe" 这个文件名暗示了一个针对中国联通用户的程序,版本号为v1.2,可能是一个应用程序,用于每天免费领取1GB的一日流量包。这个工具可能需要用户拥有联通手机号,并且可能需要...
本项目"**C#版本模拟登陆百度,2018年4月27日可用**"提供了一个C#语言编写的程序,专门用于模拟用户登录百度网站,而且在发布时是有效的。这个程序的独特之处在于,它不仅能够完成基本的登录操作,还为开发者提供了...
挂机软件是一种能够在用户计算机后台运行,执行特定任务的程序,通常用于自动化某些重复性工作,比如在线学习平台的签到、刷课等。这款软件的最新版本为2012V3.01,它带有自动验证码识别功能,意味着它可以自动处理...
【标题】"百度贴吧顶帖/签到源码-易语言"揭示了这是一个使用易语言编写的程序,其主要功能是实现对百度贴吧的自动顶帖和签到操作。易语言是中国的一种编程语言,设计目标是使编程变得更加简单、直观,适合初学者和...
一键签到功能是针对QQ的各种活动设计的,如QQ空间、QQ音乐、QQ阅读等。用户只需点击一下,即可完成所有关联应用的签到操作,确保不会错过任何连续签到的奖励。这不仅避免了用户忘记签到的情况,还帮助他们轻松积累...
优化:业务行程表支持筛选自动签到和手动签到的数据类型 优化:业务交账表增加销售金额、销售退货金额、底部加入金额合计,支持导出Excel 新增:BS端增加动态验证码,提升系统安全性。 七、其他新增调整 ...
自动签到功能保证了用户活跃度,而自动同问和同等则进一步增强了问题的覆盖面和影响力。 软件中包含的一些文件如`ip.Dat`、`mqpd2.dat`、`mqpd.dat`等可能是用于存储配置信息、账号数据或网络通信的数据文件。`DB...
增加版主签到程序(来自 RoyRoy) 19.可自定义江湖门派的名称,让注册用户只能在其中选择(来自 RoyRoy) 20.小字报可以由管理员自行管理 21.论坛随机广告不再减缓页面的显示速度 22.对论坛索引采用...