simplestitcher
Summary
simplestitcher is a small program built on top of OpenCV that is capable of aligning overlapping images from a two-dimensional plane. Notably, it does not compensate for lens distortion or three-dimensional perspective, so it's not suitable for general photography. However, it's quite straightforward for aligning and stitching images from a microscope, for example.
Download
I have developed and tested simplestitcher on amd64 gnu/linux; however, it should build on any platform where gcc and OpenCV are available. For convenience, I also provide a win32 build here, but it is quite bare: it's just a zipfile with the necessary DLLs and a command-line executable.
Implementation
simplestitcher operates in a series of stages:
- Feature detection. SURF [1] features and their associated 128-value descriptors are extracted from each image.
- Pairwise matching. For every pair of images, feature descriptors are compared (in the naïve $O(n^2)$ way). A robust 2D alignment is then computed using RANSAC [2]. The cost of the pairwise alignment is taken to be the average of the Euclidean norms of the error vectors for the alignments of each of the inlying matches.
- Global alignment. A global alignment is computed by finding the minimum spanning tree of a graph whose nodes correspond to the input images, and whose edges correspond to the pairwise alignments computed in the previous step. The costs of the edges correspond to the error values for the alignments. If the graph is not connected, then the program aborts.
- Stitching. An image of suitable dimensions is created, and then filled by sampling (using cubic spline interpolation) from the original images.
Usage and command-line options
simplestitcher provides only a rudimentary command-line interface. It accepts a list of filenames as arguments, performs the alignment and stitching, and, if successful, writes the resulting image to a file whose name is chosen based on the current date and time.
A number of command-line options are supported:
--ransac_num_iterations=N Run N iterations of the basic RANSAC loop. --ransac_sample_size=N In each RANSAC iteration, compute a potential alignment using a random sample containing N matched features. --ransac_min_inliers=N In each RANSAC iteration, discard a potential alignment unless it produces at least N inliers. --ransac_inlier_tolerance=X Maximum Euclidean distance between a matched feature's actual position and its position under the potential alignment, if it is to be classified as an inlier. --descriptor_match_threshold Maximum 2-norm difference between descriptor vectors if their features are to be considered a match. --output_file If specified, the output image will be written to this file (in a format determined by the file extension). If this flag is not specified, the output filename is chosen based on the current date and time.
License and warranty
simplestitcher is released under a BSD license; you are free to copy, distribute, and modify the program as you see fit under the terms of this license.
While I do hope that the software will be useful in a scientific setting, the software is provided as-is with no guarantee of correctness. It's the responsibility of the user to verify the program's output for accuracy.
Contributing
Patches are welcome.
References
[1] H. Bay, T. Tuytelaars, and L. Van Gool, “SURF: Speeded Up Robust Features,” in Computer Vision—ECCV 2006, (A. Leonardis, H. Bischof, and A. Pinz eds), vol. 3951, pp. 404–417, of Lecture notes in Computer Science, Springer, 2006. [PDF]