2011-09-06 11 views
5

Así que tengo una matriz bidimensional que representa un plano de coordenadas, una imagen. En esa imagen, estoy buscando píxeles "rojos" y encuentro (con suerte) la ubicación de un objetivo LED rojo basado en todos los píxeles rojos encontrados por mi cámara. Actualmente, estoy simplemente golpeando mi punto de mira en el centro de gravedad de todos los píxeles rojos:Weighted Centroid of a Array

// 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 el centro de gravedad más cerca de la burbuja más grande (el área con la la mayoría de los píxeles rojos), sigo viendo que mi mira salta del objetivo cuando un poco de rojo parpadea hacia un lado debido al deslumbramiento u otras pequeñas interferencias.

Mi pregunta es la siguiente:

¿Cómo cambio este patrón a buscar un mayor ponderada baricentro? En pocas palabras, quiero hacer que las manchas más grandes de rojo sean mucho más importantes que las más pequeñas, posiblemente incluso ignorando completamente las pequeñas gotas.

+1

Si tuviera puntos rojos "idénticos" a la izquierda ya la derecha de su avión. ¿El algoritmo centroide no dibujaría su cruz en el centro de la imagen donde no hay rojo? El problema aún persistirá si agregas peso a la ecuación, aunque sería menos probable. – aLevelOfIndirection

+0

Sí, ese es un caso en el que el algoritmo se comporta de forma bastante horrible. Sin embargo, todo esto se relaciona con una demostración real que planeo realizar, que involucra el seguimiento de un objetivo específico, y la idea es que si bien habrá alguna interferencia, nunca debería haber nada ni cerca de ser idéntico al objetivo en el campo (es un objetivo muy distinguible). La idea aquí es hacer que el algoritmo preste más atención a mi mayor fuente de rojo, manteniendo al mismo tiempo cierta capacidad para mantenerlo "enganchado" si se aleja o se dificulta un poco. – Andrew

Respuesta

1

Puede encontrar el connected components en la imagen y solo incluir aquellos componentes que tienen un tamaño total por encima de un cierto umbral en su centroide de calibración.

+0

Se me ocurrió la idea básica de este concepto por mi cuenta y lo deseché pensando que era demasiado extravagante, y nunca habría sabido cómo llamarlo en una búsqueda en Google. Muchas gracias por mostrarme esto, lo intentaré cuando tenga la oportunidad. – Andrew

+0

Es una operación de procesamiento de imágenes muy común. Si está utilizando un kit de herramientas de procesamiento de imágenes, puede tener una función que ya lo haga. – tkerwin

+0

¡Esto funcionó espectacularmente! En primer lugar, la implementación de este concepto hizo exactamente lo que quería: mi pequeña retícula flotante permanece hacia el centro de la mancha más grande de la pantalla, casi haciendo caso omiso de las pequeñas interferencias y solo dando ligeros tirones a las manchas errantes más grandes. Además de esto, mi punto de mira se ha vuelto increíblemente más estable; mientras que antes se saltaba de forma irregular cada vez que el dron se movía ligeramente o la iluminación cambiaba, ahora fluye suavemente alrededor de la pantalla. – Andrew

1

Creo que la respuesta más fácil (y tal vez ingenua) sería: en lugar de contar solo el valor del píxel, cuente 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++, también aumentará el valor por el número de píxeles en el área circundante.

+0

Es interesante que sugieras esto, y aún más interesante que lo llames ingenuo, porque en realidad consideré algo así como esto brevemente antes de descartarlo como una idea tonta y hack-ish. Me dije que debería seguir caminos más convencionales. Sin embargo, como usted y tkerwin me han mostrado hoy, no soy el único que ha ideado este concepto, y aparentemente es ampliamente utilizado y bastante efectivo. Trataré de implementarlo mañana. ¡Gracias! – Andrew