【问题标题】:Image Preprocessing for OCR - TessaractOCR 的图像预处理 - Tesseract
【发布时间】:2019-01-12 07:29:30
【问题描述】:

显然,这张图片非常难看,因为它的清晰度很低,而且不是一个真实的单词。但是,使用此代码,我没有检测到任何关闭:

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

这里有什么想法吗?我的对比函数产生的图像是:

哪个看起来不错?我没有大量的 OCR 经验。你会在这里推荐什么预处理?我尝试将图像的大小调整得更大,这有点帮助但还不够,还有一堆来自 PIL 的不同过滤器。虽然没有什么特别接近的地方

【问题讨论】:

  • 不要转换为 1 位黑白,使用灰度 ('L" IINM)。
  • 谢谢保罗!这有很大帮助。它输出'NedNnodleArrns',非常合理
  • 很高兴为您提供帮助,请查看我的答案。

标签: python ocr image-recognition image-preprocessing python-tesseract


【解决方案1】:

你是对的,tesseract 在更高的分辨率下效果更好,所以有时调整图像大小会有所帮助 - 但不要转换为 1 位。

我在转换为灰度时得到了很好的结果,将其放大了 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'

查看this jupyter notebook:

【讨论】:

  • 你能解释一下这个 lambda 函数在做什么吗?是否像阈值化?
  • @SKR 是的,如果像素值超过 75(共 256 个),那么让字母更亮是一个蹩脚的技巧,则将其值加 100。
  • 你的意思是(255个),对吧?如果像素值已经超过 200 怎么办?
  • 一个非常有效的简单技巧的绝妙答案!谢谢!
猜你喜欢
  • 2014-03-30
  • 2019-10-16
  • 2017-07-17
  • 1970-01-01
  • 2017-09-21
  • 2015-04-04
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多