我正在尝试一致地检测同一场景的图像之间的某种颜色。想法是基于颜色配置文件识别一组对象。所以,例如,如果我给了一个带有绿球的场景,并且我选择那个绿色作为我的调色板的一部分,我想要一个具有反映它检测到球的矩阵的函数。
有人可以为这个项目推荐一些matlab函数/插件/起点吗?理想情况下,颜色识别功能将采用一系列颜色值,并在一定阈值内匹配它们。
除了它有效(这个没有)
更新
这就是我选择不使用上述工具包的原因。
我首先选择图片中感兴趣的一些颜色
然后让函数在后面的图像中识别道路......
绝对没有任何有用的东西被触发。所以是的,除了我在下载和修复的代码中遇到的一些错误,这是一种踢球者。我没有尝试修复识别颜色的代码体,因为......好吧,我不知道怎么回事,这就是我来这里的原因。
答案 0 :(得分:3)
所以,首先我要说的是,用颜色配置文件进行道路检测是一个病态问题。但是如果道路的颜色是一致的,并且灯光不会改变你想要识别的物体的颜色,那么你可能会有一个镜头。 (如果在外面拍摄,或者使用不同的相机,或者如果发生阴影,或者在任何真实环境中发生这种情况,这将非常困难)
以下是一些可能会有所帮助的事情。
尝试预先平滑图像,因为在第一张图像中得到不良结果的原因可能是因为道路中的像素变化较小。如果您可以模糊它们,或使用某种分水岭或局部平均值,您可能会获得颜色更一致的区域。
您也可以考虑使用LAB颜色空间而不是HSV或RGB。
使用边缘检测(参见matlab的canny边缘检测器)可能能够获得一些边界信息。如果您正在寻找一个平滑的物体,它的边缘将不会很多。
编辑:我试图以最简单的方式坚持这个建议。以下是生成的代码和一些示例。
im=rgb2gray(im) %for most basic color capturing.. using another color space is better practice
%imshow(im)
RoadMask=roipoly(im)%create mask
RoadMask=uint8(RoadMask);%cast to so you can elementwise multiply
im=im.*RoadMask;%apply mask
[x y]=size(im);
for i=1:x
for j=1:y
%disp('here')
if (im(i,j)<160 || im(i,j)>180) %select your values based on your targets range
im(i,j)=0; %replace everything outside of range with 0
%disp(im(x,y)) %if you'd like to count pixels, turn all values
end %within range to 1 and do a sum at end
end
end
首先从RGB转换为灰度 选择了一般与道路灰度相匹配的区域 注意未捕获道路的部分区域和块状边缘。比如这------------- ^
这个实现既快又脏,但我想在忘记之前把它搞砸。我将尝试使用实现平滑,采样和LAB颜色空间的代码进行更新。