我怎么才能找到橙色球?

时间:2014-01-09 07:53:09

标签: matlab image-processing robocup

我想找到“robocup的球”。因为它是橙色的,所以我将这种颜色分开,然后在测试之后是否为圆形......

这是一个方法不起作用的图像,但对其他方法起作用:

enter image description here

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

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

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

好的,首先,metric中存在一个错误。

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

blobs

因此,sAreasPerim将是两个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);,这就是结果:

blobs 2

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

此图像生成指标值:

metric = 2.2190 1.1703

因此,如果阈值为1.3>metric>0.7,则只能识别正确的blob。

result

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

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

答案 1 :(得分:0)

我只是更新了hsv的阈值,我得到了相当不错的结果,我不确定它是否有帮助

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

enter image description here