Pregunta

Así que tengo una matriz bidimensional que representa un plano de coordenadas, una imagen. En esa imagen, busco píxeles "rojos" y busco (con suerte) la ubicación de un objetivo LED rojo basado en todos los píxeles rojos encontrados por mi cámara. Actualmente, simplemente estoy golpeando mi mira al centroide de todos los píxeles rojos:

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

El problema con este método es que, si bien este algoritmo naturalmente coloca al centroide más cerca de la mancha más grande (el área con la mayoría de los píxeles rojos), todavía estoy viendo que mi mira salta del objetivo cuando un poco de rojo se aleja a un lado debido a. para mirar u otras interferencias menores.

Mi pregunta es esta:

¿Cómo cambio este patrón para buscar más? ponderado ¿Centroide? En pocas palabras, quiero hacer que las manchas de rojo más grandes sean mucho más importantes que las más pequeñas, posiblemente incluso ignorando por completo pequeñas manchas.

¿Fue útil?

Solución

Podrías encontrar el componentes conectados en la imagen e solo incluye aquellos componentes que tienen un tamaño total por encima de cierto umbral en su calcuación centralide.

Otros consejos

Creo que la respuesta más fácil (y tal vez ingenua) sería: en lugar de contar solo el valor de píxeles, contar también los 8 píxeles circundantes (en un total de 9). Ahora, cada valor tomado puede ser de 0 a 9 e incluye valores mayores para blobs con el mismo color. Ahora, en lugar de vals++ Incrementará el valor por la cantidad de píxeles en el área circundante también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top