Feature Descriptor:
My feature detector begins by finding the average angle of the gradients in the 5x5 window surrounding the image using the derivatives calculated via the Sobel matrix. It then rotates the 5x5 window by 90, 180, or 270 degrees if it is not currently in the dominant orientation. Once rotated, it normalizes the intensities and stores the updated 5x5 window.
Design Decisions:
Variable Threshold:
One of the major design decisions I made was to have a variable threshold for the Harris values. In order to do this, I before deciding which pixels are features, I create a histogram of the Harris values. I use this to determine my threshold by setting the threshold high and then lowering it until I have at least 500 pixels above the current threshold. 500 seems to be a good number as after the non-local maximum pixels are removed I have approximately 200-300 features. I choose to do this as a consistent threshold wasn’t viable in my tests. The extremely blurry images (i.e. bikes6.ppm) did not have many features at a threshold that gave other images thousands of features. With this modification, I have approximately the same number of features per image.
Feature Descriptor:
I focused on the 3 main areas of illumination, rotation, and translation. I choose to continue using a 5x5 window as the descriptor. This allowed me to easily perform rotations of 90, 180, and 270 degrees. So I would check the dominant gradient direction of the window to determine the rotation necessary. The simpler rotation allowed me to use fewer resources. Since I was using the 5x5 window, I could use the gray scale image that we had to get the illumination values and then normalized them, so that the illumination was relative to the rest of the image instead of absolute differences between images. The translation was taken care of naturally.
Performance:
Graf Images |
Yosemite |
|
|
Img2.ppm |
Yosemite1.jpg |
Benchmarks:
Images |
SSD 5x5 |
Ratio 5x5 |
SSD AUC Mine |
Ratio AUC Mine |
Bikes |
.472 |
.521 |
.378 |
.578 |
Graf |
.600 |
.643 |
.530 |
.507 |
Wall |
.558 |
.643 |
.657 |
.678 |
Leuven |
.512 |
.680 |
.790 |
.772 |
Strengths & Weaknesses:
My feature descriptor handles illumination well as evidenced by is results on Leuven, which is its best. It does decently on rotation. The feature descriptor only accounts for large scale rotation, bur does not rotate on a fine scale. My feature descriptor struggles on blurry images. Its results on the bike benchmark were significantly weaker. This is partially due to the difficulty of finding good features in the image.