如何在图像中找到数字并阅读它们?

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中添加数字

如何在 Python 中导入 Excel 文件列并找到它们之间的相关系数?

如何从 python 中的图像(或 pdf 文件)中提取名称和手写数字?

如何在 MATLAB 中读取包含数字的文本文件?

如何将图像中所有文本的强度(暗度)提高到一个级别?

如何在浏览器中直播图像?