什么是检测白色的最佳方法?

6

我正在尝试在视频中检测白色物体。第一步是过滤图像,使其只保留白色像素。我的第一种方法是使用HSV颜色空间,然后检查VAL通道的高水平。以下是代码:

//convert image to hsv
cvCvtColor( src, hsv, CV_BGR2HSV );
cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );

for(int x=0;x<srcSize.width;x++){
  for(int y=0;y<srcSize.height;y++){
    uchar * hue=&((uchar*) (h_plane->imageData+h_plane->widthStep*y))[x];
    uchar * sat=&((uchar*) (s_plane->imageData+s_plane->widthStep*y))[x];
    uchar * val=&((uchar*) (v_plane->imageData+v_plane->widthStep*y))[x];

    if((*val>170))
      *hue=255;
    else
      *hue=0;
  }
}

将结果留在色调通道中。不幸的是,这种方法对光线非常敏感。我相信有更好的方法。有什么建议吗?

3个回答

2

这将对光照非常敏感 - 如果在红光下查看会发生什么!
我不知道使用YUV空间是否比查找类似的RGB值更容易。

编辑 - 通常您会将没有颜色的东西称为灰色(这可能有助于您进行搜索)。
如果您有选择,那么这是最难搜索的颜色,因为它将反射场景中的任何其他光线。因此,您将不得不检测整体光照颜色并进行调整。

所以你要寻找的是具有相似RGB值或与场景中物体平均值的RGB值比例的像素。


我的意思是白色=灰色=无颜色,实际上我正在尝试检测白色塑料眼镜。这是一个样本图像:http://tinypic.com/r/14t1p1x/6 - dnul
我不确定,您是说如果我在顶部放一个红色灯光,那么眼镜的颜色会变得略带红色,而且我应该寻找类似的像素而不管颜色,而不是寻找白色像素? - dnul
3
如果你在场景中有白色物体,并使用红色灯光照亮它们,它们看起来就会是红色的!在这种情况下,你需要找到一个“白色”物体的颜色,然后寻找那个颜色。 - Martin Beckett

2

为什么要使用HSV?转换为HSL并使用亮度通道会更有意义。当然,您不会只得到白色,而是每种具有高亮度阈值的颜色。毕竟,除非您的源图像曝光过度,否则无法依赖纯白色。


2
另一种方法是将图像转换为灰度。白色将具有非常高的值(几乎> 225)。
另一种方法是AND R,G和B平面。只有白色会留在结果图像中。这样,您不必花时间计算转换为HSV颜色空间。您只需在每个像素上执行简单的AND操作即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接