Matlab 图像分割后的有效分割边界标记

Matlab 图像分割后的有效分割边界标记,matlab,boundary,image-segmentation,morphological-analysis,Matlab,Boundary,Image Segmentation,Morphological Analysis,利用MATLAB的边界函数可以标记二值图像的边界 为了获得作为二值图像的所有段的边界,应该做些什么 我已经分割了一幅图像,想知道是否有一种方法可以标记每个相邻片段之间的边界,而无需对每个片段应用形态学操作 我添加了一些图片来说明我想做什么。实际上,我想得到一个二值图像,它在所有线段之间保持粉红色的边界标记像素。因此,我可以通过Steve Eddins的功能将它们与原始图像叠加 分割结果的随机彩色标签: 分段之间大致标记的粉红色边界: 由于腐蚀和膨胀也适用于非二进制图像,因此您可以编写 img

利用MATLAB的边界函数可以标记二值图像的边界

为了获得作为二值图像的所有段的边界,应该做些什么

我已经分割了一幅图像,想知道是否有一种方法可以标记每个相邻片段之间的边界,而无需对每个片段应用形态学操作

我添加了一些图片来说明我想做什么。实际上,我想得到一个二值图像,它在所有线段之间保持粉红色的边界标记像素。因此,我可以通过Steve Eddins的功能将它们与原始图像叠加

分割结果的随机彩色标签:

分段之间大致标记的粉红色边界:


由于腐蚀和膨胀也适用于非二进制图像,因此您可以编写

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图像在每个彩色区域的边缘具有边界(因此,边界线将为两个像素宽)


请注意,这不会将像素的有序列表返回为
bwbounders
,而是像
bwperim
这样的逻辑掩码,这是
iOverlay
需要的输入

可以使用范围过滤器查找区域边界,该过滤器可以查找每个像素邻域内的强度范围。这利用了标签矩阵在区域边界处仅具有非零范围这一事实

im = imread('http://i.stack.imgur.com/qPiA3.png');
boundaries = rangefilt(im,ones(3)) > 0;
imoverlay(label2rgb(im),boundaries,[0 0 0]);

这些边也有两个像素宽。实际上,我认为边缘必须有两个像素宽;否则,区域将不均匀地“丢失”像素到边界。

作为一种迂回的方法,我考虑使用MATLAB的边缘函数。 首先,我需要应用label2gray操作之类的东西。标签是下面代码中的分段输出(问题中提供的第一幅图像)

grayLabels = mat2gray(255* double(labels) ./ double(max(labels(:)))); %label2gray
bw_boundaries = edge(grayLabels,0.001);

你能举一个具体的例子说明你想做什么吗?非常感谢。我错过了你提到的关于侵蚀扩张的第一个事实。这很有帮助。@Gulcan:如果你关心速度,你可能想用
strel
而不是
one
作为面具,即
strel('square',3)
而不是
one(3)
。这将使用更快的可分离过滤器。感谢您的解决方案。这是一个很好的情况,你是对的。我意识到你的解决方案比以前提出的侵蚀扩张的解决方案略快。对于这种方法,只需规范化标签矩阵:
nim=im-min(im(:);nim=nim/max(nim(:)。几乎所有的MATLAB图像处理函数都是在double类型的标准化矩阵上工作的。其次,在这种情况下,梯度方法不能找到所有的边缘像素。显示覆盖图并近距离查看区域角。是的,我知道:)我需要根据标记图像中指定的最大值调整0.001硬阈值。