2009-11-08 12 views
5

Próbuję użyć normxcorr2 (normalized cross-correlation) z MATLAB do obliczenia prędkości poruszających się kształtów w rozwijającym się zarodku. Mam 3 pytania:Podstawy znormalizowanej korelacji krzyżowej

1) Mój rozmiar obrazu to 260x360 pikseli. Podaję szablon o rozmiarze 10x10 pikseli i proszę polecenie, aby wyszukiwał ten szablon w kolejnej ramce w oknie wyszukiwania o wymiarach 50x50 pikseli. Otrzymuję macierz korelacji o rozmiarze 59x59. Oznacza to, że polecenie przesuwa szablon piksel po pikselu w oknie wyszukiwania w poszukiwaniu najlepszej korelacji. Dobrze?

2) Każda wartość w macierzy korelacji reprezentuje matrycę szablonu w oknie wyszukiwania. Dobrze?

3) Powiedz, że otrzymuję maksimum w 10. rzędzie i 16 kolumnie w macierzy korelacji. Oznacza to, że najlepiej skorelowany szablon leży w 10 macierzy w kierunku y i 16 macierzy w kierunku x na obrazie. Dobrze?

Odpowiedz

4

Aby zilustrować zastosowanie normxcorr2 rozważmy następujący przykład (adaptacja this page)

%# Make light gray plus on dark gray background 
template = 0.2*ones(11); 
template(6,3:9) = 0.6; 
template(3:9,6) = 0.6; 
BW = single(template > 0.5);   %# Make white plus on black background 
imtool(template, 'InitialMagnification','fit') 

%# Make new image that offsets the template 
offsetTemplate = 0.2*ones(81); 
offset = [30 50];     %# Shift by 30 rows, 50 columns 
offsetTemplate((1:size(template,1))+offset(1), ... 
       (1:size(template,2))+offset(2)) = template; 
imtool(offsetTemplate, 'InitialMagnification',400) 

%# Cross-correlate BW and offsetTemplate to recover offset 
cc_norm = normxcorr2(BW, offsetTemplate); 
imtool(cc_norm, 'InitialMagnification',400) 
[max_cc_norm, imax] = max(abs(cc_norm(:))); 
[ypeak, xpeak] = ind2sub(size(cc_norm), imax(1)); 
corr_offset = [ (ypeak-size(template,1)) (xpeak-size(template,2)) ]; 

fprintf('Input offset: %d,%d\nRecovered offset: %d,%d\n', offset, corr_offset)