【问题标题】:How to process a binary image to align sparse letters in a row?如何处理二进制图像以对齐一行中的稀疏字母?
【发布时间】:2019-05-29 19:20:12
【问题描述】:

我正在尝试使用 tesseract ocr 将图像转换为文本。图片总是有三个字母,没有旋转/倾斜,而是随机分布在一个 90x50 png 文件中。

通过仅清理并转换为黑白,tesseract 无法获取图像中的文本。在 Paint 中手动对齐它们后,ocr 给出完全匹配。我什至不需要完全对齐。 我想要的是一些关于如何在将图像发送到 tesseract 之前自动对齐图像中字符的提示。

我正在使用带有 tesseract 和 opencv 的 python。

原图:

我所做的 - 变成黑白:

我想要做的 - 按代码对齐:

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只有在发布者已经尝试自己解决问题时才会提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出以及您实际获得的输出(控制台输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask
  • 这是我为获得您想要的结果而采取的步骤。用于删除背景的阈值图像,这应该会导致您在第二张图像中拥有什么。然后使用 Numpy 创建一个空白的白色图像。接下来找到每个字母的边界框并将 ROI 裁剪到空白图像上。
  • @AustenHolland,谢谢!我是新来的。我已经编写了将第一张图像转换为第二张图像的代码,但我真正要寻找的是 nathancy 给出的答案。我会阅读常见问题解答,并在以后记住您的提示。

标签: python opencv image-processing ocr tesseract


【解决方案1】:

您可以使用以下代码来实现此输出。一些常量可能需要更改以满足您的需要:

import cv2
import numpy as np

# Read the image (resize so it is easier to see)
img = cv2.imread("/home/stephen/Desktop/letters.png",0)
h,w = img.shape
img = cv2.resize(img, (w*5,h*5))
# Threshold the image and find the contours
_, thresh = cv2.threshold(img, 123, 255, cv2.THRESH_BINARY_INV);
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

# Create a white background iamge to paste the letters on
bg = np.zeros((200,200), np.uint8)
bg[:] = 255
left = 5

# Iterate through the contours
for contour,h in zip(contours, hierarchy[0]):
    # Ignore inside parts (circle in a 'p' or 'b')
    if h[3] == -1:
        # Get the bounding rectangle
        x,y,w,h = cv2.boundingRect(contour)
        # Paste it onto the background
        bg[5:5+h,left:left+w] = img[y:y+h,x:x+w]
        left += (w + 5)
cv2.imshow('thresh', bg)
cv2.waitKey()

【讨论】:

  • 这段代码对我的意图来说几乎是完美的。我不得不调整它以从左到右查找字母,而不是自下而上。出于某种原因,更改阈值/调整大小的顺序使 OCR 在预处理后得到更正确的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 2020-09-30
  • 2015-02-28
  • 2019-03-12
相关资源
最近更新 更多