Один из способов получить желаемый результат - адаптировать 2D детектор контуров Canny следующим образом (код в Mathematica):
Сначала вычислите пространственную производную, используя фильтр гауссовой производной, установив относительное значение сигмыв масштабе краев, которые вы хотите обнаружить.Возьмите абсолютное значение результата.
d = Abs@GaussianFilter[data, {{10, 5}}, 1];
Затем определите порог автоматически, чтобы сгруппировать предыдущие производные значения в две группы (здесь, используя метод Оцу).
thrd = FindThreshold[d];
Затем,определить шаги производных значений (переходы в / из «мертвой зоны»).
steps = Flatten@Image`StepDetect[d, thrd]["NonzeroPositions"];
В этот момент у вас есть концы ребер:
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}]
По желанию - кажется, это то, что вам нужно - оставляйте только самые нижние концы краев.Кластеризация точек данных на концах ребер в этом случае работает, но я не уверен, насколько она надежна.
t = FindThreshold@data[[steps]];
steps2 = Select[steps, data[[#]] <= t &];
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}]