2

我试图找到“robocup 的球”。因为它是橙色的,所以我把这个颜色分开,然后测试它是否是圆形的......

这是该方法不起作用的图像,但对于其他图像则有效:

在此处输入图像描述

rgb = imread('E:/robot12.jpg'); 
imshow(rgb);
hsv=rgb2hsv(rgb);
h=hsv(: , : ,1);
s=hsv(: , : ,2);
v=hsv( : , : ,3);
bw= (h>0.05 & h<0.12) & (s>0.6) & (v> 0.51);
imagesc(bw)
colormap(gray)
se = strel('disk',2);
bw = imclose(bw,se);
bw = imfill(bw,'holes');

imshow(bw)
ball1 = bwareaopen(bw, 50);
imagesc(ball1);
lab = bwlabel(ball1);
s = regionprops(lab, 'Area', 'Perimeter');
sArea = [s.Area];
sPerim= [s.Perimeter];
metric= sPerim.^2/(4*pi.* sArea);
idx = find(metric > 0.7);
gr_fin = ismember(lab, idx);
imshow(gr_fin)


stat = regionprops(gr_fin,'centroid');
imshow(rgb); hold on;
 for x = 1: numel(stat)
    plot(stat(x).Centroid(1),stat(x).Centroid(2), 'wp','MarkerSize',20,'MarkerFaceColor','b');
  end

我不知道如何解决它...

谁能帮我这个?

4

2 回答 2

1

好的,首先,metric.

完成所有处理后,您的图像有两个不同的斑点,分别标记为 1(灰色)和 2(白色)。

斑点

所以,sAreaandsPerim将是两个1x2数组。要获得两个 blob 的度量值,您需要将行修复为: metric= (sPerim.^2)./(4*pi.* sArea);

关键是这个指标为你1提供了一个完美的圆盘,所以我相信如果你也有一个上限阈值会更好,而不仅仅是metric > 0.7. 例如,对于上面的 blob,返回的值为:

metric = 3.1406 1.9596

这意味着它们都不像一个完美的圆。

第二个问题是颜色阈值没有完全找到真正的球,因为它在灯光照射到它的点变得太“黄色”。这在许多光线充足的照片中很常见,当它在阴影后面时会更暗。

要解决此问题,您需要放宽色调值,以便允许更多的黄色和红色变化。您将有更多的误报,但您希望它们不会通过检测器的其余测试。

我试过bw= (h>0.04 & h<0.15) & (s>0.6) & (v> 0.51);了,结果是这样的:

斑点 2

我只改变了色调值,但你可以看到适合你的其他照片。

此图像产生以下度量值:

metric = 2.2190 1.1703

因此,您的阈值1.3>metric>0.7将仅识别正确的 blob。

结果

要点是所有这些过程都依赖于许多任意阈值,这使得它容易出错。专门为照片修剪它可能很容易,但关键是要对所有输入保持稳健。我认为对于这个特定的球,您将拥有的唯一变化将是太黄/白或太黑/棕色。

如果您不想搜索其他策略,您可以查看哪些值在测试中最有效。

于 2014-01-09T11:32:37.163 回答
0

我只是更新了 hsv 的阈值,我得到了一个很好的结果,我不确定它是否有帮助

bw= (h>0.05 & h<0.15) & (s>0.8) & (v> 0.8);

在此处输入图像描述

于 2014-01-09T11:32:46.363 回答