Взвешенный центроид массива
-
27-10-2019 - |
Вопрос
Таким образом, у меня есть 2-мерный массив, представляющий плоскость координат, изображение. На этом изображении я ищу «красные» пиксели и нахожу (надеюсь) местоположение красной светодиодной цели на основе всех красных пикселей, найденных моей камерой. В настоящее время я просто хлопаю по перекрестке по центру всех красных пикселей:
// 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
Проблема с этим методом заключается в том, что, хотя этот алгоритм, естественно, приближает центроид ближе к самой большой капля (область с самыми красными пикселями), я все еще вижу, как мой перекрест спрыгивает с цели, когда немного красного цвета склоняется в сторону. блики или другие незначительные помехи.
Мой вопрос:
Как изменить этот шаблон, чтобы найти больше взвешен центроид? Проще говоря, я хочу сделать большие капли красного цвета гораздо важнее, чем меньшие, возможно, даже вообще игнорируя дальние маленькие капли.
Решение
Вы могли бы найти подключенные компоненты На изображении и включают только те компоненты, которые имеют общий размер выше определенного порога в вашем центре.
Другие советы
Я думаю, что самый простой (и, возможно, наивный) ответ был бы: вместо того, чтобы подсчитывать только значение пикселя, считайте также окружающие 8 пикселей (в общей сложности 9). Теперь каждое значение, которое взято, может быть от 0 до 9 и включает в себя большие значения для каплей с одним и тем же цветом. Теперь вместо vals++
Вы также увеличиваете значение на количество пикселей в окружающей области.