所以我有一个二维数组代表一个坐标平面,一个图像。在该图像上,我正在寻找“红色”像素,并根据我的相机找到的所有红色像素找到(希望)红色LED目标的位置。目前,我只是将十字准线拍到所有红色像素的质心上:
// pseudo-code
for(cycle_through_pixels)
{
if( is_red(pixel[x][y]) )
{
vals++; // total number of red pixels
cx+=x; // sum the x's
cy+=y; // sum the y's
}
}
cx/=vals; // divide by total to get average x
cy/=vals; // divide by total to get average y
draw_crosshairs_at(pixel[cx][cy]); // found the centroid
这种方法的问题在于,虽然这个算法自然地使质心更接近最大的斑点(红色像素最多的区域),但当一点红色闪烁时,我仍然看到我的十字准线从目标上跳下来由于眩光或其他轻微干扰造成的一面。
我的问题是:
如何更改此模式以查找更多加权质心?简而言之,我想让较大的红色斑块比较小的斑点更重要,甚至可能完全忽略远处的小斑点。
答案 0 :(得分:1)
我认为最简单(也许是幼稚)的答案是:不计算像素值,而是计算周围的8个像素(总共9个)。现在,每个值可以从0到9,并且包含具有相同颜色的blob的更大值。现在,您将代替vals++
将值增加周围区域的像素数。
答案 1 :(得分:1)
您可以在图像中找到connected components,并且只包含在质心计算中总大小超过特定阈值的组件。