使用 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,:);
但我会舍弃第一列。
我正在尝试计算二值图像的轮廓。目前我通过循环识别图像中的第一个非零和最后一个非零像素。有没有更好的办法?我遇到过几个函数:
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,:);
但我会舍弃第一列。