如何在图像中找到数字并阅读它们?
Posted
技术标签:
【中文标题】如何在图像中找到数字并阅读它们?【英文标题】:How to find numbers in images and read them? 【发布时间】:2021-12-02 00:38:31 【问题描述】:我有这张照片:
这是我感兴趣的区域:
这是一个我想识别和“阅读”的数字。
我不知道为什么我无法使用 pytesseract 检测到它。 即使我对其进行了预处理并使这张图像没有噪音:
这是我用来阅读它的配置:
只有数字;
一个字符;
text = pytesseract.image_to_string(number_5, lang='eng',config='--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789')
不过,我还是得到了\n\x0c
作为答案。
我想请教一些关于如何识别具有唯一字符的图像的提示(在这种情况下只有数字);
还有一个关于数字检测的问题。是否有模型可以搜索照片中的数字并返回它们所在位置的边界框?
【问题讨论】:
您的问题要求不同的东西。如果您希望就您的pytesseract
问题获得支持,我建议您上传一个完整的最小工作示例(包括图片)来演示失败的原因。此外,here 你会发现一个文本检测模型的集合。我会假设它们也适用于数字序列。
安德烈,感谢您的 cmets。我已经在看这个文本检测模型集合了。关于完整的最小工作示例,它就在那里。例如,这个数字 5 无法被算法读取。当我用从互联网上下载的照片试一试时,效果很好。
【参考方案1】:
在图像中检测5
的一种方法是屏蔽图像。
您可以使用Thresholding Operations using inRange。首先,我们需要找到阈值的上限和下限。经过几次试验,我认为以下是适合识别的。
msk = cv2.inRange(hsv, np.array([0, 0, 175]), np.array([179, 255, 255]))
下限为np.array([0, 0, 175])
上限为np.array([179, 255, 255])
结果将是:
在上面我们可以清楚地看到数字5
。
现在我们可以应用以下processing 方法。
krn = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 3))
dlt = cv2.dilate(msk, krn, iterations=1)
thr = 255 - cv2.bitwise_and(dlt, msk)
结果将是:
现在如果我们申请tesseract
d = pytesseract.image_to_string(thr, config="--psm 10")
result 将是:
5
代码:
import cv2
import numpy as np
import pytesseract
# Load the img
img = cv2.imread("MjfJF.png")
# Cvt to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Get binary-mask
msk = cv2.inRange(hsv, np.array([0, 0, 175]), np.array([179, 255, 255]))
krn = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 3))
dlt = cv2.dilate(msk, krn, iterations=1)
thr = 255 - cv2.bitwise_and(dlt, msk)
# OCR
d = pytesseract.image_to_string(thr, config="--psm 10")
print(d)
【讨论】:
以上是关于如何在图像中找到数字并阅读它们?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中导入 Excel 文件列并找到它们之间的相关系数?