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
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
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
于是可以得到去除黑線后的圖像為:
除了幾個孤立的點,圖像中的黑線基本被去除干凈,下面是幾張是處理的比較好的:
下面這一張處理的比較差:
鑒于之前有blog內容被網絡轉載,并不注明出處,因此添加下面內容:
author:ubunoon
homepage: http://qtrstudio.com
blog: http://www.cnblogs.com/ubunoon ; http://qtrstudio.com/blog
email:netubu#gmail.com
copyright: Copyright © 2011. All rights reserved.
全站熱搜
留言列表