Python验证码识别——前处理

目前不少系统的验证码做得越来越复杂,人眼都难以识别,尤其是QQ之类的验证码,想要识别,太难了。

现在有这样一个验证码:

一般的验证码识别,都是先进行前处理,然后分割,在进行识别。这个验证码没有其他噪音,但存在一条横穿的曲线干扰,并且验证码中字体是粘连在一起的。

如果不将干扰曲线去除,那么整个识别将会受到一定的影响,为此,先要去掉这条曲线,首先通过的办法是将先获取曲线的头位置(x,y),这一部分很简单,代码如下:

 

1 def get_left_start_point(im):
2 start_point = (0,0)
3 found = False
4 w, h = im.size
5 data = list(im.getdata())
6 for x in xrange(w):
7 for y in xrange(h):
8 if data[ y*w + x ] != white:
9 found = True
10 start_point = (x,y)
11 break
12
13 if found:
14 break
15 return start_point

取到头结点后,然后依次从左到右遍历过去,上下判断是否为黑点,将线条坐标位置保存起来,之后进行线条位置去除,代码如下(感谢孙志海朋友的提示):

 

def remove_line(im, aim):
w,h = im.size
data = list( im.getdata() )

for x,y in aim:
curr = data[ y * w + x ]
prev = data[ (y-1) * w + x]
next = data[ (y+1) * w + x]

if prev == black and next == black:
continue

if prev == black:
data[ y * w + x ] = white
data[ (y-1) * w + x] = white


elif next == black:
data[ y * w + x ] = white
data[ (y+1) * w + x] = white

else:
data[ y * w + x ] = white

于是可以得到去除黑线后的图像为:

除了几个孤立的点,图像中的黑线基本被去除干净,下面是几张是处理的比较好的:

下面这一张处理的比较差:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值