import tesserocr
from PIL import Image
image = Image.open('code.jpg')
result = tesserocr.image_to_text(image)
print(result)
在这里我们首先新建了一个 Image 对象,然后调用了 Tesserocr 的 image_to_text() 方法,传入该 Image 对象即可完成识别,实现过程非常简单,识别结果如下:
JR42
另外 Tesserocr 还有一个更加简单的方法直接将图片文件转为字符串可以达到同样的效果,代码如下:
import tesserocr
print(tesserocr.file_to_text('image.png'))
不过经测试此种方法的识别效果不如上一种方法好。
接下来我们换一个验证码试一下,命名为 code2.jpg,如图 8-3 所示:
重新用下面的代码测试一下:
import tesserocr
from PIL import Image
image = Image.open('code2.jpg')
result = tesserocr.image_to_text(image)
print(result)
这时可以看到如下输出结果:
FFKT
发现这次识别和实际的结果有所偏差,这是因为验证码内的多余线条干扰了图片的识别。
对于这种情况,我们还需要做一下额外的处理,如转灰度、二值化等操作。
我们可以利用 Image 对象的 convert() 方法参数传入 L 即可将图片转化为灰度图像,代码如下:
image = image.convert('L')
image.show()
传入 1 即可将图片进行二值化处理:
image = image.convert('1')
image.show()
另外我们还可以指定二值化的阈值,上面的方法采用的是默认阈值127,不过我们不能用原图直接转化,可以先转为灰度图像,然后再指定二值化阈值转化,代码如下:
image = image.convert('L')
threshold = 80
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table, '1')
image.show()
在这里我们指定了一个变量 threshold 代表二值化阈值,阈值设置为 80,处理之后我们看一下结果,如图 8-4 所示:
图 8-4 处理结果
经过处理之后我们发现原来的验证码中的线条已经被去除了,而且整个验证码变得黑白分明,这时重新识别验证码,代码如下:
import tesserocr
from PIL import Image
image = Image.open('code2.jpg')
image = image.convert('L')
threshold = 127
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table, '1')
result = tesserocr.image_to_text(image)
print(result)
即可发现运行结果变成了:
PFRT
识别正确。
可见对于一些有干扰的图片,我们做一些灰度和二值化处理,会提高其识别正确率。