Estoy implementando un detector de esquina Harris con fines educativos, pero estoy atascado en la parte de respuesta de harris. Básicamente, lo que estoy haciendo, es:Implementación de un detector de esquina Harris
- Compute gradientes de intensidad de la imagen en x e y-dirección salida
- la falta de definición de (1) respuesta
- Compute Harris sobre la producción de (2)
- Suprimir no máximas en la salida de (3) en una vecindad de 3x3 y salida de umbral
1 y 2 parecen funcionar bien; sin embargo, obtengo valores muy pequeños como la respuesta de Harris, y ningún punto alcanza el umbral. La entrada es una fotografía estándar al aire libre.
[...]
[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
Para la imagen de muestra, max termina siendo 6.4163e-018 que parece demasiado bajo.
He vuelto a no filtrar Ix2 etc. más, por lo tanto, había algún error en la copia en stackoverflow. – Etan
El problema fue que no resumí todos los píxeles en el cuadrado de 3x3 para averiguar el Ix2, etc .; en cambio, acabo de usar el píxel correspondiente. Después de cambiar H de una manera que resume todo Ix2, Ixy e Iy2 para los 9 píxeles, se ve muy bien. – Etan
det (H)/trace (H) es una aproximación usada frecuentemente en el caso en que no tendrá una lambda. – Etan