This is a concise review of biometric qualities of the opensource project Fingerprint recognition SDK. I’ve done this review when launching SourceAFIS project. I’ve meantime implemented many ideas from FR-SDK project, but there’s still something to learn. I am leaving the review here with hope that someone will find it useful. I am also hoping to implement the ideas that haven’t been imported yet into SourceAFIS someday in the future. It’s a rather dense technical reading. You should refer to the linked documents for examples and some more explanation. See also my review of NBIS algorithm.
Documented roughly in a presentation by Oleg Ostap.
- global contrast normalization – Histogram, clip some top/bottom pixels, normalize.
- mask – Limit on block darkness or limit on gradient. Gradient is computed from oddly smoothed image. Gradient limit is relative to average gradient in image.
- local contrast normalization – No clipping, simply scale min-max, don’t scale low contrast areas and high contrast areas, scale only the middle, no interpolation between blocks.
- orientation – Surprisingly crappy gradient algorithm. Some optional normalization trick that I don’t understand.
- ridge frequency – I don’t understand this. Variables named tmp_intNN and comments in Cyrillic…
- Gabor filter – Just applies precomputed Gabor filter specialized for ridge orientation and frequency.
- binarization – NIST-like binarization relative to local average along line orthogonal to ridge orientation. Line length optionally adapted to ridge frequency.
- median smoothing – Median is computed within circle of about radius 7, optionally adapted to ridge frequency. The circle is sampled with small number of lines crossing its center. Value of the point is determined as a median of sampled pixels. This reliably kills thin lines though. Thin lines are additionally killed in a separate stage designed to do this.
- thinning – Applied separately to ridges and valleys. Thinning uses odd algorithm that I don’t readily understand. Looks like something that spirals the ridge removing border points along the way. Endings and bifurcations come directly from thinned image.
- minutia filter – Filters out minutiae close to mask or image border, filters gaps in skeleton, short branches, short ridges/valleys.
- orientation environment – Every minutia is additionally enriched with local orientation sampled along 2 circles (radius 30 and 50) with 16 points around each circle.
Documented roughly in a presentation by Volodymyr Ostap.
- local minutia match – Matches two minutiae relatively to already matched reference minutia. Filters by distance error, position angle error, and rotation angle error. Additionally filters by local orientation and count of matched neighbors.
- match tree – This is developed using local minutia matches from some initial minutia match. It seems that closest minutia is always selected to continue tree construction. How does it select first minutia? Does it try all of them?
- minutia neighborhood – Some fixed number of closest minutiae are precomputed to reduce number of tested minutiae.
- penalization – Under some circumstances (score range from first stage), penalization decreases score based on number of non-matched minutiae in overlapping region, non-matching edges around matching minutiae, high minutia density.
- repeated matching – It seems that the matching stage is executed repeatedly in a loop. No idea why this is done. It seems that transformation (angle, shift) is being readjusted in every cycle.
The algorithm includes automatic parameter tuning, accuracy and performance testing, simple API for Windows and Linux, sample application, and a visual analysis tool.