【问题标题】:How to remove white noise and Connected Component extraction in OpenCV?如何去除 OpenCV 中的白噪声和连通分量提取?
【发布时间】:2020-12-19 13:27:07
【问题描述】:

我正在开发一个数独求解器,它从摄像机(笔记本电脑)获取输入并对其进行处理,将数独图像解析为列表列表,对其进行求解,然后将解决方案投射回工作表上。

我现在需要从图像中识别每个数字。我正在使用 MNIST 数据集来训练我的模型,该模型期望每个输入图像的形状为 (28, 28, 1),我能够成功定位并提取每个数字,但对数字执行任何类型的阈值会导致数字周围有很多噪音,最终导致我的模型错误分类。

有什么方法可以去除白噪声,只从正方形中提取数字,然后将其输入到 Keras 模型中。

我认为这可以通过使用cv2.connectedComponentsWithStats 通过提取最大的连通分量来实现,但我不知道该方法是如何工作的(以及它期望的参数或方法的输出),我找不到很好的解释如何使用它。

如果除了使用cv2.connectedComponentsWithStats 之外还有其他方法可以产生更好的结果,请提出建议,如果没有,请解释cv2.connectedComponentsWithStats 方法的工作原理,或者请指出一个可以帮助我理解它的好资源以及如何将它用于我的具体情况。

PS。如果您认为 MNIST 不是此任务的好数据集,请说明原因以及任何其他可能实现数字识别任务的数据集。

【问题讨论】:

  • 你应该在阈值之前减少噪音,这总是更容易的选择。

标签: python image-processing keras opencv3.0 opencv-python


【解决方案1】:

要消除噪音,您可以使用erosion。它用于过滤掉白色像素并“填充(白色)间隙”。 每个白色区域都会变小,非常小的区域会消失。数字看起来会更细。

然后您可以放大dilate 以获得与原始图像更相似的图像(较细的数字会变得更胖,看起来像原始图像,即使差异很小)。

此操作称为打开。见https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html

例子:

import cv2
import numpy as np

img = cv2.imread('input.jpg',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
dilatation = cv2.dilate(erosion,kernel,iterations = 1)

编辑一个 (3,3) 的核用于膨胀使图像不那么模糊。

输入

侵蚀

膨胀

【讨论】:

  • 感谢您的回答,但我熟悉侵蚀后的膨胀(正如您所提到的,这只不过是打开),即使这样做之后图像中仍有大量噪点,因此我的模型对其进行了错误分类...大多数错误分类类似于将 6 预测为 8/5 或 7 为 2/1...有什么方法可以仅从正方形中提取数字吗?或者这可以通过使用connectedComponentsWithStats来实现吗?
  • 侵蚀后图像中没有太多噪点。如果您能够在手之前找到方块,您可以拍摄腐蚀的图像并将其提供给 svm 或您正在使用的任何 keras 模型。即使是模板匹配也可以在这里工作,不需要神经网络。
【解决方案2】:

忽略小斑点(小宽度、小高度和/或小区域)。同时,你可以忽略大的。

要跳过网格线,建议重建网格几何体(使用字符来定位网格列/行,并可能检测长直线),并且只将斑点完全保留在单元格内。

【讨论】:

    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多