21

我想从这种图片中捕获数字。

在此处输入图像描述

我从以下链接尝试了多尺度匹配。

http://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/

我只想知道红色数字。但问题是,openCV 识别/匹配模板的红色数字是模糊的。是否有其他可能的方法来检测黑色背景上的这个红色数字?

4

2 回答 2

19

分类数字

您在评论中澄清说您已经隔离了图像预检测的数字部分,所以我将从这个假设开始。

也许您可以通过将其视为手写数字来近似数字的透视效果和“模糊性”。在这种情况下,有一个著名的手写数字数据集用于分类训练,称为 mnist。

Yann LeCun 在mnist handwritten dataset 中列举了这个数据集的最新技术。

在频谱的远端,卷积神经网络产生的错误率极低(1% 的错误率)。对于更简单的解决方案,使用去偏斜、去噪、模糊和 2 像素移位的 k 近邻会产生大约 1% 的误差,并且实施起来明显更快。Python opencv 有一个实现。具有去偏斜的神经网络和支持向量机也有一些令人印象深刻的性能。

请注意,卷积网络不会让您选择自己的特征,因此此处重要的色差信息可能仅用于缩小感兴趣区域。定义特征空间的其他方法可能会更精确地结合已知的色差。

Python 在很棒的包 sklearn 中支持很多机器学习技术——这里是 sklearn 应用于 mnist 的示例如果你正在寻找关于 Python 机器学习的教程解释,sklearn 自己的教程非常冗长

从 sklearn 链接: 分类 mnist

如果您使用这种方法学习,这些就是您尝试分类的项目类型。为了强调开始训练这些基于机器学习的分类器是多么容易,这里是链接 sklearn 包中示例代码的节选部分:

digits = datasets.load_digits() # built-in to sklearn!
data = digits.images.reshape((len(digits.images), -1))

# Create a classifier: a support vector classifier
classifier = svm.SVC(gamma=0.001)

# We learn the digits on the first half of the digits
classifier.fit(data[:n_samples / 2], digits.target[:n_samples / 2])

如果你喜欢 openCv(可能是因为你想在未来移植到实时系统),opencv3/python也有关于这个主题的教程!他们的演示使用 k-nearest-neighbor(列在 LeCun 页面中),但他们也有 svm 和 sklearn中的许多其他工具。他们使用 SVM 的 ocr 页面使用去偏斜,这可能对您的问题中的透视效果有用:

歪斜的数字


更新:我在您的图像上使用了上面概述的开箱即用的 skimage 方法,经过大量裁剪,并且正确分类了它。需要进行更多测试才能确定这在实践中是否可靠

在此处输入图像描述

^^ 那个小图像是您嵌入问题中的图像的 8x8 裁剪。mnist 是 8x8 图像。这就是为什么它在 skimage 中使用默认参数在不到一秒的时间内进行训练的原因。

我通过使用将其放大到 mnist 范围将其转换为正确的格式

number = scipy.misc.imread("cropped_image.png")
datum  =  (number[:,:,0]*15).astype(int).reshape((64,))
classifier.predict(datum) # returns 8

我没有从示例中更改任何其他内容;在这里,我只使用第一个通道进行分类,没有智能特征计算。15 左右看着我;您需要对其进行调整以达到目标范围或(理想情况下)提供您自己的训练和测试集


物体检测

如果您还没有隔离图像中的数字,您将需要一个对象检测器。关于这个问题的文献空间是巨大的,我不会从那个兔子洞开始(谷歌 Viola 和 Jones,也许?)这个博客涵盖了 Python 中“滑动窗口”检测器的基础知识。Adrian Rosebrock 看起来他甚至是 SO 的贡献者,并且该页面有一些很好的 opencv 和基于 python 的对象检测器的例子,相当教程(你实际上在你的问题中链接到那个博客,我没有意识到)。

简而言之,对图像中的窗口进行分类并选择置信度最高的窗口。用感兴趣的区域缩小搜索空间当然会在所有性能领域产生巨大的改进

于 2016-06-05T19:28:26.720 回答
3

您可以利用以下几件事来发挥自己的优势:

  • 数字在黑色矩形边框和一种颜色内
  • 该数字似乎是分段 LCD 类型的显示器,如果是这样,则只有有限数量的段处于关闭或打开状态。

所以我建议你:

  • 校准您的相机并预处理图像以消除镜头失真
  • 矫正显示矩形:
    • 使用霍夫线的交点或边缘检测然后轮廓检测来检测显示矩形,然后选择最大、最正方形的轮廓
    • 用于GetPerspectiveTransform获取图像坐标和理想矩形之间的变换,然后使用变换输入图像WarpPerspective
  • 将图像拆分为 R、G 和 B 通道并计算出来r - avg(g, b),这有点依赖于照明,但应该给出如下内容:

    清理数字图像

  • 然后尝试对此进行模式匹配,或者重新分割图像并尝试查找点亮的显示段,或者运行 OCR 包。
于 2016-06-08T13:53:16.003 回答