使用 matlab 计算二值图像的轮廓

Compute contour of a binary image using matlab

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

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

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

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

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

我们得到:

@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 更厚,因为像素在对象的内部和外部都被遮盖了。

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

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

但我会舍弃第一列。