Một cách để có được kết quả mong muốn của bạn là để thích nghi với các máy dò cạnh Canny 2D như sau (mã trong Mathematica):
Thứ nhất, tính đạo hàm không gian sử dụng một bộ lọc hàm Gaussian, thiết lập các giá trị sigma so với quy mô của các cạnh bạn muốn phát hiện. Lấy giá trị tuyệt đối của kết quả.
d = [email protected][data, {{10, 5}}, 1];
Sau đó, xác định ngưỡng tự động để nhóm các giá trị phái sinh trước đó thành hai nhóm (ở đây sử dụng phương pháp của Otsu).
thrd = FindThreshold[d];
Sau đó, phát hiện các bước của giá trị phái sinh (chuyển tiếp vào/từ "băng chết").
steps = [email protected]`StepDetect[d, thrd]["NonzeroPositions"];
Tại thời điểm này, bạn có tận cùng các cạnh:
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}]
Tùy chọn - có vẻ như đó là những gì bạn muốn - giữ chỉ kết thúc thấp nhất của cạnh. Clustering các điểm dữ liệu ở phần cuối của các cạnh hoạt động trong trường hợp này, nhưng tôi không chắc nó mạnh như thế nào.
t = [email protected][[steps]];
steps2 = Select[steps, data[[#]] <= t &];
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}]
Cảm ơn mọi người vì câu trả lời. Xin vui lòng nếu bạn đi qua với bất kỳ ý tưởng mới hơn (1Dimal cạnh phát hiện) chia sẻ rằng ở đây quá. –