可以通过 MATLAB 的bwboundaries函数来标记二值图像的边界。
应该怎么做才能将所有段的边界作为二值图像获取?
我已经分割了一个图像,想知道是否有一种方法可以标记每个相邻段之间的边界,而无需在每个段上应用形态学操作。
我添加了图像来说明我想要做什么。实际上我想获得一个在所有段之间保持粉红色边界标记像素的二进制图像。因此,我可以借助 Steve Eddins 的imoverlay功能将它们与原始图像叠加。
分割结果的随机彩色标记:
段之间粗略标记的粉红色边界:
可以通过 MATLAB 的bwboundaries函数来标记二值图像的边界。
应该怎么做才能将所有段的边界作为二值图像获取?
我已经分割了一个图像,想知道是否有一种方法可以标记每个相邻段之间的边界,而无需在每个段上应用形态学操作。
我添加了图像来说明我想要做什么。实际上我想获得一个在所有段之间保持粉红色边界标记像素的二进制图像。因此,我可以借助 Steve Eddins 的imoverlay功能将它们与原始图像叠加。
分割结果的随机彩色标记:
段之间粗略标记的粉红色边界:
您可以使用范围过滤器找到区域边界,该过滤器可以找到每个像素邻域内的强度范围。这利用了标签矩阵在区域边界处仅具有非零范围的事实。
im = imread('http://i.stack.imgur.com/qPiA3.png');
boundaries = rangefilt(im,ones(3)) > 0;
imoverlay(label2rgb(im),boundaries,[0 0 0]);
这些边缘也是两个像素宽。实际上,我认为边缘必须是两个像素宽;否则,这些区域将不均匀地将像素“丢失”到边界。
由于腐蚀和膨胀也适用于非二进制图像,因此您可以编写
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
需要作为输入的。
作为一种迂回的方式,我想到了利用 MATLAB 的边缘函数。首先,我需要应用类似label2gray的操作。标签是下面代码中的分割输出(问题中提供的第一张图像)。
grayLabels = mat2gray(255* double(labels) ./ double(max(labels(:)))); %label2gray
bw_boundaries = edge(grayLabels,0.001);