OCR的图像预处理 - Tessaract

7

这是我试图检测的图片

显然,这张图片很难检测,因为它清晰度低且不是真实的单词。然而,使用这段代码,我检测不到任何相似之处:

import pytesseract
from PIL import Image, ImageEnhance, ImageFilter
image_name = 'NedNoodleArms.jpg'
im = Image.open(image_name) 
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.save(image_name)
text = pytesseract.image_to_string(Image.open(image_name))
print(text)

输出

, Mdfiaodfiamms

有什么想法吗? 我的对比功能生成的图像如下: enter image description here 看起来还不错? 我没有太多OCR经验。 您会在此推荐哪些预处理? 我已尝试将图像调整为较大,这有点有用,但效果不佳,以及从PIL中选择了许多不同的过滤器。 然而没有特别接近的效果。

不要将图像转换为1位黑白图像,使用灰度(“L” IINM)。 - Paulo Scardine
谢谢保罗!那帮了很多。它输出的是“NedNnodleArrns”,这非常合理。 - Ashley O
很高兴能帮忙,看看我的答案吧。 - Paulo Scardine
1个回答

10

你是对的,Tesseract能够更好地处理高分辨率图片,因此有时调整图像大小可以帮助识别-但不要将其转换为一位图。

我通过将图像转换为灰度图像,将其放大3倍并使字母变亮,获得了很好的结果:

>>> im = Image.open('j78TY.png')\
          .convert('L').resize([3 * _ for _ in im.size], Image.BICUBIC)\
          .point(lambda p: p > 75 and p + 100)
>>> pytesseract.image_to_string(im)
'NedNoodleArms'

请查看这个Jupyter笔记本

在此输入图片描述


该笔记本提供了关于IT技术的相关内容。

1
你能解释一下这个lambda函数在做什么吗?它像阈值处理吗? - SKR
1
@SKR 是的,这是一个很糟糕的hack方法,用于使字母更亮。如果像素值超过75(256的一部分),则将100添加到其值中。 - Paulo Scardine
1
你的意思是(255的范围内),对吧?如果像素值已经超过200怎么办? - SKR
1
非常棒的答案,提供了一个非常有效的简单技巧!谢谢! - lucidbrot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接