libsift - Scale-Invariant Feature Transform implementation
by Sebastian Nowozin
This page is about a reusable computer program that can help in locating
and using useful data about an image. Given the image, the program can
identify interesting points on the image ("features") and provide a
signature for each such point. The signature can be saved to a file in a
compact format. Later, this signatures can be compared against signatures from
other images and questions such as "Is a similar object present in both
images?" can be answered.
This software is unusable on its own, and gives only a foundation upon which
full programs can be build. One such program is my
, which can help in
creating a single large image from many overlapping images.
Introduction for computer scientists
This library is a 100% C# implementation of the SIFT algorithm
("Scale-Invariant Feature Transform") and additional matching
algorithms. The SIFT algorithm is an image feature location and extraction
algorithm which provides the following key advantages over similar algorithms:
- Combined feature location and extraction algorithm.
- The keypoint locations are more precise and repeatable, because SIFT
uses subpixel localization and multiple scale keypoint identification
- The descriptors are highly distinctive. For example, I tested with up
to 300,000 keypoints while matching a large 60 picture panorama and it did not
have a single invalid match.
- The feature vectors can be efficiently correlated using probabilistic
algorithms like Best-Bin-First kd-tree search.
SIFT is an invention of
, and the
mathematical details are described in the following papers:
- a .NET runtime environment, I prefer
Mono, using version 1.0 here
- a fairly recent version of
Gtk#, version ≥= 1.0
works for me
- lots of RAM: The image transformations require a substantial amount of
memory. 256Mb, or better yet, 512Mb make it fun.
Patent warning: The University of British Columbia has applied for a patent on
the SIFT algorithm in the United States. Commercial applications of this
software may require a license from the University of British Columbia.
Please read and acknowledge the
(GNU GPL) before running
Developing libsift and the related
autopano-sift software has required a
considerable amount of time and effort. If you want to support further
development, or if the library or program has been helpful to you, please
consider making a small donation. Thanks!
For the changelog, please see the autopano-sift
||Fixes against the Gtk# library and Mono 1.0.|
Fix compatibility with
the Microsoft .NET SDK compiler (csc).
||Add a lot of support code to assist the autopano-sift package, such as RANSAC and a 2d
image model. See the project page of autopano-sift for a detailed list of
||Minor bugfix in MatchKeys functionality (null ref
exception when no event handler had been registered.)|
||Initial release as separate library. The following
changes are relative to autopano-sift-1.1.|
Add DoG peak threshhold.
Add optional transparent gzip compression input/output to keypoint files.
Change to use 0-255 byte descriptors instead of double.
Improve default threshhold values.
Improve matching code by replacing FPU intense code by integer code (150-200%
Fix to use 3x3 Hessian instead of 2x2 to locate keypoints on subspace dimension.
Fix to check for DoG peak value.
Fix various smaller bugs.
Documentation and Usage
See the included README file. Except for inline comments there is no
documentation yet. See the autopano-sift
and the included examples to understand the usage.
I am curious about developer- and mathematicans feedback, so please mail me
your thoughts to
last update: Mon, 31 Oct 2005