低质量数字图像的OCR预处理方法?

3
我目前正在开发一个项目,该项目将读取数独格子的图像,检测格子,识别数字,解决难题,并将解决方案叠加在图像上。为了识别数字,我将网格分成n * 2个图像,其中每个图像都是一个单独的网格(例如:ex2 ex9),并将它们输入到pytesseract中。然而,我的所有图像都没有检测到任何文本,即使它只是一个数字图像,没有噪声/边框等。

我尝试了常见的图像平滑方法、各种阈值方法、调整图像大小、反转图像和将数字裁剪到边界框中,但这些方法似乎都不起作用。我测试了我编写的 pytesseract 代码在其他图像上的运行情况,那些都可以正常工作,只有我的图像不能正常处理。

有人能提供建议,让我尝试什么或者为什么我的图像似乎不容易被处理吗?

供参考,这里是我一直在使用的 pytesseract 的 image_to_string 设置:

text = image_to_string(im, config='--psm 10 --oem 3' + '-c tessedit_char_whitelist=123456789')

1个回答

0
我找到了一个解决方案,但它绝对不美观。 我发现 pytesseract 在捕获数字时很烂,特别是那些数字很少的情况。我从一个使用“零填充”进行图像识别的 CNN 中获得了灵感。现在请注意,我从中获得的唯一灵感是实际名称,而不是方法(比这篇文章接近的任何内容都要复杂得多)。
我找到了一个包含 0 的图像,并创建了一个带有三个零(任意选择的数字和数量)的“零填充图像”。无论如何,我发现 pytesseract 能够完美地扫描数字图像!15/15 次,而不是 3/15 次。记得将 OCR 扫描的数字除以 1000(如果你使用三个 0)。
我使用了这篇文章中展示的水平图像堆叠技术: Image stacking post
import numpy as np
from PIL import Image
def concat_images(imga, imgb):
    """
    type(imga): string of filename
    type(imgb): string of filename
    type(new_img): PIL.Image.Image

    """
    imga = np.asarray(Image.open(imga).convert('LA') )
    imgb = np.asarray(Image.open(imgb).convert('LA') )

    ha,wa = imga.shape[:2]
    hb,wb = imgb.shape[:2]
    max_height = np.max([ha, hb])
    total_width = wa+wb
    new_img = np.zeros(shape=(max_height, total_width, 2) , dtype = 'uint8')
    new_img[:ha,:wa]=imga
    new_img[:hb,wa:wa+wb]=imgb
    new_img = Image.fromarray(new_img)

    return new_img

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