今天在学习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看看效果有什么区别😂。感谢阅读,希望您不吝指导。