Algoritmo per il rilevamento dei fronti di una curva
Ciao a tutti,
Sto lavorando sul riconoscimento dei fronti di una curva simile a questa:

e' disegnata volutamente male perche' i fronti non sono necessariamente verticali, ne le parti "piatte" sono necessariamente orizzontali.
La curva in questione e' fondamentalmente la rappresentazione grafica di un array monodimensionale composto da un migliaio di campioni.
Il mio scopo e' determinare innanzitutto il numero dei fronti, o delle valli, e possibilmente i vari livelli su una scala arbitraria.
Sto cercando un algoritmo matematico che mi aiuti in modo scientifico, come ad esempio l' algoritmo di edge detection per l'elaborazione d'immagini.
In pratica non voglio fare un codice arbitrario tipo
ma vorrei qualcosa di strutturato e basato su un algoritmo, una formula o una funzione nota.
Grazie mille in anticipo a tutti!
Sto lavorando sul riconoscimento dei fronti di una curva simile a questa:

e' disegnata volutamente male perche' i fronti non sono necessariamente verticali, ne le parti "piatte" sono necessariamente orizzontali.
La curva in questione e' fondamentalmente la rappresentazione grafica di un array monodimensionale composto da un migliaio di campioni.
Il mio scopo e' determinare innanzitutto il numero dei fronti, o delle valli, e possibilmente i vari livelli su una scala arbitraria.
Sto cercando un algoritmo matematico che mi aiuti in modo scientifico, come ad esempio l' algoritmo di edge detection per l'elaborazione d'immagini.
In pratica non voglio fare un codice arbitrario tipo
if(array[i]>(array[i+2]+10)) { HoUnFronte=true; }
ma vorrei qualcosa di strutturato e basato su un algoritmo, una formula o una funzione nota.
Grazie mille in anticipo a tutti!
Risposte
Anche qualcosa come quello che hai scritto è un "algoritmo matematico". Gli algoritmi di edge detection non fanno in effetti altro che calcolare la differenza tra un valore e quelli adiacenti.. Una volta che si calcola questo vettore delle differenze si considera un edge un qualsiasi pixel al di sopra di una certa soglia.
Il problema della tua domanda sta nel chiarire cosa sia un fronte o una valle. Chiarito questo, l'algoritmo viene da se. Ma considera che alla fine si tratterà pur sempre di definire una soglia per la differenza di valori vicini.
Il problema della tua domanda sta nel chiarire cosa sia un fronte o una valle. Chiarito questo, l'algoritmo viene da se. Ma considera che alla fine si tratterà pur sempre di definire una soglia per la differenza di valori vicini.
Grazie mille per la risposta.
Si, io intendevo un algoritmo nel senso di una o piu' funzioni matematiche note per rilevare un cambiamento significativo in una serie di punti e non una cosa "casalinga" basata su valori sperimentali come il +10 del mio esempio.
Ho visto che l edge detection ad esempio si basa molto su calcoli tra matrici, come la covarianza, l'operatore di Sobel, ecc. ma non saprei come applicarli al mio caso monodimensionale.
Mi va benissimo paragonare o calcolare la differenza tra i valori adiacenti, ma non voglio inserire delle soglie costanti come il +10. Perdonami, ma non sono molto ferrato nell'argomento, probabilmente esiste un banale calcolo ma non lo conosco. Come calcolo il vettore delle differenze e come viene impostata la soglia dei pixel?
Per me e' indifferente detettare il fronte (cioe' il passaggio da un livello a un altro) o il numero di livelli e il loro valore assoluto o relativo. Per livelli intendo le parti orizzontali ovviamente
Si, io intendevo un algoritmo nel senso di una o piu' funzioni matematiche note per rilevare un cambiamento significativo in una serie di punti e non una cosa "casalinga" basata su valori sperimentali come il +10 del mio esempio.
Ho visto che l edge detection ad esempio si basa molto su calcoli tra matrici, come la covarianza, l'operatore di Sobel, ecc. ma non saprei come applicarli al mio caso monodimensionale.
Mi va benissimo paragonare o calcolare la differenza tra i valori adiacenti, ma non voglio inserire delle soglie costanti come il +10. Perdonami, ma non sono molto ferrato nell'argomento, probabilmente esiste un banale calcolo ma non lo conosco. Come calcolo il vettore delle differenze e come viene impostata la soglia dei pixel?
Per me e' indifferente detettare il fronte (cioe' il passaggio da un livello a un altro) o il numero di livelli e il loro valore assoluto o relativo. Per livelli intendo le parti orizzontali ovviamente
Il calcolo dei tuo fronti si può calcolare applicando le seguenti operazioni (alcune delle quali opzionali):
1. Smoothing della curva in modo da eliminare piccole variazioni. Usando un filtro di dimensione \(3\) l'operazione potrebbe per esempio essere \( arraySmooth = (array[i-1] + 2*array + array[i+1])/4. \) Si possono usare anche dei filtri più grandi e funzioni diverse da quella triangolare usata in questo caso.
2. Calcolo della derivata usando le differenze finite. In questo caso si ha per esempio: \( arrayDiff = arraySmooth[i+1] - arraySmooth[i-1]. \) Anche qua si può usare qualcosa di diverso.
3. Estrazione dei valori con la derivata superiore ad una qualche tolleranza (eliminando valori tra di loro adiacenti).
1. Smoothing della curva in modo da eliminare piccole variazioni. Usando un filtro di dimensione \(3\) l'operazione potrebbe per esempio essere \( arraySmooth = (array[i-1] + 2*array + array[i+1])/4. \) Si possono usare anche dei filtri più grandi e funzioni diverse da quella triangolare usata in questo caso.
2. Calcolo della derivata usando le differenze finite. In questo caso si ha per esempio: \( arrayDiff = arraySmooth[i+1] - arraySmooth[i-1]. \) Anche qua si può usare qualcosa di diverso.
3. Estrazione dei valori con la derivata superiore ad una qualche tolleranza (eliminando valori tra di loro adiacenti).