Хорошо, я предполагаю, что красная линия линейна и ее значения можно однозначно отделить от остальной части изображения. Давайте сгенерируем некоторые тестовые данные...
[x,y] = meshgrid(-5:.2:5, -5:.2:5);
n = size(x,1)*size(x,2);
z = -0.2*(y-(0.2*x+1)).^2 + 5 + randn(size(x))*0.1;
figure
surf(x,y,z);
Этот скрипт генерирует поверхностную функцию. Его набор максимальных значений (x,y) может быть описан линейной функцией y = 0,2*x+1. Я добавил немного шума, чтобы сделать его более реалистичным.
Теперь мы выбираем все точки, где z меньше, скажем, 95 % от максимального значения. Поэтому можно использовать find
. Позже мы хотим использовать одномерные данные, поэтому мы reshape
все.
thresh = min(min(z)) + (max(max(z))-min(min(z)))*0.95;
mask = reshape(z > thresh,1,n);
idx = find(mask>0);
xvec = reshape(x,1,n);
yvec = reshape(y,1,n);
xvec
и yvec
теперь содержат координаты всех значений > thresh.
Последний шаг — сделать некоторый линейный полином по всем точкам.
pp = polyfit(xvec(idx),yvec(idx),1)
pp =
0.1946 1.0134
Очевидно, это примерно коэффициенты y = 0,2 * x + 1, как и должно быть.
Я не знаю, работает ли это и с вашими данными, так как я сделал некоторые предположения. Пороговый уровень следует выбирать тщательно. Возможно, необходимо выполнить некоторую предварительную обработку для динамического определения этого уровня, если вы действительно хотите автоматически обрабатывать изображения. Также может быть более простой способ сделать это... но для меня этот был простым и не нуждался в каких-либо наборах инструментов.
30.06.2017
rng
для воспроизводимости 30.06.2017