10

我有一张图像是深度热图,我已经过滤掉了比图像的前 25% 更远的任何东西。

它看起来像这样: 在此处输入图像描述

图像中有两块颜色,一个是我的手(我的一部分脸在后面),另一个是左下角的桌子。如何搜索图像以找到这些 blob?如果可能的话,我希望能够在它们周围画一个矩形。

我也可以这样做(忽略阴影,过滤成黑色或白色): 在此处输入图像描述

4

5 回答 5

4

选择一个随机像素作为种子像素。这成为区域 A。重复扩展 A 直到 A 不再变大。那是你的区域。

扩展 A 的方法是寻找 A 的相邻像素,使它们与 A 中的至少一个相邻像素具有相似的颜色。

“相似的颜色”对您意味着什么是可变的。如果您可以准确地制作两种颜色,正如您在另一个答案中所说,那么“相似”就是“相等”。否则,“相似”将意味着具有 RGB 值的颜色或类似的颜色,其中两种颜色的每个分量彼此相差很小(即 255、128、128 类似于 252、125、130)。

您还可以限制所选像素,使它们必须与种子像素相似,但在人类采摘种子时效果更好。(例如,我相信这是在 Photoshop 中所做的。)

这可能比边缘检测更好,因为您可以处理梯度而不会将它们过滤掉,并且您不需要将生成的检测到的边缘处理成相干区域。它的缺点是渐变可以从黑色一直到白色,并且它会注册为同一区域,但这可能是您想要的。此外,您必须小心实施,否则会太慢。

于 2011-01-24T19:55:41.437 回答
3

如果图像真的只有两种或更多不同的颜色(颜色之间的模糊非常少),那么边缘检测算法很容易实现。

于 2011-01-24T19:48:48.693 回答
3

对于您需要的东西,这可能有点过头了,但是 OpenCV 库的 C# 有一个很好的包装器。

我已经成功地在 C++ 中使用 OpenCV 进行 blob 检测,因此您可能会发现它对您正在尝试做的事情很有用。

http://www.emgu.com/wiki/index.php/Main_Page

以及 OpenCV 上的 wiki 页面:

http://en.wikipedia.org/wiki/OpenCV

编辑添加:这是 C# 中 Emgu 的 blob 检测库。甚至还有一些按面积降序排列 blob 的好功能(对于滤除噪声很有用)。

http://www.emgu.com/forum/viewtopic.php?f=3&t=205

再次编辑:

如果 Emgu 过于重量级,Aforge.NET 还包括一些 blob 检测方法

http://www.aforgenet.com/framework/

于 2011-01-24T19:56:53.060 回答
2

您可以使用类似于此问题中的代码示例的内容:find a color in an image in c#

它将帮助您找到图像中特定颜色的 x/y。然后你可以使用 min x/max x 和 min y/max y 来绘制你的矩形。

于 2011-01-24T19:55:23.023 回答
2

C#根据对象颜色从图像中检测对象。

要根据颜色检测对象,有一个简单的算法。您必须选择一种过滤方法。步骤通常是:

  1. 拍摄图像
  2. 应用你的过滤
  3. 应用灰度
  4. 减去背景并获取您的对象
  5. 查找所有对象的位置
  6. 标记对象

首先你要选择一种过滤方式,C#提供了很多过滤方式。主要是我更喜欢 AForge 过滤器,为此他们有几个过滤器:

  1. 颜色过滤
  2. 频道过滤
  3. HSL过滤
  4. YCbCr过滤
  5. 欧几里得颜色过滤

我最喜欢的是 EuclideanColorFiltering。这很容易和简单。有关其他过滤器的信息,您可以访问下面的链接。您必须下载 AForge dll 才能在您的代码中应用这些。可以在此处找到有关确切步骤的更多信息:链接

于 2017-11-20T14:28:01.707 回答