可以通过MATLAB的 bwboundaries 函数标记二进制图像的边界。
如何以二进制图像的形式获取所有段的边界?
我已经对图像进行了分段,并想知道是否有办法在每个相邻段之间标记边界,而不对每个段应用形态学操作。
我添加了图片来说明我想要做的事情。实际上我想获得一个二进制图像,在所有段之间保持粉红色边界标记像素。因此,我可以借助Steve Eddins的imoverlay函数将它们与原始图像叠加在一起。
分割结果的随机彩色标记:
细分之间有明显标记的粉红色边界:
答案 0 :(得分:5)
您可以使用范围滤镜找到区域边界,该范围滤镜可查找每个像素邻域内的强度范围。这利用了标签矩阵在区域边界处仅具有非零范围的事实。
im = imread('http://i.stack.imgur.com/qPiA3.png');
boundaries = rangefilt(im,ones(3)) > 0;
imoverlay(label2rgb(im),boundaries,[0 0 0]);
这些边缘也是两个像素宽。实际上,我认为边缘必须是两个像素宽;否则区域将非均匀地“丢失”到边界的像素。
答案 1 :(得分:3)
由于侵蚀和扩张也适用于非二进制图像,您可以编写
img = imread('http://i.stack.imgur.com/qPiA3.png');
ei = imerode(img,ones(3));
di = imdilate(img,ones(3));
boundaries = ei~=img | di~=img;
这导致bw图像在每个彩色区域的边缘处具有边界(因此,边界线将是两个像素宽)。
请注意,这不会将像素的有序列表返回为bwboundaries
,而是返回bwperim
之类的逻辑掩码,这是imoverlay
输入所需的内容。
答案 2 :(得分:1)
作为一种循环方式,我想到了利用MATLAB的 edge 函数。 首先,我需要应用类似 label2gray 的操作。 标签是下面代码中的分段输出(问题中提供的第一个图像)。
grayLabels = mat2gray(255* double(labels) ./ double(max(labels(:)))); %label2gray
bw_boundaries = edge(grayLabels,0.001);