我想创建一个可以计算图像中对象数量的程序。一切顺利,除了图像:
以下是我的程序,它只能计算图像中对象只有1种颜色且不重叠的对象数。我使用函数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种颜色并重叠:
如何解决这个问题?
答案 0 :(得分:0)
首先,您需要清楚地定义输入数据 - 您要检测哪些类型的对象(书籍,人物,任何类型的对象?),环境条件的范围是什么(平滑背景与纹理,照明) ,观点)。
然后尝试various image segmentation techniques并查看适用于您的输入数据范围的内容。没有“正确”的答案 - 这完全取决于您的数据。
您还可以尝试合并之前的信息 - 在评估场景时您知道的事情,计算机仅通过评估像素就不会知道。
例如,也许所有对象都具有一些最小尺寸。因此,您的算法可以过滤仅返回具有pixelArea > minArea
的对象。也许你只期望每种颜色的一个对象。因此,如果两个检测到的对象的颜色直方图与给定容差内的匹配,请将它们视为同一对象。