嗨我得到了这个面具,我尝试将左面板分割出来。
我使用了分水岭方法,所以希望它会为左侧面板返回一个单独的值。
D = bwdist(~mask);
imshow(D,[],'InitialMagnification','fit');
Di = -D;
Di(~mask) = -Inf;
L = watershed(Di);
Lrgb = label2rgb(L,'jet');
imshow(Lrgb);
但我得到了这个,任何人都可以帮助我,或者你在分割方面有更好的建议。
答案 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);
我们得到这张图片:
答案 1 :(得分:1)
根据@rayryeng的要求,这是一个非常简单的替代方法。
im = imread('xUyDQ.png');
im = im2bw(im);
im = imerode(im, ones(6));
结果......
重新开始......
im = imdilate(im, ones(6));
figure, imshow(im)
当然,通过将6减小到更小的范围可以减少侵蚀。发生的事情是,我基本上正在使用自定义结构元素进行侵蚀,该结构元素是一个6x6的矩阵 - 有效地发生的是边界上的6个像素变为零,所以你得到了所需的您正在寻找的页面之间的分离。
答案 2 :(得分:0)
我实际上发现有一个matlab函数bwconncomp会标记组件。
components = bwconncomp(mask);
c_ind = components.PixelIdxList;