One way to achieve the desired result is to adapt the two-dimensional Canny detector as follows (code in Mathematica):
First, calculate the spatial derivative using the Gaussian derivative filter by setting the sigma value relative to the scale of the edges you want to detect. Take the absolute value of the result.
d = Abs@GaussianFilter [data, {{10, 5}}, 1];
Then, determine the threshold automatically for clustering previous derived values ββin two groups (the Otsu method is used here).
thrd = FindThreshold[d];
Then determine the steps of the derived values ββ(transitions to / from the "dead zone").
steps = Flatten@Image `StepDetect[d, thrd]["NonzeroPositions"];
At this moment you have the ends of the ribs:
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}]
Optional - it seems that you want to - hold only the lowest ends of the ribs. In this case, clustering data points at the ends of the edges works, but I'm not sure how reliable they are.
t = FindThreshold@data [[steps]]; steps2 = Select[steps, data[[
source share