Основываясь на приведенной выше ссылке, мне удалось получить точку пересечения, но иногда я получаю 2 или более результатов. У меня есть 10 похожих изображений, где крест слегка смещен в каждом кадре. Есть ли способ удалить оставшиеся лишние пиксели, которые сильно отличаются от других 9 изображений, сравнив их с точкой пересечения 1-го изображения? Поскольку движение довольно мало, правильно ли сказать, что пиксель, который следует выбрать из 2 или более результатов, которые я получил, должен быть тем, который имеет самое близкое значение, которое у меня есть из пикселя предыдущего изображения? Есть ли способ сделать это? Спасибо!
Удаление лишних пикселей после сжатия до точки и выбора правильного пикселя в качестве точки пересечения с помощью Matlab
Ответы (2)
да. Вы можете попытаться выполнить обнаружение выбросов в координатах. Это требует, чтобы наибольшее накопление координат находилось в истинном центре креста. Из того, что вы описываете, это предположение выполняется.
%# 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,:) = [];
person
Jonas
schedule
11.03.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));
person
mtrw
schedule
11.03.2010
Matlab может обрабатывать pos-mean(pos) с помощью bsxfun следующим образом: bsxfun(@minus,pos,mean(pos))
- person Jonas; 11.03.2010
@ Джонас - спасибо. Это одна из тех идиом, с которыми я никогда не чувствовал себя комфортно.
- person mtrw; 11.03.2010