PIL驗(yàn)證碼圖片預(yù)處理
概論
在用tesseract進(jìn)行驗(yàn)證碼識別之前骑疆,我們首先需要對驗(yàn)證碼圖片進(jìn)行預(yù)處理,盡量去除噪聲坎匿,而只保留有驗(yàn)證碼信息的像素奈惑。本文主要介紹一些基本的驗(yàn)證碼預(yù)處理方法。
通常驗(yàn)證碼圖像預(yù)處理可見下圖(第二步驟):
驗(yàn)證碼噪聲分析
通常驗(yàn)證碼噪聲主要有以下:
-
變色:
對驗(yàn)證碼字符像素進(jìn)行變色陌选,但一般而言為了可以辨認(rèn)都是和圖像底色有一定差別的理郑。這就可以通過二值圖像,把驗(yàn)證碼字符和底色進(jìn)行鮮明的區(qū)分咨油。比如以下兩種驗(yàn)證碼您炉,字體像素和背景差別很明顯,通過PIL庫二值化基本就能分理出字符像素:
處理后:
- 干擾點(diǎn)
干擾點(diǎn)基本上可以算是椒鹽噪聲役电,即離散的單獨(dú)存在的噪點(diǎn)赚爵。這種噪聲,一般噪點(diǎn)像素和周圍像素差別較大,可以簡單地用中值濾波處理(如果遇到高斯噪聲的可以用高斯濾波)冀膝。
另外也可以遍歷像素唁奢,計算一個像素4領(lǐng)域或者8領(lǐng)域的像素是否跟圖像底色近似(用一個閾值做判斷),如果超過一定數(shù)量則判斷該像素為噪聲窝剖,將此像素設(shè)為背景色麻掸。
- 干擾線:
干擾線依賴于繪制方式,分曲線和直線赐纱。但不管如何论笔,其主要特點(diǎn)是像素是線性連接的,這就可以通過Flood Fill進(jìn)行著色千所,并統(tǒng)計著色面積(一般都是驗(yàn)證碼像素的著色面積最大)狂魔,最后把那些著色面積小的噪聲像素刪除。
- 文字傾斜:
再去除噪聲之后淫痰,可以把傾斜的文字像素通過仿射變換變成正體字最楷。或者干脆直接用斜體的字建立訓(xùn)練模型(如果驗(yàn)證的字體傾斜方向比較單一的話還是可行的)待错。
去噪實(shí)例
驗(yàn)證碼獲取&噪聲分析
驗(yàn)證碼地址:
http://scm.sf-express.com/isc-vmi/loginmgmt/imgcode?a=0.18090831750297091
該驗(yàn)證碼主要是增加了不同顏色的干擾線籽孙,并且干擾線比較細(xì)短。因此考慮先用PIL庫將其轉(zhuǎn)換成二值圖火俄,之后通過遍歷每個像素點(diǎn)犯建,判斷鄰域像素來刪除多余噪聲。
PIL二值圖處理
灰度圖轉(zhuǎn)換:
img = Image.open(loadpath+file).convert("L")
PIL二值圖算法:
手動遍歷像素瓜客,以一定閾值為界限适瓦,把圖片變成二值圖像。
def binarizing(img,threshold): #input: gray image
pixdata = img.load()
w, h = img.size
for y in range(h):
for x in range(w):
if pixdata[x, y] < threshold:
pixdata[x, y] = 0
else:
pixdata[x, y] = 255
return img
結(jié)果:
可見二值化的圖像并不能去除干擾線谱仪,這樣的圖像直接用tesseract做識別成功機(jī)會不會超過5%玻熙。因此需要把這些干擾線去除,這就需要用一定的算法來處理像素疯攒。
干擾線去噪算法
如圖嗦随,對于以上直線行干擾線而言,從左到右的像素遍歷會把干擾線的起點(diǎn)像素識別為噪聲(3鄰域像素都是背景色)敬尺,然后繼續(xù)遍歷下去干擾線就清除了枚尼。當(dāng)然對于較粗的2像素、3像素噪聲砂吞,也是同樣道理署恍。
4鄰域像素算法:
對于像素值>245的鄰域像素,判別為屬于背景色呜舒,如果一個像素上下左右4各像素值有超過2個像素屬于背景色锭汛,那么該像素就是噪聲笨奠。
def depoint(img): #input: gray image
pixdata = img.load()
w,h = img.size
for y in range(1,h-1):
for x in range(1,w-1):
count = 0
if pixdata[x,y-1] > 245:
count = count + 1
if pixdata[x,y+1] > 245:
count = count + 1
if pixdata[x-1,y] > 245:
count = count + 1
if pixdata[x+1,y] > 245:
count = count + 1
if count > 2:
pixdata[x,y] = 255
return img
處理結(jié)果:
可見第二幅圖像有一處黑線噪聲未去除,這是因?yàn)槲也捎昧擞勺笙蛴一脚梗缮舷蛳卤闅v像素法般婆,而仔細(xì)觀察該驗(yàn)證碼像素還是有黑色邊框的,因此通過去除邊框或者改變遍歷方向就能去除該噪聲朵逝。
tesseract測試
用默認(rèn)的tesseract進(jìn)行20個樣本的測試(沒有自己訓(xùn)練數(shù)據(jù)),限定參數(shù) -psm 7表示識別單行字符蔚袍,并限定字符集為數(shù)字和大寫字母。
結(jié)果其中有15個樣本識別正確配名,成功率大概75%
主要問題集中在tesseract默認(rèn)識別容易把G識別成6啤咽,把Y識別成V,因此為了提高識別率自己訓(xùn)練數(shù)據(jù)還是必要的渠脉。