我正在努力寻找“机器人世界杯的球”。因为它是橙色的,所以我把这个颜色分开,然后测试它是否是圆形的......

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

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

我不知道如何修复它...

谁能帮我这个?

有帮助吗?

解决方案

好的,首先,有一个错误 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 你只会识别出正确的斑点。

result

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

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

其他提示

我只需更新HSV的阈值,我得到了一个非常好的结果,我不确定它是否有助于

BW=(H> 0.05&H <0.15)&(s> 0.8)&(v> 0.8);

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top