MATLAB: вернуть массив значений между двумя координатами в большой матрице (по диагонали) - PullRequest
0 голосов
/ 17 марта 2011

Если я объясню почему, это может иметь больше смысла

У меня есть вывод логической матрицы (103x3488) фотографии измерительного персонала, прошедшего определение края (1 = край, 0 = край). Цель - рассчитать расстояние в пикселях между делениями на кадры. Проблема, посох проседает посередине.

Идея: пользователь вводит координаты (используя ginput или что-то) каждого конца посоха и средней точки провисания, тогда, если ребра между этими точками могут быть извлечены в массивы, я легко могу найти их местоположение.

Есть ли способ извлечь массив из матрицы таким образом?

Также открыт для других идей, только использую matlab в течение месяца, поэтому большинство функций мне неизвестны.

редактирование: Ссылка на изображение

Он показывает небольшую область матрицы, поэтому в этом примере 1 и 2 - это точки, между которыми я хочу провести выборку, и я бы хотел вернуть точки, которые появляются вдоль красной линии.

Приветствия

Ответы [ 2 ]

0 голосов
/ 17 марта 2011

После просмотра изображения я не уверен, где происходит «провисание», на которое вы ссылаетесь.Изображение поворачивается, но вы можете это исправить, используя imrotate.Степень, в которой он должен вращаться, должна быть достаточно легкой;просто введите координаты A и B и используйте обратную касательную, чтобы найти смещение угла от 0 градусов.

Что касается точек, то после выравнивания по прямой все, что вам нужно сделать, это указать строкуматрицу изображения (это был бы вектор 1 x 3448) и использовать find для получения ненулевых векторных индексов.Поскольку функция поворота, возможно, несколько интерполировала пиксели, вы можете получить более одного индекса на «строку», но они будут идентифицироваться как последовательные числа, и вы можете просто усреднить их, чтобы получить приблизительное значение.

0 голосов
/ 17 марта 2011

Попробуйте это

dat=imread('83zlP.png');

figure(1)
pcolor(double(dat))
shading flat
axis equal

% get the line ends
gi=floor(ginput(2))
x=gi(:,1);
y=gi(:,2);

xl=min(x):max(x); % line pixel x coords
yl=floor(interp1(x,y,xl)); % line pixel y coords


pdat=nan(length(xl),1);
for i=1:length(xl)
    pdat(i)=dat(yl(i),xl(i));
end

figure(2)
plot(1:length(xl),pdat)

peaks=find(pdat>40); % threshhold for peak detection
bigpeak=peaks(diff(peaks)>10); % threshold for selecting only edge of peak

hold all
plot(xl(bigpeak),pdat(bigpeak),'x')
meanspacex=mean(diff(xl(bigpeak)));
meanspacey=mean(diff(yl(bigpeak)));
meanspace=sqrt(meanspacex^2+meanspacey^2);

Матрица pdat дает пиксели вдоль выбранной линии.meanspace - это расстояние от края в пиксельных единицах.В зависимости от изображения пороговые значения могут потребоваться изменить.

...