今天在學習Python爬蟲的驗證碼識別的時候發現tesserocr這個庫的圖片識別能力居然能低到離譜的程度,我都很好奇為什么崔神書上那張圖片居然能識別出來。
實驗的三張圖片如下。
我剛開始想的是除了圖一略有難度以外,圖二圖三應該不難識別吧?
於是我先直接對原圖片進行識別。
import tesserocr from PIL import Image img1 = Image.open('img1.jpg') print('圖片1的內容為:', tesserocr.image_to_text(img1)) img2 = Image.open('img2.jpg') print('圖片2的內容為:', tesserocr.image_to_text(img2)) img3 = Image.open('img3.jpg') print('圖片3的內容為:', tesserocr.image_to_text(img3))
結果只有圖3出了內容,而且還是錯誤的🤣。
接下來我對三張圖片進行灰度處理和手動的二值化處理,提高它們的識別度。
import tesserocr from PIL import Image def set_image(image, threshold): image = image.convert('L') table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) image = image.point(table, '1') image.show() print(tesserocr.image_to_text(image)) if __name__ == "__main__": image1 = Image.open('img1.jpg') set_image(image1, 160)
因為只用了灰度和二值化處理而且我的水平不夠,圖一沒辦法提高太多(如果各位會的話請指教一下小弟😙)。
果不其然,手動調節了50~200的閾值,圖一即使能識別出文字也完全不正確,還有部分是字母。
圖二在閾值為155左右的時候識別出了Vv07的結果,算是比較符合正確答案了。
最讓我感到失望的是圖三,閾值為200時明明已經看上去非常容易識別了,結果確還是只能識別出1364這個錯誤答案,雖然很接近,但是依然不正確。
然后我就嘗試了通過暴力傳入遍歷閾值來看看能否取得正確結果😡。
import tesserocr
from PIL import Image
def set_image(image, threshold):
image = image.convert('L')
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table, '1')
return tesserocr.image_to_text(image)
if __name__ == "__main__":
for threshold in range(20, 220, 2):
image1 = Image.open('img1.jpg')
result = set_image(image1, threshold)
if result!= '' and result in '46168' or '468168' in result:
print('圖一在閾值為%s時識別成功,結果為%s' % (threshold, result))
print('識別結果錯誤或無法識別')
結果圖一二三都是一樣的結果🤣。
難怪大家都寧願用付費的api接口,這個識別率也太低了。或許我應該試試pytesser或者sklearn看看效果有什么區別😂。感謝閱讀,希望您不吝指導。