0

我想创建一个可以计算图像中对象数量的程序。除了具有以下内容的图像外,一切都很顺利:

  1. 具有超过 1 种颜色的对象。
  2. 重叠的对象。

以下是我的程序,它只能计算图像中对象只有一种颜色且不重叠的对象数量。我使用功能bwlabel

a=imread('Tumpukan Buku2.jpg');
a_citra_keabuan = rgb2gray(a);
threshold = graythresh(a_citra_keabuan);
a_bww = im2bw(a_citra_keabuan,threshold);
a_bw=~a_bww;
[labeled,numObjects]=bwlabel(a_bw);
[m,n]=size(a_bw);
s = regionprops(labeled, 'Centroid');
B = bwboundaries(a_bw);

imshow(a_bw)
hold on
for k = 1:numel(s)
    c = s(k).Centroid;
    text(c(1), c(2), sprintf('%d', k), ...
        'HorizontalAlignment', 'center', ...
        'VerticalAlignment', 'middle');
end
for k = 1:length(B)
    boundary = B{k};
    plot(boundary(:,2), boundary(:,1), 'g', 'LineWidth', 0.2)
end
hold off

这是具有 1 种颜色对象的图像的结果:

结果

对于具有> 1颜色并重叠的对象的图像,这是错误的结果:

结果错误

如何解决这个问题呢?

4

1 回答 1

0

首先,您需要明确定义您的输入数据——您想要检测什么类型的对象(书籍、人、任何类型的对象?),环境条件的范围(平滑背景与纹理、照明、透视) .

然后尝试各种图像分割技术,看看哪些适用于您的输入数据范围。没有“正确”的答案——这完全取决于您的数据。

您还可以尝试合并先验信息——在评估场景时您知道的事情,而计算机仅通过评估像素是不会知道的。

例如,也许所有对象都具有某个最小尺寸。因此,您的算法可以过滤为仅返回具有pixelArea > minArea. 也许您只期望每种颜色都有一个对象。因此,如果两个检测到的对象的颜色直方图在给定的容差范围内匹配,则认为它们是同一个对象。

于 2013-07-06T13:33:25.780 回答