Un modo per raggiungere il risultato desiderato è quello di adattare l'Algoritmo di Canny 2D come segue (codice Mathematica):
Innanzitutto, calcolare la derivata spaziale utilizzando un filtro derivato gaussiano, impostando il valore di sigma relativo alla la scala dei bordi che si desidera rilevare. Prendi il valore assoluto del risultato.
d = [email protected][data, {{10, 5}}, 1];
Quindi, determinare automaticamente una soglia per raggruppare i valori derivati precedenti in due gruppi (qui utilizzando il metodo di Otsu).
thrd = FindThreshold[d];
Quindi, rilevare i passi dei valori derivati (transizioni in/dalla "banda morta").
steps = [email protected]`StepDetect[d, thrd]["NonzeroPositions"];
A questo punto si hanno le estremità dei bordi:
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}]
Opzionalmente - sembra che è quello che vuoi - a mantenere solo le estremità più basse della bordi. Il clustering dei punti dati alle estremità dei bordi funziona in questo caso, ma non sono sicuro di quanto sia robusto.
t = [email protected][[steps]];
steps2 = Select[steps, data[[#]] <= t &];
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}]
Grazie a tutti per le risposte. Per favore, se trovi altre nuove idee (1Dimentional edge detect), condividile anche qui. –