【问题标题】:How to extract numbers from image using OpenCV and pytesseract image_to_string()?如何使用 OpenCV 从 PNG 文件中提取数字?
【发布时间】:2019-08-16 19:29:22
【问题描述】:

我正在尝试使用 OpenCv 从 .png 文件中提取数字,然后使用 pytesseract 中的 image_to_string() 方法,但输出效果不佳。

我尝试了一些预处理方法,例如调整大小和噪声过滤器,但仍然无法获得准确的结果。我该如何处理?

【问题讨论】:

  • 至少你没有尝试使用 JPEG 输入图像。能否大大提高源图像质量?

标签: python opencv image-processing ocr python-tesseract


【解决方案1】:

这是一个简单的预处理步骤,用于在使用 pytesseract 之前清理图像

  • 将图像转换为灰度
  • 锐化图像
  • 执行形态转换以增强文本

由于您的输入图像看起来很模糊,我们可以使用cv2.filter2D() 和通用锐化内核来锐化图像。其他类型的内核可以找到here

image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen = cv2.filter2D(gray, -1, sharpen_kernel)

文字有小孔,所以我们可以使用cv2.dilate()来封闭小孔并平滑图像

sharpen = 255 - sharpen
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
dilate = cv2.dilate(sharpen, kernel, iterations=1)
result = 255 - dilate

结果如下。您可以尝试仅使用锐化图像或 pytesseract 增强图像

import cv2
import numpy as np

image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen = cv2.filter2D(gray, -1, sharpen_kernel)

cv2.imwrite('sharpen.png', sharpen)
sharpen = 255 - sharpen
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
dilate = cv2.dilate(sharpen, kernel, iterations=1)

result = 255 - dilate
cv2.imwrite('result.png', result)
cv2.waitKey(0)

【讨论】:

    【解决方案2】:

    我尝试锐化图像;但是,我没有注意到使用 tesseract 进行数字提取的任何改进。我的建议是首先使用基于深度学习的超分辨率方法来改进图像,如this,并使用 tesseract 进行数字提取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 2013-09-15
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      相关资源
      最近更新 更多