我有一个应用程序可以识别网络摄像头图像中的运动。它产生如下内容......
黑色区域表示运动。这主要是在每个像素的基础上完成的(尽管考虑了附近的像素)
所以...现在我已经为每个像素设置了真/假运动,我需要使用该信息来识别对象轮廓。
我想要的是类似下面的内容。
轮廓不必非常精确,我可以接受边界框。还有一些噪音区域,如果我向您展示它们的组合,这些区域会更明显...
如您所见,对象外部有几个“运动”像素。据推测,我会通过为对象指定最小面积来消除这些。
那么,有哪些算法可以识别物体的边缘。理想情况下,我随后能够使用此信息来计算每个对象的大致中心。
注意:正如@mmgp 所提到的,上面的图像都是全 RGB,甚至是黑白图像。这是由于我生成导出图像的方式所致。在内部,它是一个位数组。
最佳答案
这似乎是数学形态学的完美任务。要移除在本例中构成噪声的小对象,请按区域执行形态学开运算。在您的问题中很容易估计该区域,因为感兴趣的区域比不需要的区域大得多。现在您还想消除大对象内部的孔洞(请注意您的示例中有一些孔洞)。为此,您需要执行一项称为孔填充的操作,该操作将简单地丢弃那些无法从图像背景中到达的点。在这一点上,您可以继续检测对象的质心,但是如果您想使对象的边界更加统一,您可以使用具有小结构元素的形态学膨胀或形态学闭合来可能保留更多对象。
这些任务在 Matlab 中执行为:
f = imread('http://i.stack.imgur.com/DexHs.png');
% The PNG is in RGB, but it actually describes a binary image.
f = ~im2bw(f, 0);
g = bwareaopen(f, 100); % 100 is the maximum area for unwanted objects here
h = imfill(g, 'holes');
l = bwlabel(h);
cent = regionprops(l, 'centroid');
结果是:
两条闭合的白色曲线是其余对象的边界,黄色是它们的质心。如果您想要一个“更软”的边界,如本答案的初始评论中所述:
h1 = imclose(h, strel('disk', 3));
我看到您将其标记为 .net,但我希望这些工具在某些 .net 包中很容易获得,因为它们非常基本和常见。
关于.net - 从点识别多个(图形)对象的边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13782713/