2013-05-21 6 views
5

Ho un array int pieno di valori (0-255) e ho bisogno di estrarre due indici.Ottenere l'area di interesse di un istogramma (Int Array)

Gli indici da trovare rappresentano l'area interessata su cui voglio concentrarmi.

I valori di questa area sono sempre superiori a ma a volte la differenza è molto bassa.

come in questo esempio:

enter image description here

La mia area di interesse è la seguente:

enter image description here

Il mio approccio attuale è quello di ottenere il valore massimo e il valore medio. Quindi riceverò:

  • il primo indice maggiore di "Max - (Max - Media)".
  • l'ultimo indice maggiore di "Max - (Max - Media)".

Ma a volte, come in questo caso, il mio metodo ottiene la parte Junk. (La quinta "colonna", sulla destra)

Chiunque può suggerire un approccio migliore?

Nota: L'area di interesse è sempre 4 "colonne", come l'immagine di esempio

risposta

0

Si potrebbe applicare un semplice filtro Impulse Response come Boxcar o qualsiasi altro mezzo di lisciatura al tuo istogramma per ridurre le componenti ad alta frequenza . Dopo di ciò è possibile calcolare i minimi locali e massimi e pin-point dei picchi individuali (max-min-max-min per picco) all'interno di una larghezza di banda che aiuterebbe a restringere la ROI.

Ecco una semplice implementazione del filtro Boxcar.

0

Forse sto assumendo troppo. Ma i tuoi dati fanno sembrare che ci siano forti "spigoli" attorno alle 4 "montagne". Quindi dovresti dare un'occhiata al gruppo di algoritmi edge/ridge detection per l'idea.

La mia risposta più semplice sarebbe provare prima la soglia. vedi se funziona.

In caso contrario, è possibile applicare una versione monodimensionale del filtro, ad esempio Sobel filter. Dovrebbero evidenziare i punti importanti nei dati in cui la derivata del secondo ordine è grande.

Problemi correlati