【问题标题】:Compute contour of a binary image using matlab使用matlab计算二值图像的轮廓
【发布时间】:2015-12-12 20:59:27
【问题描述】:

我正在尝试计算二值图像的轮廓。目前我通过循环识别图像中的第一个非零和最后一个非零像素。有没有更好的办法?我遇到的功能很少:

imcontour(I)
bwtraceboundary(bw,P,fstep,conn,n,dir)

但第一个不返回轮廓的 x 和 y 坐标。第二个功能需要一个我无法提供的种子点。图像示例如下所示。谢谢。

【问题讨论】:

  • 但是如果你已经有一个二值图像,为什么不能按照Matlab tutorial 中列出的步骤进行操作?
  • 它需要一个种子点“确定要跟踪的对象边界上像素的行和列坐标 bwboundary 将此点作为边界跟踪的起始位置。”。我做不到。
  • 你为什么不能这样做?
  • @rayryeng 看起来他现在生你的气,给了我答案哈哈哈顺便说一句,恭喜你获得金徽章!
  • @imaluengo 哈哈谢谢 :)

标签: image matlab image-processing computer-vision contour


【解决方案1】:

我很惊讶你没有看到bwperim。你没试过bwperim吗?这会找到二进制图像中所有白色的封闭对象的周边像素。直接从 StackOverflow 使用您的图像:

im = im2bw(imread('http://i.stack.imgur.com/yAZ5L.png')); 
out = bwperim(im);
imshow(out);

我们得到:

【讨论】:

    【解决方案2】:

    @rayryeng 已经提供了正确答案。作为另一种方法(可能是bwperim 在内部执行此操作)binary 图像的边界可以通过计算扩张和侵蚀图像之间的差异来获得。

    对于给定的图像:

    im = im2bw(imread('http://i.stack.imgur.com/yAZ5L.png'));
    

    和给定的二元结构元素:

    selem = ones(3,3); %// square, 8-Negihbours
    % selem = [0 1 0; 1 0 1; 0 1 0]; %// cross, 4-Neighbours
    

    物体的轮廓可以提取为:

    out = imerode(im, selem) ~= imdilate(im, selem);
    

    然而,这里的边界比使用bwperim 更厚,因为像素在对象的内部和外部都被屏蔽了。

    【讨论】:

    • 腐蚀减去膨胀当然是一种有效的方法。 +1。
    • 我认为你真的只需要一个或另一个(即只是腐蚀膨胀)。例如:out = im & ~imerode(im, selem); 这将使线条变细。
    • @gnovice 是的,但轮廓将在对象内部或外部。对于不同的应用,一种可能比另一种更好,这是相当主观的。
    【解决方案3】:

    我遇到了同样的问题,偶然发现了这个问题,只是想补充一点, imcontour(Img); 确实返回了一个矩阵。第一行包含 x 值,第二行包含 y 值。

    contour = imcontour(Img); x = contour(1,:); y = contour(2,:);

    但我会丢弃第一列。

    【讨论】:

    • Here is the definition of the array returned。第一列给出轮廓中元素的数量。如果有多个轮廓,它们将被连接起来,您需要使用这个元素数量来知道在哪里切割数组。
    • 哦,太好了,谢谢。我想知道这些数字是什么意思。
    猜你喜欢
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多