python - 如何使用 openCV 对模糊数字进行分类

标签 python opencv edge-detection number-recognition

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

enter image description here

我尝试通过以下链接进行多尺度匹配。

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

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

最佳答案

分类数字

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

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

Yann LeCun 在此处列举了此数据集的最新技术水平 mnist hand-written dataset .

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

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

Python 在很棒的包 sklearn - here are examples of sklearn applied to mnist 中支持许多机器学习技术. 如果您正在寻找 Python 中机器学习的教程解释,sklearn's own tutorial is very verbose

来自 sklearn 链接: Classifying 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 has a tutorial on this exact topic too !他们的演示使用 k-nearest-neighbor(列在 LeCun 页面中),但他们也使用了 have svms以及 sklearn 中的许多其他工具。他们使用 SVM 的 ocr 页面使用去偏斜,这可能对您问题中的透视效果有用:

Deskewed digit


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

enter image description here

^^ 那个小图像是您嵌入问题中的图像的 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

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


物体检测

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

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

关于python - 如何使用 openCV 对模糊数字进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37645576/

相关文章:

python - 使用 pandas 在依赖于另一列的一列上有效地应用操作

python - 需要用 facebook.py 列出所有 friend

opencv - 动态图像大小调整的 GPU 与 CPU 端到端延迟

opencv - opencv关闭相机

image - 自动检测图像拼贴

python - 我可以可视化 datasets.Dataset 的内容吗?

python - TCP/IP Server-Client 是否有数据发送限制?

c++ - 相互比较点元素的最快方法是什么?我已经使用 Nested for loop 来做到这一点,但是速度很慢

opencv - 使用openCV查找图像中的角坐标

c++ - 低对比度分割深度图像