使用matlab计算二进制图像的轮廓

时间:2015-09-16 10:16:17

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

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

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

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

enter image description here

3 个答案:

答案 0 :(得分:6)

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

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

我们得到:

enter image description here

答案 1 :(得分: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);

enter image description here

然而,这里的边界更厚而不是使用bwperim,因为像素在对象的内部和外部都被遮挡。

答案 2 :(得分:1)

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

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

但我会弃掉第一栏。