1

我只测试了字母数字和数字的示例文本。我正在使用数字模式。

如何识别下图中的数字:

在此处输入图像描述

我认为是因为身高。我还尝试使用一些在线工具(不是代码)将其转换为 .jpg

我正在使用 pytesseract 0.1.6,但我认为这是 Tesseract 问题。

这是我的代码:

def classify(hash):
  socket = urllib.urlopen(hash)
  image = StringIO(socket.read())
  socket.close()
  image = Image.open(image)
  number = image_to_string(image, config='digits')
  mapping[hash] = number
  return number

classify('any url')
4

2 回答 2

1

我认为你在这里有两个问题。

首先是文字比较小。您可以通过将图像设置为 2 倍高和 2 倍宽来放大图像(最好使用 AA 或三次插值来尝试使字母更清晰)。

接下来,数字边缘周围没有足够的白色让 tesseract 知道它实际上是一个边缘。因此,您需要在已有的内容周围添加一些空白图像。

您可以使用 photoshop 或 GIMP 或 ImageMagick 或其他任何工具手动执行此操作,以验证它是否真的有帮助。但是,如果您需要制作一堆图像,那么您可能需要使用 PIL 和 ImageOps 来提供帮助。

如何使用 PIL 调整图像大小并保持其纵横比?

如果您使新尺寸更大而不是更小,PIL 将扩大图像而不是缩小图像。将其宽度和高度都增加 2 倍或 3 倍,而不是 20%,因为这会导致伪影。

这是添加额外白色边框的一种方法:http: //effbot.org/imagingbook/imageops.htm#tag-ImageOps.expand

这个问题也可以帮助您添加额外的空格: 在 Python,Python Image Library 1.1.6 中,如何在不调整大小的情况下扩展画布?

于 2015-06-23T21:00:11.200 回答
1

输入图像太小,无法识别。这是我的解决方案:

为了准确识别,需要对图像进行上采样。添加连续边框将使数字居中。应用自适应阈值将导致功能(数字笔划)更可用。结果将是:

在此处输入图像描述

当你阅读:

049

代码:


import cv2
import pytesseract

img = cv2.imread("0cLW9.png")
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(h, w) = gry.shape[:2]
gry = cv2.resize(gry, (w * 2, h * 2))
gry = cv2.copyMakeBorder(gry, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=255)
thr = cv2.adaptiveThreshold(gry, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 81, 12)
txt = pytesseract.image_to_string(thr, config="digits") 
print(txt)
cv2.imshow("thr", thr)
cv2.waitKey(0)

您可以使用其他预处理方法获得相同的结果。

于 2021-02-11T20:08:20.083 回答