Matches by the SIFT like pipeline on two images of Notre Dame.
In this project we attempted to build a SIFT-like pipeline for matching feature points between images. In order to do this we had to implement:
More information can be found in the project spec here
Circled corners after non-max suppression.
I used a the Harris corner detector to detect corners in the image and then extracted maximum points to be used as interest points. More information on calculating the Harris corners can be found here on slide 7. The method used to detect Harris corners in my code uses the longer/clearer method of calculating derivatives and Gaussian blurring described at the above link. After calculating the Harris values I then performed non-maximum suppression by taking the max over a small neighborhood of pixels (3x3).
Extracting SIFT like features is simple if you follow the basic recipe:
Following this method you end up with a feature for each interest point
Matches between interest points in two images of Notre Dame (n=100 points).
For matching features we calculated euclidean distance between all pairs of features (128 dimensional vectors). We then sorted the points by relative distance between their features (closest being the best) and took the ratio of the top two matches for each point. If this ratio is high (near 1) then the best two matches are similar "distances" away indicating that this point is not unique and should not be used as an interest point. On the other hand points that had a small ratio between their top two contestants (near 0) are good interest points. From there we pick the top n matches sorted by the lowest ratio.
Image name | Accuracy for top 100 points | Accuracy for top 200 points | Accuracy for top 500 points |
Notre Dame | 94% | 86% | 60% |
Mount Rushmore | 84% | 61% | 33% |
Episcopal Gaudi | 4% | 3% | 2% |
NOTE: Higher scores were achieved for Episcopal Gaudi when we used the image patch as the feature or when we increased the size of the non-max neighborhood, but the numbers in the table should be representative of the default accuracy when you run this pipeline.