from PIL import Image
#处理验证码图片 分以下几个阶段
def tu(dd,s=190):#s 表示的是颜色0-225 具体看验证码的颜色深浅了 可以自己试
#二值化 是把0-225的像素点分为0和1 就是黑白色
img = Image.open('{0}.png'.format(dd)).convert('L')
threshold = s
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
image = img.point(table,'1')
image = image.save('{0}.png'.format(dd))
#去掉单个点黑色
#上面为 上下左右的像素点如果都是白色255就把这个点也变成白色
for e in range(1):
img = Image.open('{0}.png'.format(dd))
data = img.load()
w = img.size[0]
h = img.size[1]
for e in range(w):
for i in range(h):
a = data[e,i]
if a==0:
for t in range(1):
try:
s = data[e,i-1]#上
except:
s = 255
try:
x = data[e,i+1]#下
except:
x= 255
try:
z = data[e-1,i]#左
except:
z = 255
try:
y = data[e+1,i]#右
except:
y = 255
if 255==s==x==z==y:#如果上下左右都是白色只有这一个是黑色就删除这个黑色点 变成白色
data[e,i]=255
#print([e,i])
else:
pass
else:
pass
img.save('{0}.png'.format(dd))
#去点横向的干扰线,如果这个相素上下都是白色就把中间这个黑色变成白色
for e in range(1):
img = Image.open('{0}.png'.format(dd))
data = img.load()
w = img.size[0]
h = img.size[1]
for e in range(w):
for i in range(h):
a = data[e,i]
if a==0:
for t in range(1):
try:
s = data[e,i-1]#上
except:
s = 255
try:
x = data[e,i+1]#下
except:
x= 255
if 255==s==x:
data[e,i]=255
#print([e,i])
else:
pass
else:
pass
img.save('{0}.png'.format(dd))
#去点竖向的干扰线,如果这个相素左右都是白色就把中间这个黑色变成白色
for e in range(1):
img = Image.open('{0}.png'.format(dd))
data = img.load()
w = img.size[0]
h = img.size[1]
for e in range(w):
for i in range(h):
a = data[e,i]
if a==0:
for t in range(1):
try:
z = data[e-1,i]#左
except:
z = 255
try:
y = data[e+1,i]#右
except:
y = 255
if 255==z==y:
data[e,i]=255
#print([e,i])
else:
pass
else:
pass
img.save('{0}.png'.format(dd))
#有些干扰点比较大 就可以把横坚的函数拿出来单独再执行一次
原我已经去掉了彩色:
这个是我处理的图片结果 用百度API去识别 成功率已经不错了 要求高的就可以再处理细致一些。