使用MatLab按不同的强度分割对象

时间:2013-10-28 19:16:10

标签: matlab image-processing computer-vision image-segmentation

请查看下面的图片,以便更清楚地了解我要问的问题。

enter image description here

我相信你们所有人都可以看到这张照片中的书籍数量,即3张。我已经尝试根据它们的强度,分水岭对它们进行分割。即使使用Canny,由于噪音也没有真正成功。但总而言之,除了canny之外,图像看起来总是那样(见左图): enter image description here

所有书籍聚集在一起的地方。我的目标是最终将它们分开并使用bwboundaries来计算书籍的数量。我也尝试使用label2rgb来进一步区分书籍,然而,所有发生的事情只是它的一种颜色,这意味着MatLab认为它是全部3本书都是一样的。

我在精装书上做到了这一点并取得了巨大的成功,但是由于这本书并不是硬封面,所以没有明确的界线将它们分开。

我一直试图将这张图片细分为几天而没有成功。有任何想法吗?欢迎任何建议或想法。

3 个答案:

答案 0 :(得分:1)

沿y轴取一个x值的切片,这样你就有了很好的边界。然后使用“conv”找到该1-d向量(包含0和1)与奇数高斯函数的中心部分的卷积。这类似于边缘滤波器,但对噪声具有鲁棒性。这个卷积会给你一堆不规则间隔的峰值。找到峰值并计算它们。每个峰值都是两本书之间的界限。 (对不起,没有白板就很难解释这个简单的过程。)

“奇数高斯函数的中心部分”=想象一个正弦函数,在正/负pi处切断。但是从正面到负面的变化更接近阶梯函数。我认为你可以通过卷积高斯函数和阶梯函数得到你想要的东西。 (再次,抱歉没有白板。)

edit2:这是一些Matlab代码,以交互方式运行,这样你就可以看到我的意思了:

x=[-9.5:1:9.5];
y=[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1 1 1 1]; plot(x,y,'.');
g=exp(-x.*x/8); plot(x,g,'.');
odd_g=conv(y,g);plot([-19:19],odd_g,'.')

因此,odd_g(或类似的东西)是你想要在给定x处与图像切片卷积的东西。

peaks=conv(image_slice,odd_g);

edit3:假设你有

image_slice=[1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1];

并注意到我已经处于嘈杂的边缘。对于所选的值,当您绘制卷积时,

plot(conv(image_slice,odd_g)

你会发现一个边缘的噪声会产生轻微的峰值,但它并不像真正的边缘那么大。因此,您可以找到峰值并丢弃任何低于某些截止值。当然,选择最适合您数据的odd_g参数。

答案 1 :(得分:1)

对我来说,这是形态学过滤中的经典问题。我们可以看到,随着我们提高门槛,我们会看到可见的书籍的不同部分。

Threshold at 100 Threshold at 150Threshold at 172

现在,基于灰度分量的面积/大小的一些灰度滤波可以提供一些良好的分割。这称为形态过滤中的区域开放:http://www.mathworks.fr/fr/help/images/ref/bwareaopen.html

这基本上删除了大小/面积小于某个参数的连接组件。 因此,在这里看到这个实际上是一些过滤的上述阈值的图像。

Area opening and closing

Another gray level

    x150 = I>150;
    x100 = I>100;
    x172 = I>172;
    x150_op = bwareaopen(x150,80);
    x172_op = bwareaopen(x172,300);
    figure, imshow(~bwareaopen(x150_op,150); %area closing
    figure, imshow(~bwareaopen(x172_op,300); %area closing

因此,我们看到我们需要一个连通区域开放滤波器,它可以计算出具有特定区域的连通灰度分量。我想你可以为这本书调整一下!

另一个提供相同运算符和一些示例的库:http://www.mmorph.com/mxmorph/html/morph/mmareaopen.html

祝你好运!

答案 2 :(得分:1)

Shai建议计算图像每个水平行的均值可以帮助识别书籍。如果书籍不是平的,不是水平的,或者具有相似的颜色,那么该方法会有一定的局限性。但是,您可以考虑使用水平均值/中值等来检测书籍之间可能存在的气隙,而不是关注相似亮度的团块。

在二进制图像中工作时我不会太烦恼。过于繁琐,而且不是很强大。您可以找到某些图像的解决方案,但可能会花费大量时间来尝试为所有图像找到解决方案。此图像的灰度强度聚类非常重要,您不希望丢弃该数据。二值化之前的阈值处理可能是一个混乱和不满意的业务。

您熟悉均值平移算法吗?它是一种类似于k均值聚类的聚类算法,但不需要事先知道项目数(k)。这可以帮助您将原始灰度图像中的数据聚类,并发现存在三个相当一致的灰度值的大的,不同的块。

Image Segmentation using Mean Shift explained

http://docs.opencv.org/trunk/doc/py_tutorials/py_video/py_meanshift/py_meanshift.html

http://saravananthirumuruganathan.wordpress.com/2010/04/01/introduction-to-mean-shift-algorithm/