Analogue of the scale-invariant feature transform (SIFT) for three-dimensional images. Includes an image processing and linear algebra library with feature matching and RANSAC regression. Also includes IO functions supporting a variety of image formats.
C CMake Matlab C++
Clone or download
bbrister renamed variables for clarity, changed pow(2.0,... to ldexp(1.0,... f…
…or style and negligible gains in efficiency
Latest commit 50f06d0 Jan 18, 2018
Failed to load latest commit information.


Copyright (c) 2015-2017 Blaine Rister et al., see LICENSE for details.

SIFT3D is an analogue of the scale-invariant feature transform (SIFT) for three-dimensional images. It leverages volumetric data and real-world units to detect keypoints and extract a robust description of their content. It can also perform 3D image registration by matching SIFT3D features and fitting geometric transformations with the RANSAC algorithm. All of this is implemented in a cross-platform C library, with wrappers for Matlab.

SIFT3D includes imutil, a utility library for image processing and linear algebra. This library performs file IO in a variety of medical imaging formats, including DICOM and NIFTI.


This code creates the following executables:

  • kpSift3D - Extract keypoints and descriptors from a single image.
  • regSift3D - Extract matches and a geometric transformation from two images.

and the following libraries:

  • - Image registration from SIFT3D features
  • - Extract and match SIFT3D features
  • - Utility library for image processing, regression and linear algebra. Includes IO functions for DICOM and NIFTI file formats.

It also contains a Matlab toolbox for calling the library functions from Matlab scripts. See the README in /wrappers/matlab for more information.

Installation instructions

See doc/INSTALL_<PLATFORM>.md for instructions on installing SIFT3D for your specific platform.

Usage instructions

For instructions on using the CLI, use the "--help" option, e.g. kpSift3D --help

See /examples for sample programs using the C and Matlab APIs.

The following sections describe how to link a program to the SIFT3D libraries.

Linking to SIFT3D libraries with CMake

SIFT3D exports a CMake package to the install directories. Here is an example of compiling a C program with SIFT3D from a CMake list.

    find_package (SIFT3D) # Find SIFT3D
    add_executable (helloWorld helloWorld.c) # Declare a target
    target_link_libraries (helloWorld PUBLIC ${SIFT3D_LIBRARIES}) # Link to the SIFT3D libraries
    if (WIN32) # Find the SIFT3D headers
        target_include_directories (helloWorld PUBLIC "${SIFT3D_DIR}/../${SIFT3D_INCLUDE_DIRS}") 
        target_include_directories (helloWorld PUBLIC ${SIFT3D_INCLUDE_DIRS}) 

Linking to SIFT3D libraries without CMake

The header files and libraries are installed to "sift3d" subdirectories in your installation tree. On most systems, you will need to add these subdirectories to your include and linker search paths. You will also need to link to the dependencies listed below.

  • libimutil - requires linking to LAPACK, BLAS, and zlib. Linking to DCMTK and nifticlib are optional.
  • libsift3d - requires linking to imutil
  • libreg - requires linking to sift3d and imutil

Information about the dependencies can be found in the installation instructions.

Note: On Windows systems, some of the dependencies are statically linked to the SIFT3D libraries. In this case, it suffices to link to the DLLs in the "bin" subdirectory of your installation.


Please contact me at if you have any questions or concerns.

If you would like to cite this work, please refer to the following paper:

B. Rister, M. A. Horowitz and D. L. Rubin, "Volumetric Image Registration From Invariant Keypoints," in IEEE Transactions on Image Processing, vol. 26, no. 10, pp. 4900-4910, Oct. 2017. doi: 10.1109/TIP.2017.2722689

The paper and automatic citations are available here.