我正在尝试计算二进制图像的轮廓。目前,我通过循环识别图像中的第一个非零和最后一个非零像素。有没有更好的办法?我遇到了一些功能:
imcontour(I)
bwtraceboundary(bw,P,fstep,conn,n,dir)
但是第一个没有返回轮廓的x和y坐标。第二个功能需要一个我无法提供的种子点。图像的示例如下所示。感谢。
答案 0 :(得分:6)
我很惊讶你没有看到bwperim
。你没试过bwperim
吗?这将查找二进制图像中所有白色关闭对象的周边像素。直接从StackOverflow使用您的图像:
im = im2bw(imread('http://i.stack.imgur.com/yAZ5L.png'));
out = bwperim(im);
imshow(out);
我们得到:
答案 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);
然而,这里的边界更厚而不是使用bwperim
,因为像素在对象的内部和外部都被遮挡。
答案 2 :(得分:1)
我遇到了同样的问题,偶然发现了这个问题,只是想补充说 imcontour(Img);
会返回一个矩阵。第一行包含x值,第二行包含y值。
contour = imcontour(Img); x = contour(1,:); y = contour(2,:);
但我会弃掉第一栏。