我已经使用示例文本测试了字母数字和数字。我正在使用数字模式。
如何识别如下图所示的数字:
我认为这是因为全高。 我也尝试使用一些在线工具(不是代码)将其转换为.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')
答案 0 :(得分:1)
我认为你在这里遇到了两个问题。
首先,文字相当小。你可以通过使图像高2倍和宽2倍来缩放图像(最好使用AA或立方插值来尝试使字母更清晰)。
接下来,在数字边缘周围没有足够的白色,以便tesseract知道它实际上是一个边缘。因此,您需要在已经拥有的内容周围添加一些空白空白图像。
您可以使用photoshop或GIMP或ImageMagick或其他任何方式手动执行此操作,以验证它是否真正有用。但是如果你需要做一堆图像,那么你可能想要使用PIL和ImageOps来帮助。
How do I resize an image using PIL and maintain its aspect ratio?
如果你让新尺寸更大而不是更小,PIL会增加图像而不是缩小图像。将它增加2倍或3倍宽度和高度而不是20%,因为它会造成伪影。
这是添加额外白色边框的一种方法: http://effbot.org/imagingbook/imageops.htm#tag-ImageOps.expand
此问题可能会帮助您添加额外的空格: In Python, Python Image Library 1.1.6, how can I expand the canvas without resizing?
答案 1 :(得分: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)
您可以使用其他预处理方法获得相同的结果。