我正在开发一个使用 kinect 进行图像处理的系统。系统需要根据颜色(来自 kinect 图像)检测某些对象。
我目前的解决方案是使用一个窗口(固定大小)并将其滑过整个图像。然后我计算(在窗口中)绿色像素的数量并将其与某个阈值进行比较。要检查像素是否为绿色,我使用参考颜色(0x00FF00),然后计算当前像素到参考颜色的距离。
算法是这样的:
referenceColor = 0x00FF00;
window_width = 10;
window_height = 10;
colorSum = 0;
COLOR_TRESHOLD = 20;
WINDOW_COLOR_TRESHOLD = 70;
foreach (pixel in image)
{
colorSum = 0;
for(i = 0; i < window_width; i++)
{
for(j = 0; j < window_height; j++)
{
//get the current pixel that is processed by the window
curPixel = image.getPixelAt(i+pixel.indexX,j+pixel.indexY);
// calculate the distance
distance = sqrt((curPixel.r - referenceColor.r) ^ 2 + (curPixel.g - referenceColor.g) ^ 2 + (curPixel.b - referenceColor.b) ^ 2);
// check if distance smaller than the treshold
if(distance <= COLOR_TRESHOLD)
{
// pixel is green
colorSum++;
}
}
}
// check if there are enough green pixels in the image
if(colorSum > WINDOW_COLOR_TRESHOLD)
{
// green object detected
}
}
该算法的问题在于,如果颜色太暗/太亮(由于阳光/反射),它会失败(我必须更改阈值才能获得良好的检测)。理想情况下,我想存档每个绿色像素/对象都会被检测到(无论它有多亮/多暗)。有没有人知道任何好的(健壮的)算法来存档这个?会欣赏正确方向的一点。
谢谢。