【问题标题】:Identifying multiple (graphical) object's edges from points从点识别多个(图形)对象的边缘
【发布时间】:2012-12-08 22:46:12
【问题描述】:

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

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

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

我想要的是以下内容。

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

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

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

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

【问题讨论】:

    标签: .net image image-processing computer-vision object-detection


    【解决方案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');
    

    结果:

    两条闭合的白色曲线是其余对象的边界,黄色显示的是它们的质心。如果您想要这个答案的初始 cmets 中描述的“更软”的边界:

    h1 = imclose(h, strel('disk', 3));
    

    我看到您将其标记为 .net,但我希望这些工具可以在某些 .net 包中随时使用,因为它们非常基础和常见。

    【讨论】:

    • 现在我注意到我没有评论在答案中检测边缘。那是因为这里不需要它。给定一个对象,描述其边界的点很容易获得,因为它们与背景和对象内部的其他点都有接触。
    • 这看起来正是我需要做的。感谢您为我指明正确的方向。我不知道是否有一个 .Net 库可以让我这样做,或者我是否必须自己组装一个,但我会挖掘并回复你。我唯一真正关心的是速度(我怀疑我是否能够处理每个帧,但 1/秒会很好......)
    • 这些操作允许非常快速的实现。随着框架的发展,我听说过用于 .NET 的 AForge (code.google.com/p/aforge),但我不知道它实际上有多好。
    • 似乎没有具体的形态开放区域,但对于您的情况,这:aforgenet.com/framework/features/blobs_processing.html 是等效的。
    • 我过去曾避免使用 AForge,而是使用 emgu(和 OpenCV 实现),这在我的测试中速度更快,但我认为它的功能值得。非常感谢您的所有帮助
    【解决方案2】:

    我的建议是你使用 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功能,你可以把它想象成一个blob检测器。在您的情况下,您可以将您的第一张图像提供给它(可能经过一些去噪预处理之后),它会返回这些形状。如果需要,这些返回的形状很容易按区域过滤。

    findContours 文档:

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

    【讨论】:

    • 感谢您的建议,我会通读一遍。我已经设法使用 AForge 让它运行起来,但它没有我想要的那么高效
    • 不要被这个morphologyex所迷惑,它远不能进行通用的形态学操作。
    • 这就是我说“更多通用”的原因。好的,这可能会产生误导,所以morphologyex 实际上可以做的是文档中描述的那 5 种操作(打开、关闭、顶帽、黑帽、形态梯度),它们是扩张和腐蚀的组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多