我有一个应用程序,用于识别网络摄像头图像中的动作。它产生类似以下内容......
黑色区域表示动作。这主要是基于每个像素完成的(尽管考虑了附近的像素)
所以......现在我的每个像素的运动都是真/假,我需要使用这些信息来识别对象轮廓。
我想要的是以下内容。
大纲不必精确,我可以接受一个边界框。如果我向你们展示两者,那么还有一些噪音更明显......
正如您所看到的,对象外部有一些“移动”像素。据推测,我通过指定对象的最小区域来消除这些。
那么,有哪些算法用于识别对象的边缘。理想情况下,我可以使用此信息计算每个对象的近似中心。
注意:如@mmgp所述,上面的图像都是全RGB,甚至是B& W。这是由于我生成图像以便导出的方式。在内部,它是一个Bit数组。
答案 0 :(得分:1)
这似乎是数学形态学的完美任务。要移除在这种情况下形成噪声的小物体,请按区域执行形态开口。在您的问题中很容易估计该区域,因为兴趣区域比不需要的区域大得多。现在你也想要消除大对象内部的洞(注意你的例子中有一些)。要执行此操作,请执行称为孔填充的操作,该操作将简单地丢弃从图像背景无法到达的那些点。此时,您可以继续检测对象的质心,但如果要使对象的边界更均匀,则可以使用具有小结构元素的形态扩张,或者可能使用形态学闭合来保留更多对象。 / p>
这些任务在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包中随时可用,因为它们非常基本和常见。
答案 1 :(得分: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
或者morphex适合更多通用形态学操作:
http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=morphology#morphologyex
它还具有 findContours 功能,您可以将其视为blob检测器。在你的情况下,你可以提供你的第一张图像(可能是在一些去除噪音的预处理后),它会返回你那些形状。如果需要,那些返回的形状很容易按区域过滤。
findContours docs: