Feature matching
Robert Burgess

In this project, I have implemented Harris corner detection, three feature descriptors, and the SSD-ratio feature matching algorithm. The first descriptor is an unoriented five-by-five window of intensity values; the second is a simplified version of MOPS, an eight-by-eight window subsampled from an oriented forty-by-forty window; the third and final descriptor is a slight variation I chose to experiment with.

Custom descriptor

My feature description procedure is a variation of MOPS; as in MOPS, a descriptor consists of an eight-by-eight window subsampled from an oriented forty-by-forty window. However, I noted that one of the (many) reasons SIFT outperforms MOPS is that it is based on gradients rather than intensities. Therefore, rather than sampling intensities, each subsampled pixel is described by its derivatives in the x and y directions.

Specifically, to compute a descriptor, I first convert the image to grayscale and smooth it with a seven-by-seven Gaussian, and use Sobel operators to pull out x and y derivatives separately. Then, for each feature, I scale its derivatives by dividing the magnitude of the gradient (normalizing to a unit vector) and multiplying by 5. Then I sample an eight-by-eight window in steps of the rescale gradient components, taking the samples from the x and y derivative images smoothed with a seven-by-seven Gaussian.

Each sample is represented by the smoothed by unscaled x and y derivatives. I experimented with direction, direction and magnitude, and even with reorienting the gradients to be in terms of the feature orientation, but none of them performed as well.

The details aside, the descriptor is essentially identical to our simplified MOPS but with x and y derivative samples rather than single intensity samples.

Harris operator values

ROC curves

Average AUCs

bikes
SSDRatio
Simple 0.367885 0.500765
MOPS 0.546433 0.604960
Custom 0.476540 0.642346
graf
SSDRatio
Simple 0.606698 0.539124
MOPS 0.595670 0.580762
Custom 0.593347 0.565761
leuven
SSDRatio
Simple 0.125417 0.496978
MOPS 0.108368 0.478125
Custom 0.483616 0.709490
wall
SSDRatio
Simple 0.190352 0.560487
MOPS 0.212969 0.499970
Custom 0.603434 0.652148

Strengths and weaknesses

Relative to MOPS, my custom descriptor achieves the best spread for the leuven data set, which demonstrates that it is less susceptible to changes in intensity; that is was one should expect by using gradients rather than intensities directly. Also for relatively easy cases, such as the Yosemite pictures in which the features are so far, my custom descriptor performs dramatically better.

However, it seems that in particularly complicated cases such as the graf data set, my implementation of MOPS slightly outperforms my custom descriptor. From that, I conclude that my descriptor, although more invariant to rotation and intensity scaling, is more susceptible to noise and projective transformation. Of course, neither the simplified MOPS nor the custom descriptor are even scale invariant, so there is no reason for either to perform particularly well in that case.

Additional photographs