3

我有一个应用程序可以识别网络摄像头图像中的运动。它产生类似以下的东西......

在此处输入图像描述

黑色区域表示运动。这主要是在每个像素的基础上完成的(尽管考虑了附近的像素)

所以......现在我已经为每个像素设置了运动真/假,我需要使用该信息来识别对象轮廓。

我想要的是以下内容。

在此处输入图像描述

轮廓不必精确,我可以接受边界框。如果我将两者结合起来,还有一些噪音区域会更明显......

在此处输入图像描述

如您所见,对象外部有几个“运动”像素。据推测,我会通过指定对象的最小区域来消除这些。

那么,有哪些算法可以识别物体的边缘。理想情况下,我可以使用这些信息来计算每个对象的大致中心。

注意:正如@mmgp 所提到的,上面的图像都是全RGB,甚至是黑白的。这是由于我生成用于导出的图像的方式。在内部,它是一个位数组。

4

2 回答 2

1

这似乎是数学形态学的完美任务。要移除在这种情况下是噪声的小对象,请按区域执行形态学打开。该区域在您的问题中很容易估计,因为感兴趣的区域比不需要的区域大得多。现在您还想消除大对象内部的孔(请注意,您的示例中有一些孔)。为此,您执行称为孔填充的操作,该操作将简单地丢弃那些无法从图像背景到达的点。此时,您可以继续检测对象的质心,但如果您想让对象的边界更加统一,您可以使用具有小结构元素的形态膨胀或形态闭合来可能保留更多对象。

这些任务在 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 包中很容易获得,因为它们非常基本且常见。

于 2012-12-09T02:35:12.787 回答
1

我的建议是让你使用 emgu (opencv) 来完成这些任务,它比你可能知道的 matlab 复杂一点,但它更快。

OpenCV 已经为您实现了侵蚀和扩张形态操作:

http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=morphology#dilate

http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=morphology#erode

或morphologyex 适用于更通用的形态学操作

http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=morphology#morphologyex

它还具有findContours功能,您可以将其视为一个斑点检测器。在您的情况下,您可以将您的第一张图像提供给它(可能经过一些去噪预处理之后),它会返回这些形状。如果需要,这些返回的形状很容易按区域过滤。

findContours 文档:

http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours#findcontours

于 2012-12-18T13:06:38.610 回答