I am implementing a Harris corner detector for educational purposes but I'm stuck at the harris response part. Basically, what I am doing, is:
- Compute image intensity gradients in x- and y-direction
- Blur output of (1)
- Compute Harris response over output of (2)
- Suppress non-maximas in output of (3) in a 3x3-neighborhood and threshold output
1 and 2 seem to work fine; however, I get very small values as the Harris response, and no point does reach the threshold. Input is a standard outdoor photography.
[...]
[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
For the sample picture, max ends up being 6.4163e-018 which seems far too low.
The solution that I implemented with python, it works for me I hope you find what you are looking for
There is a function for that in the Computer Vision System Toolbox called
detectHarrisFeatures
.Basically, Harris corner detection will have 5 steps:
If you are implementing in MATLAB, it will be easy to understand the algorithm and get the results.
The following code of MATLAB may help you to solve your doubts:
A corner in Harris corner detection is defined as "the highest value pixel in a region" (usually
3X3
or5x5
) so your comment about no point reaching a "threshold" seems strange to me. Just collect all pixels that have a higher value than all other pixels in the5x5
neighborhood around them.Apart from that: I'm not 100% sure, but I think you should have:
K(j,i) = det(H) - lambda*(trace(H)^2)
Where lambda is a positive constant that works in your case (and Harris suggested value is 0.04).In general the only sensible moment to filter your input is before this point:
[Ix, Iy] = intensityGradients(img);
Filtering
Ix2
,Iy2
andIxy
doesn't make much sense to me.Further, I think your sample code is wrong here (does function
harrisResponse
have two or three input variables?):Proposed implementation is terribly inefficient. Lets' start after calculating gradients (which can be optimized too):
No loops required, because Matlab hates loops.