Удаление лишних пикселей после сжатия до точки и выбор правильного пикселя в качестве точки пересечения с помощью Matlab - PullRequest
1 голос
/ 11 марта 2010

текст ссылки

Основываясь на ссылке выше, мне удалось получить точку пересечения, но иногда я получаю 2 или более результатов. У меня есть 10 похожих изображений с немного сдвинутым крестом в каждом кадре. Есть ли способ, которым я могу удалить оставшиеся пиксели, которые очень сильно отличаются от других 9 изображений, сравнивая его с точкой пересечения 1-го изображения? Поскольку движение довольно мало, правильно ли говорить, что пиксель, который должен быть выбран из двух или более полученных мной результатов, должен иметь тот пиксель, который имеет самое близкое значение, которое я получаю из пикселя предыдущего изображения? Есть ли способ сделать это? Спасибо!

Ответы [ 2 ]

1 голос
/ 11 марта 2010

Да. Вы можете попытаться определить выбросы по координатам. Это требует, чтобы наибольшее накопление координат находилось в истинном центре креста. Из того, что вы описываете, это предположение удовлетворяется.

%# Assume the cross should be around [0,0], 
%# and you are storing the coordinates in a cell array 

coordCell = {[0,0],[0.1,-0.05;4,4],[0.3,0.2;-2,5],[-0.25,0;2,-3]};

%# collect the coordinates of all images
allCoords = cat(1,coordCell{:});


%# take the median
medCoord = median(allCoords,1);

%# calculate the residuals, take the median of them
res2 = bsxfun(@minus,allCoords,medCoord).^2;
medRes = median(res2,1);

%# outliers are some factor above the median residual
%# Rousseeuw & Leroy, 1987, calculated how much for us (1.4826).
%# The factor k is the stringency (how many 'sigmas' do you have
%# to be away from the median to be counted an outlier)
%# A common value for k is 3.
k = 3;
testValue = bsxfun(@rdivide,res2,medRes*1.4826^2);
outlierIdx = any(testValue>k^2,2);

%# now you can throw out the outliers
allCoords(outlierIdx,:) = [];
1 голос
/ 11 марта 2010

Когда вы получаете один результат, вы уверены, что это правильно? Если это так, вы можете сделать что-то вроде:

function pos = ChoosePosition(posGood, posA, posB)
%# posGood is the known good answer, posA and posB are candidates
if norm(posA - posGood) > norm(posB - posGood)
    pos = posB;
else
    pos = posA;

Если вы хотите автоматизировать все, вы можете собрать все измерения в матрицу Nx2 и сделать следующее:

function [dist, idx] = RankPositions(pos)
%# pos should be an Nx2 matrix of x,y candidate positions

dist = pos - repmat(mean(pos), length(pos), 1); %# this is for octave, matlab might handle pos - mean(pos)
dist = norm(dist, 'rows');
[dist, idx] = sort(dist);

%# one liner:
%# [dist, idx] = sort(norm(pos - repmat(mean(pos), length(pos), 1)), 'rows'));

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

realpos = pos(idx(1:10));
...