2011-09-06 12 views
5

Quindi ho una matrice bidimensionale che rappresenta un piano di coordinate, un'immagine. Su quell'immagine, cerco pixel "rossi" e trovo (si spera) la posizione di un target LED rosso basato su tutti i pixel rossi trovati dalla mia fotocamera. Attualmente, sto semplicemente schiaffi miei mirino sul baricentro di tutti i pixel rossi:Centroide ponderato di una matrice

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

Il problema di questo metodo è che, mentre questo algoritmo, naturalmente, pone il baricentro più vicino al più grande blob (l'area con il la maggior parte dei pixel rossi), sto ancora vedendo il mio mirino saltare fuori dal bersaglio quando un po 'di luce rossa lampeggia lateralmente a causa di bagliori o altre interferenze minori.

mia domanda è questa:

Come faccio a cambiare questo modello di cercare una più ponderata baricentro? In parole povere, voglio rendere i grossi blob di rosso molto più importanti di quelli più piccoli, forse anche ignorando del tutto i piccoli blob.

+1

Se si dovessero "identici" punti rossi sulla sinistra e sulla destra del proprio aereo. L'algoritmo del centroide non disegnerebbe il mirino nel centro dell'immagine dove non c'è il rosso? Il problema persisterà ancora se si aggiungesse peso all'equazione anche se sarebbe meno probabile. – aLevelOfIndirection

+0

Sì, questo è un caso in cui l'algoritmo si comporta in modo abbastanza orribile. Tuttavia, tutto questo riguarda una dimostrazione che ho intenzione di dare che coinvolge il tracciamento di un obiettivo specifico, e l'idea è che mentre ci saranno delle interferenze, non dovrebbe mai esserci nulla di simile al bersaglio sul campo (è un obiettivo molto distinto). L'idea qui è di fare in modo che l'algoritmo presti più attenzione alla mia più grande fonte di rosso, mantenendo comunque una certa capacità di mantenerlo "bloccato" se diventa più lontano o leggermente ostacolato. – Andrew

risposta

1

È possibile trovare connected components nell'immagine e includere solo quei componenti con una dimensione totale superiore a una determinata soglia nella calcolazione del centroide.

+0

Mi è venuta l'idea di base di questo concetto da solo e l'ho buttata via pensando che fosse troppo bizzarro, e non avrei mai saputo come chiamarlo in una ricerca su Google. Grazie mille per avermelo mostrato, ci proverò quando ne avrò l'occasione. – Andrew

+0

È un'operazione di elaborazione delle immagini molto comune. Se si utilizza un toolkit di elaborazione delle immagini, potrebbe avere una funzione che lo fa già. – tkerwin

+0

Questo ha funzionato in modo spettacolare! Prima di tutto, implementare questo concetto ha fatto esattamente quello che volevo: il mio piccolo mirino fluttuante rimane verso il centro del più grande blob sullo schermo, ignorando quasi le piccole interferenze e dando solo lievi rimorchiatori a chiazze erranti più grandi. Oltre a questo, il mio mirino è diventato incredibilmente più stabile; mentre prima di saltare in giro in modo glaciale ogni volta che il drone si spostava leggermente o l'illuminazione cambiava, ora scorre uniformemente sullo schermo. – Andrew

1

Penso che la risposta più semplice (e forse ingenua) sarebbe: anziché contare solo il valore del pixel, contare anche gli 8 pixel circostanti (in un totale di 9). Ora, ogni valore assunto può essere compreso tra 0 e 9 e include valori maggiori per BLOB con lo stesso colore. Ora, invece di vals++, aumenterai il valore anche per il numero di pixel nell'area circostante.

+0

È interessante che tu lo suggerisca, e ancora più interessante che tu lo chiami ingenuo, perché in realtà ho considerato qualcosa di simile a questo brevemente prima di liquidarlo come un concetto sciocco e hack-ish. Mi sono detto che dovrei attenermi a percorsi più convenzionali. Tuttavia, come tu e Tkerwin mi avete mostrato oggi, non sono il solo ad aver escogitato questo concetto, ed è apparentemente ampiamente usato e abbastanza efficace. Proverò a implementarlo domani. Grazie! – Andrew

Problemi correlati