我有一个深度热图的图像,我已经过滤了比图像的前25%更远的任何东西。
它看起来像这样:
图像中有两种颜色,一种是我的手(我脸后面有一部分),另一种是左下角的桌子。如何搜索图像以找到这些斑点?如果可能的话,我希望能够在它们周围画一个矩形。
我也可以这样做(忽略阴影,过滤为黑色或白色):
答案 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检测方法
答案 3 :(得分:1)
您可以使用此问题的代码示例:find a color in an image in c#
它可以帮助您找到图像中特定颜色的x / y。然后你可以使用min x / max x和min y / max y来绘制矩形。
答案 4 :(得分:1)
通过C#基于对象颜色从图像中检测对象。
要根据颜色检测对象,可以使用简单的算法。你必须选择一种过滤方法。步骤通常是:
首先你必须选择一种过滤方法,为C#提供了许多过滤方法。主要是我更喜欢AForge过滤器,为此他们几乎没有过滤器:
我最喜欢的是EuclideanColorFiltering。它简单易行。有关其他过滤器的信息,您可以访问以下链接。您必须下载AForge dll才能在代码中应用这些内容。 有关确切步骤的更多信息,请访问:Link