从图像中读取文本

7
有没有关于将这些图像转换成文本的建议?我正在使用pytesseract,在大多数情况下都运作良好,除了这个。理想情况下,我希望能准确读取这些数字。最坏的情况是我可以尝试使用PIL来确定'/'左边的数字是否为零。从左边开始找到第一个白色像素,然后...

enter image description here enter image description here

from PIL import Image
from pytesseract import image_to_string

myText = image_to_string(Image.open("tmp/test.jpg"),config='-psm 10')
myText = image_to_string(Image.open("tmp/test.jpg"))

斜杠在中间会导致问题。我也尝试使用PIL的'.paste'在图像周围添加大量黑色。我可能还可以尝试一些其他的PIL技巧,但除非必须,否则我不想走这条路。

我尝试使用config='-psm 10',但我的8有时会变成“:”,而其他时候则是随机字符。我的0则变成了空白。

参考: pytesseract无法处理单个数字图像,用于 -psm 10

_____________编辑_______________ 附加样本:

输入图像描述 1BJ2I]

输入图像描述 DIS

enter image description here 10.I'10

enter image description here 20.I20

所以我正在进行一些巫术转换,目前似乎是有效的。但这看起来非常容易出错:

def ConvertPPTextToReadableNumbers(text):
    text = RemoveNonASCIICharacters(text)
    text = text.replace("I]", "0")
    text = text.replace("|]", "0")
    text = text.replace("l]", "0")
    text = text.replace("B", "8")
    text = text.replace("D", "0")
    text = text.replace("S", "5")
    text = text.replace(".I'", "/")
    text = text.replace(".I", "/")
    text = text.replace("I'", "/")
    text = text.replace("J", "/")
    return text

最终生成:

ConvertPPTextToReadableNumbers return text =  18/20
ConvertPPTextToReadableNumbers return text =  0/5
ConvertPPTextToReadableNumbers return text =  10/10
ConvertPPTextToReadableNumbers return text =  20/20

"-psm 10" 用于单个字符识别,您可以尝试使用 "psm 7"(单行文本)。参考:https://github.com/tesseract-ocr/tesseract/wiki/Command-Line-Usage - Gwen
我在那里省略了一些细节,我对psm 10的处理是尝试裁剪掉第一个字符,然后使用psm 10。有时我能够成功地裁剪掉第一个字符,但这是不一致的。即使我可以单独裁剪出一个8,它也会被解释为:或其他东西。其他字符也没有传递过来。即使我单独裁剪出一个0,它也会变成空白。 - LampShade
使用psm 7,它一直将“0\5”作为DIS进行读取,这可能对我的最坏情况来说已经足够好了。我只需要检查一个D,就能知道那是0/。如果有其他更好的解决方案,请随时提出。我希望有一种方法可以说“将所有内容解释为数字”。 - LampShade
它显示了一些路径错误,如何解决呢? - Rishabh Jhalani
2个回答

5
一般来说,大多数OCR工具(例如Tesseract)都是针对高分辨率的印刷文本扫描进行调整的。它们在低分辨率或像素化图像上表现不佳。这里有两种可能的方法:1、如果您的图像的字体、背景和布局完全可预测,则根本不需要使用Tesseract;它只会使事情变得复杂。建立一个表示每个需要识别的字符的图像库,并检查图像的部分是否等于参考图像。2、如果这不是一个选择,或者看起来太难了,您可以使用其中一种hq*x算法来放大像素化的图像。增加的细节可能足以使Tesseract能够可靠地识别字符。

谢谢提供这些信息。字体和大小是一致的,只有间距稍微变化了一下。如果我的当前实现出了问题,我会考虑尝试升级。但我唯一的担忧是它可能需要很长时间来处理。我更喜欢某些更快速的方式,因为我的脚本是实时的东西。 - LampShade

5

如果还有人遇到这个问题... 问题在于字母是白色的,而背景是黑色的... 在我的应用程序中,我在将其切换为(黑底白字)后获得了约98%的准确性,我只是使用了cv2。


哈哈,多年后这个起作用了!很高兴我回到这里检查。 - LampShade

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