图像分割后的高效分段边界标记

问题描述 投票:0回答:3

可以通过 MATLAB 的 bwboundaries 函数标记二值图像的边界。

如何获取所有片段的边界作为二值图像?

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

我添加了图像来说明我想做的事情。实际上我想获得一个二进制图像,在所有段之间保留粉红色边界标记像素。因此,我可以借助 Steve Eddins 的 imoverlay 功能将它们与原始图像叠加。

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

enter image description here

各段之间粗略标记的粉红色边界:

enter image description here

matlab image-processing image-segmentation boundary mathematical-morphology
3个回答
5
投票

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

im = imread('https://i.sstatic.net/qPiA3.png');
boundaries = rangefilt(im,ones(3)) > 0;
imoverlay(label2rgb(im),boundaries,[0 0 0]);

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


3
投票

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

img = imread('https://i.sstatic.net/qPiA3.png');
ei = imerode(img,ones(3));
di = imdilate(img,ones(3));
boundaries = ei~=img | di~=img;

这会产生一个黑白图像,每个彩色区域的边缘都有一个边界(因此,边界线将是两个像素宽)。

enter image description here

请注意,这不会返回像

bwboundaries
这样的有序像素列表,而是返回像
bwperim
这样的逻辑掩码,这就是
imoverlay
需要的输入。


1
投票

作为一种迂回的方式,我想到了利用MATLAB的edge函数。 首先,我需要应用类似 label2gray 操作的东西。 labels是下面代码中的分割输出(问题中提供的第一张图像)。

grayLabels = mat2gray(255* double(labels) ./ double(max(labels(:)))); %label2gray
bw_boundaries = edge(grayLabels,0.001);
© www.soinside.com 2019 - 2024. All rights reserved.