请查看下面的图片,以便更清楚地了解我要问的问题。
我相信你们所有人都可以看到这张照片中的书籍数量,即3张。我已经尝试根据它们的强度,分水岭对它们进行分割。即使使用Canny,由于噪音也没有真正成功。但总而言之,除了canny之外,图像看起来总是那样(见左图):
所有书籍聚集在一起的地方。我的目标是最终将它们分开并使用bwboundaries来计算书籍的数量。我也尝试使用label2rgb来进一步区分书籍,然而,所有发生的事情只是它的一种颜色,这意味着MatLab认为它是全部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)
对我来说,这是形态学过滤中的经典问题。我们可以看到,随着我们提高门槛,我们会看到可见的书籍的不同部分。
和
现在,基于灰度分量的面积/大小的一些灰度滤波可以提供一些良好的分割。这称为形态过滤中的区域开放:http://www.mathworks.fr/fr/help/images/ref/bwareaopen.html
这基本上删除了大小/面积小于某个参数的连接组件。 因此,在这里看到这个实际上是一些过滤的上述阈值的图像。
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/