Wprowadzam wykrywacz narożny Harris do celów edukacyjnych, ale utknąłem w części odpowiedzi Harris. Zasadniczo co robie, jestImplementacja wykrywacza naroży Harris
- Oblicz gradienty natężenia obrazu, w kierunku X i kierunku Y wyjście
- Plama z (1)
- Oblicz Harris odpowiedzi na wyjście (2)
- Zmniejsz nie-maksymy na wyjściu (3) w otoczeniu 3x3 i wyjściu progowym
1 i 2 wydają się działać poprawnie; jednak otrzymuję bardzo małe wartości jako odpowiedź Harrisa i żaden punkt nie osiąga progu. Wejście to standardowa fotografia plenerowa.
[...]
[Ix, Iy] = intensityGradients(img);
g = fspecial('gaussian');
Ix = imfilter(Ix, g);
Iy = imfilter(Iy, g);
H = harrisResponse(Ix, Iy);
[...]
function K = harrisResponse(Ix, Iy)
max = 0;
[sy, sx] = size(Ix);
K = zeros(sy, sx);
for i = 1:sx,
for j = 1:sy,
H = [Ix(j,i) * Ix(j,i), Ix(j,i) * Iy(j,i)
Ix(j,i) * Iy(j,i), Iy(j,i) * Iy(j,i)];
K(j,i) = det(H)/trace(H);
if K(j,i) > max,
max = K(j,i);
end
end
end
max
end
Dla przykładowego obrazu maks. Kończy się 6,4163e-018, co wydaje się zbyt niskie.
Powróciłem, by nie filtrować Ix2 itp., Dlatego w kopii na stackoverflow pozostało trochę błędów. – Etan
Problem polegał na tym, że nie podsumowałem wszystkich pikseli w kwadracie 3x3, aby znaleźć Ix2 itp .; zamiast tego właśnie użyłem odpowiedniego piksela. Po zmianie H w taki sposób, że sumuje wszystkie Ix2, Ixy i Iy2 dla wszystkich 9 pikseli, wygląda to bardzo ładnie. – Etan
det (H)/trace (H) to najczęściej używana aproksymacja w przypadku, gdy nie będziesz mieć lambda. – Etan