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

текст ссылки

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


person Veronica    schedule 11.03.2010    source источник


Ответы (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
comment
Matlab может обрабатывать pos-mean(pos) с помощью bsxfun следующим образом: bsxfun(@minus,pos,mean(pos)) - person Jonas; 11.03.2010
comment
@ Джонас - спасибо. Это одна из тех идиом, с которыми я никогда не чувствовал себя комфортно. - person mtrw; 11.03.2010