Взвешенный центроид массива - PullRequest
5 голосов
/ 07 сентября 2011

Итак, у меня есть двумерный массив, представляющий координатную плоскость, изображение.На этом изображении я ищу «красные» пиксели и нахожу (надеюсь) местоположение красной светодиодной мишени на основе всех красных пикселей, найденных моей камерой.В настоящее время я просто шлепаю свое перекрестие по центроиду всех красных пикселей:

// 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

Проблема этого метода заключается в том, что, хотя этот алгоритм естественным образом размещает центроид ближе к наибольшему шарику (областис наибольшим количеством красных пикселей), я все еще вижу, как мои прицелы прыгают с цели, когда немного красного цвета мерцает в сторону из-за бликов или других незначительных помех.1007 * Как мне изменить этот шаблон, чтобы найти более взвешенный центроид?Проще говоря, я хочу сделать более крупные красные шарики гораздо более важными, чем более мелкие, возможно, даже не обращая внимания на маленькие шарики.

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Вы можете найти подключенные компоненты на изображении и включать в них только те компоненты, которые имеют общий размер выше определенного порога в ваших вычислениях центроида.

1 голос
/ 07 сентября 2011

Я думаю, что самый простой (и, возможно, наивный) ответ был бы: вместо того, чтобы считать только значение пикселя, посчитайте также окружающие 8 пикселей (всего 9). Теперь каждое принятое значение может быть от 0 до 9 и включает большие значения для BLOB-объектов одного цвета. Теперь вместо vals++ вы будете увеличивать значение на количество пикселей в окружающей области.

...