python基於PIL和tesseract的驗證碼識別

之前搞這個搞了一段時間,後面遇到了點小麻煩,導致識別率太低了,最多也就百分之20的樣子。心灰意冷,棄了一段時間。上次在論壇看到一篇大牛的關於PIL對圖片各種處理各種算法的博突然又想起了這個,又隨便搞了下,大大提高了識別率啊。先給代碼:

原圖:

im = Image.open("C:\Users\Administrator\Desktop\python\\3.png")

#調色
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)

#把圖片調成只有黑白兩個顏色,處理後每個像素色用8位表示
im = im.convert('1') 

im.show() #測試查看

經過上面處理後:

現在到了關鍵的一步,這圖上好多好多小黑點,要一個一個全部去除我估計我代碼寫到吐血都寫不出來。但是要去除一部分還是可以的。

xsize, ysize = im.size  #長、寬

#對照片裏的所有像素點:如果像素色不是白色並且右邊的一個像素點像素色是白色(RGB(255,255,255))或者像素色不是白色並且下方的一個像素點是白色的,統一變成白色
for i in range(ysize-1):
    for j in range(xsize-1):
        if (im.getpixel((j, i)) !=255&im.getpixel((j+1,i))==255):
            im.putpixel((j,i),255);
        if(im.getpixel((j,i)) != 255&im.getpixel((j,i+1))==255):
            im.putpixel((j, i), 255);

im.show();  #再看看效果

處理完之後:

之前那些黑色的小點點已經去的差不多了,但是這樣也是有代價的啊- - 把圖片裏面的字的一些像素色也去掉了一些,現在拿這張圖片去用tesseract識別的話其實對於tesseract來說跟之前那張沒有去小黑點的圖片識別難度差不了多少,然後後面又想了個辦法補救了一下:

#把上面我們變成白色的小黑點給他補一點回來- -
for i in range(ysize - 1):
    for j in range(xsize - 1):
        if (im.getpixel((j, i))!=255&im.getpixel((j+1,i)) !=255):
            im.putpixel((j, i), 0);
        if (im.getpixel((j, i))!=255&im.getpixel((j,i+1)) !=255):
            im.putpixel((j, i), 0);

im.show();  #再看看效果

處理完之後:

比上面的圖清晰了蠻多。這個時候再去對照下剛開始的那種圖的話,對識別程序來說清楚了不止是一點點啊。

不過儘管如此,識別率還是不怎麼樣,我估計也就百分之50左右的識別率,還是太低了,可能是因爲我去掉了一些關鍵的像素點的色,因爲我也不知道tesseract具體的對比庫是怎麼樣的,所以估計我又要棄了。有想過再繼續對圖片切割旋轉,甚至還想過找人工智能的朋友給我拿去訓練訓練,不過那樣還是偏離我本意了,而且我也不是很喜歡搞學術的東西。不管怎麼樣我這個感覺還是有點用的,說不定拿去做一下切割識別率大大提高也是有可能的。

最後如果有大牛偶然看到我這篇博的話還望不吝賜教。

嘔心瀝血寫出來的,轉載請一定註明出處!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章