我想找到“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
我不知道如何解决它......
任何人都可以帮助我吗?
答案 0 :(得分:1)
好的,首先,metric
中存在一个错误。
完成所有处理后,您的图像有两种不同的斑点,标记为1(灰色)和2(白色)。
因此,sArea
和sPerim
将是两个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);
,这就是结果:
我只更改了色调值,但你可以看到适合你的其他照片。
此图像生成指标值:
metric = 2.2190 1.1703
因此,如果阈值为1.3>metric>0.7
,则只能识别正确的blob。
重点是所有这些过程都依赖于许多任意阈值,这使得它容易出错。专门为照片修剪它可能很容易,但关键是要对所有输入都很稳健。我认为对于这个特定的球,你唯一的变化将是太黄/白或暗/棕。
如果您不想搜索其他策略,只需查看测试中哪些值最有效。
答案 1 :(得分:0)
我只是更新了hsv的阈值,我得到了相当不错的结果,我不确定它是否有帮助
bw =(h> 0.05&amp; h&lt; 0.15)&amp; (s> 0.8)&amp; (v> 0.8);