【问题标题】:Image recognizing with counting pixels of specific color, using opencv使用opencv计算特定颜色像素的图像识别
【发布时间】:2018-09-27 15:03:41
【问题描述】:

我的代码得到了许多带有数字的小图像。我尝试将其与我的模板进行比较并获得正确的数据。成功了。。

original= cv2.imread('im/10.png')
sought = (254,254,254)
result = np.count_nonzero(np.all(original==sought,axis=2))

正如您在这些情况下所看到的,白色数字位于图片的不同角落,没问题,结果(白色像素的数量)相等,我得到了 18=18。 但是现在有新照片,.

首先,这里的数字不是 (254,254,254)。我认为图像可能更暗淡。或质量较差,我尝试使用:

result = np.count_nonzero(np.all(original > 200,axis=2))

不幸的是,它给了我不同的数据。两张里面有13个的不等号。

我想要什么:

从深色背景中指出白色数字的方法,除了周围的细白圈。 (在 13 张图片中)圆圈不是问题,如果我在中心裁剪图像并去掉圆圈,我的结果不会改变 - 13 仍然!= 13。

也许可以将图像转换为灰度,也许是 HSV,也许只是为了使其更亮或对比度更高。

像素计数对我有好处,它非常快速且通常准确。

我再重复一遍:现在我的代码看到两张图片有 13 个不同(有不同的颜色,或亮度或黑白比例,我不知道)我想摆脱这个问题。

【问题讨论】:

  • 您应该尝试使用 OTSU 作为第一步的阈值,然后(取决于结果)直接计算所有非零像素。
  • 你通过计算像素来识别物体的方法是错误的。
  • 像素计数作为区分数字/字母的方法不太可能非常准确。尝试使用 Google 搜索 “模板匹配” 和/或 “光学字符识别”Tesseract。祝你好运!

标签: python opencv


【解决方案1】:

我建议您首先对图像进行阈值处理,这意味着带有字母的像素将具有 255 的值,其余的将具有 0 的值。这可以通过 OpenCV 的 Adaptive Threshold 函数来完成(您可以查看this 的答案)。

然后,您将需要一种更好的方法来确定数字。简单地计算白色像素的数量还不够稳健。例如,数字 1331 应该具有相同数量的白色像素。这可能会破坏您的算法。

这里最好的解决方案是人工智能。例如,您可以查看 Python Tesseract,但有很多 Python 包和教程。只需 Google this,您就会得到有用的答案,例如 this 之一。甚至还有this 之类的教程。

如果您不想使用 AI,那么您的算法总会在某个地方出现问题。

【讨论】:

  • 好的,我的问题是:有什么办法可以去除噪点,我的照片没有完美的黑色背景,有一些白色阴影,我想指出其他部分的白色数字图像,使它们更亮或对比度更高..
  • 我提出的AdaptiveThreshold 方法确实可以消除噪音,并且如果图像看起来像您的问题中的图像,效果会很好。 Thresholding 将嘈杂的图像变成完美的0/255 图像。如果你想摆脱圆圈,你可以尝试拨号然后破坏你的图像(参见this教程)。
猜你喜欢
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 2015-03-29
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
相关资源
最近更新 更多