如何在此蒙版中分割出感兴趣的区域

时间:2015-05-29 18:49:57

标签: matlab image-processing

嗨我得到了这个面具,我尝试将左面板分割出来。

enter image description here

我使用了分水岭方法,所以希望它会为左侧面板返回一个单独的值。

D = bwdist(~mask);
imshow(D,[],'InitialMagnification','fit');

enter image description here

Di = -D;
Di(~mask) = -Inf;
L = watershed(Di);
Lrgb = label2rgb(L,'jet');
imshow(Lrgb);

但我得到了这个,任何人都可以帮助我,或者你在分割方面有更好的建议。

enter image description here

3 个答案:

答案 0 :(得分:1)

使用bwconncomp来引用您的答案肯定是一种有效的方法,但问题在于,如果您查看本书的书脊,则会连接左右页面。因此,如果您尝试按照建议操作,整本书将被标记为单个对象,而这可能不是您想要的。因此,我建议首先分开页面,然后在完成后应用标记算法。

具有垂直线结构元素的简单形态开放滤波器应该可以解决问题。为了获得好的结果,我使用了一条长度为100的线。你还有一些不必要的边框像素,图像实际上是RGB。因此,我要将图像转换为二进制,然后清除边框:

mask = imclearborder(im2bw(imread('http://i.stack.imgur.com/xUyDQ.png')));

我直接从StackOverflow读取你的图像。接下来,我们将应用我所谈论的形态学:

se = strel('line', 100, 90);
out = imopen(mask, se);

strel的第二个输入是给定'line'是您正在使用的标志的行的长度 - 这表示行结构元素,第三个输入是这条线。 90表示90度或垂直线。

接下来,我们可以使用bwlabel代替bwconncomp ...不仅因为它使用起来更简单,而且速度更快。 bwlabel为您提供了一个标签矩阵,用于标记图像中的每个唯一对象。对象按列主要顺序标记,因此从上到下,从左到右。

这意味着左侧页面将被标记为#1 ....因此您可以这样做以提取左侧页面:

left_page = label == 1;
imshow(left_page);

我们得到这张图片:

enter image description here

答案 1 :(得分:1)

根据@rayryeng的要求,这是一个非常简单的替代方法。

im = imread('xUyDQ.png');
im = im2bw(im); 
im = imerode(im, ones(6));

结果......

enter image description here

重新开始......

im = imdilate(im, ones(6)); 
figure, imshow(im)

enter image description here

当然,通过将6减小到更小的范围可以减少侵蚀。发生的事情是,我基本上正在使用自定义结构元素进行侵蚀,该结构元素是一个6x6的矩阵 - 有效地发生的是边界上的6个像素变为零,所以你得到了所需的您正在寻找的页面之间的分离。

答案 2 :(得分:0)

我实际上发现有一个matlab函数bwconncomp会标记组件。

components = bwconncomp(mask);
c_ind = components.PixelIdxList;