检测图像中的一团颜色

时间:2011-01-24 19:46:19

标签: c# image-processing nui

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

它看起来像这样: enter image description here

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

我也可以这样做(忽略阴影,过滤为黑色或白色): enter image description here

5 个答案:

答案 0 :(得分:3)

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

扩展A的方法是通过查找A的邻居像素,使其与A中的至少一个相邻像素具有相似的颜色。

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

您还可以限制所选像素,使它们必须与种子像素类似,但是当人类拾取种子时效果更好。 (我相信这就是Photoshop中的功能。)

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

答案 1 :(得分:2)

如果图像实际上只有两种或更多种不同的颜色(颜色之间的模糊很少),那么edge detection算法很容易。

答案 2 :(得分:2)

对于你需要的东西可能有点过分,但是对于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/

答案 3 :(得分:1)

您可以使用此问题的代码示例:find a color in an image in c#

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

答案 4 :(得分:1)

通过C#基于对象颜色从图像中检测对象。

要根据颜色检测对象,可以使用简单的算法。你必须选择一种过滤方法。步骤通常是:

  1. 拍摄图片
  2. 应用您的过滤
  3. 应用greyscalling
  4. 减去背景并获取对象
  5. 查找所有对象的位置
  6. 标记对象
  7. 首先你必须选择一种过滤方法,为C#提供了许多过滤方法。主要是我更喜欢AForge过滤器,为此他们几乎没有过滤器:

    1. ColorFiltering
    2. ChannelFiltering
    3. HSLFiltering
    4. YCbCrFiltering
    5. EuclideanColorFiltering
    6. 我最喜欢的是EuclideanColorFiltering。它简单易行。有关其他过滤器的信息,您可以访问以下链接。您必须下载AForge dll才能在代码中应用这些内容。 有关确切步骤的更多信息,请访问:Link