使用MatLab计算图像上物体的数量。

3
我需要用MatLab计算图像上的粉笔数量。我尝试将图像转换为灰度图像,然后分配边框。我还尝试将图像转换为二进制图像,并对其执行不同的形态学操作,但没有得到期望的结果。也许是我做错了什么。请帮助我!
我的图片:

2
你尝试过分割算法吗?比如分水岭算法? - ABC
2
有13支粉笔。 - Ratbert
3个回答

1
你可以利用粉笔具有颜色,而分隔线是灰色的事实。使用rgb2hsv将图像转换为HSV颜色空间,并取饱和度分量。对其进行阈值处理,然后尝试使用形态学方法分离粉笔碎片。

我实际上一直在尝试...但是我还没有成功使用HSV和饱和度分量将这些部分分离出来。这就是为什么我还没有写答案的原因:( - rayryeng
1
消除粉笔灰可能会有所帮助。 :) - Dima
完全正确。实际上,由于这个原因,图像的边界在阈值处理后变得混乱! - rayryeng

1
这并不是一个完整的解决方案,但希望能为您或其他人提供一个起点。像Dima一样,我注意到粉笔颜色很鲜艳,而分度器几乎是灰色的。我认为您可以尝试隔离灰色像素(其中灰色像素表示红色=蓝色=绿色),然后从那里开始。我尝试应用滤镜和进行形态学操作,但找不到令人满意的东西。仍然希望这有所帮助。
mim = imread('http://i.stack.imgur.com/RWBDS.jpg');

%we average all 3 color channels (note this isn't exactly equivalent to
%rgb2gray)
grayscale = uint8(mean(mim,3));

%now we say if all channels (r,g,b) are within some threshold of one another
%(there's probabaly a better way to do this)
my_gray_thresh=25;
graymask =  (abs(mim(:,:,1) - grayscale) < my_gray_thresh)...
          & (abs(mim(:,:,2) - grayscale) < my_gray_thresh)...
          & (abs(mim(:,:,3) - grayscale) < my_gray_thresh);

figure(1)
imshow(graymask);

graymask


非常感谢您,这可能会对我有所帮助。 - Vladimir

1

好的,我花了一些时间来处理这个问题- 但不幸的是,今天我已经没有时间了,对于不完整的答案我感到抱歉,但也许这会让你有所启发-(如果你需要更多帮助,我会在周末编辑这篇文章,给你一个更完整的答案:))

以下是代码-

for i=1:3
    I = RWBDS(:,:,i);  
    se = strel('rectangle', [265,50]);
    Io = imopen(I, se);
    Ie = imerode(I, se);
    Iobr = imreconstruct(Ie, I);
    Iobrd = imdilate(Iobr, se);
    Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
    Iobrcbr = imcomplement(Iobrcbr);
    Iobrcbrm = imregionalmax(Iobrcbr);
    se2 = strel('rectangle', [150,50]);
    Io2 = imerode(Iobrcbrm, se2);
    Ie2 = imdilate(Io2, se2);
    fgm{i} = Ie2;
end

fgm_final = fgm{1}+fgm{2}+fgm{3}; 
figure, imagesc(fgm_final); 

Result from imagesc

它仍然会捕捉到图像边缘,但是现在您将使用连接的,并获取主轴和次轴的长度,通过查看对象的比率来消除这些。无论如何,祝你好运!编辑:我稍微调整了一下代码,并使用新结果更新了上面的代码。在我能够消除侧面“噪音”的情况下,也消除了侧面的粉笔。我想我会把两者都留下来。我的解决方案基本上使用了这个概念,通过将结构元素se设置为粉笔的基本形状和比例,并执行形态学操作来实现-正如您最初猜测的那样。在大多数情况下,转换为HSV颜色空间是正确的方法,但是正如@rayryeng所示,在这里不适用。如果例如所有粉笔都是红色,则色相效果非常好。 (从逻辑上讲,您可能认为使用颜色通道会更好,但事实并非如此。)然而,在这种情况下,所有粉笔唯一共同之处就是相对形状。

更多细节请参阅Matlab有关这些特定函数的文档。

根据我给你的提示,你可以自己找出如何获取最后一个粉笔 :)


非常感谢您的回答!对我来说这将是一个很好的开始,我会尝试去理解它。但说实话,在这个问题上我不是很有能力,所以如果您有更完整的答案,我将非常感激(当然如果您有时间的话)。 - Vladimir
再次感谢您的帮助!您做得非常出色,帮了我很多。但是我还有一个问题:这个函数RWBDS是什么意思?因为我在这部分遇到了一个错误。(对于我的不理解感到抱歉) - Vladimir
1
哦,那只是Stack Overflow给你上传的图片起的名字。另外我刚刚注意到代码中有一个小错误,已经更新并纠正了。还有,很高兴能帮到你——我唯一需要的感谢就是接受我的答案 :) 如果你还有更多问题,请告诉我。 - ABC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接