我有一张图像是深度热图,我已经过滤掉了比图像的前 25% 更远的任何东西。
它看起来像这样:
图像中有两块颜色,一个是我的手(我的一部分脸在后面),另一个是左下角的桌子。如何搜索图像以找到这些 blob?如果可能的话,我希望能够在它们周围画一个矩形。
我也可以这样做(忽略阴影,过滤成黑色或白色):
我有一张图像是深度热图,我已经过滤掉了比图像的前 25% 更远的任何东西。
它看起来像这样:
图像中有两块颜色,一个是我的手(我的一部分脸在后面),另一个是左下角的桌子。如何搜索图像以找到这些 blob?如果可能的话,我希望能够在它们周围画一个矩形。
我也可以这样做(忽略阴影,过滤成黑色或白色):
选择一个随机像素作为种子像素。这成为区域 A。重复扩展 A 直到 A 不再变大。那是你的区域。
扩展 A 的方法是寻找 A 的相邻像素,使它们与 A 中的至少一个相邻像素具有相似的颜色。
“相似的颜色”对您意味着什么是可变的。如果您可以准确地制作两种颜色,正如您在另一个答案中所说,那么“相似”就是“相等”。否则,“相似”将意味着具有 RGB 值的颜色或类似的颜色,其中两种颜色的每个分量彼此相差很小(即 255、128、128 类似于 252、125、130)。
您还可以限制所选像素,使它们必须与种子像素相似,但在人类采摘种子时效果更好。(例如,我相信这是在 Photoshop 中所做的。)
这可能比边缘检测更好,因为您可以处理梯度而不会将它们过滤掉,并且您不需要将生成的检测到的边缘处理成相干区域。它的缺点是渐变可以从黑色一直到白色,并且它会注册为同一区域,但这可能是您想要的。此外,您必须小心实施,否则会太慢。
如果图像真的只有两种或更多不同的颜色(颜色之间的模糊非常少),那么边缘检测算法很容易实现。
对于您需要的东西,这可能有点过头了,但是 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 检测方法
您可以使用类似于此问题中的代码示例的内容:find a color in an image in c#
它将帮助您找到图像中特定颜色的 x/y。然后你可以使用 min x/max x 和 min y/max y 来绘制你的矩形。
C#根据对象颜色从图像中检测对象。
要根据颜色检测对象,有一个简单的算法。您必须选择一种过滤方法。步骤通常是:
首先你要选择一种过滤方式,C#提供了很多过滤方式。主要是我更喜欢 AForge 过滤器,为此他们有几个过滤器:
我最喜欢的是 EuclideanColorFiltering。这很容易和简单。有关其他过滤器的信息,您可以访问下面的链接。您必须下载 AForge dll 才能在您的代码中应用这些。可以在此处找到有关确切步骤的更多信息:链接