Beruflich Dokumente
Kultur Dokumente
Fingerprint Matching
The Fingerprint Image
Scanners provides API to get the image Typical fingerprint has 256 gray scales, so needs 1 byte to represent each pixel. value 0 is BLACK and value 255 is WHITE Typical resolution is 500 PPI
Simple representation of an Image would be unsigned char image [Height] [Width];
Getting a pixel value in an Image is indexing unsigned char value = image[row] [column];
Fingerprint Matching
The Features
Fingerprint have ridges and valleys (the black are the ridges and white valleys) Ridge ending and Ridge Bifurcation are of interest. Find these ridge endings and bifurcations and store their position X,Y and angle These features are minutiae and the set of all the minutiae together is the ending template!! (with some additional info)
bifurcations
Fingerprint Matching
Feature Matching
Given two sets of features determine if they are of the same finger. Find the amount of similarity between features, if it is above some threshold then probably they are from the same finger. Point pattern Matching Problem.
Fingerprint Matching
Steps in feature extraction
-Reduce Noise from Image Histogram Equalization, Gaussian Filter -Segment Image (identify the background and foreground) Simple variance based to complex direction based -Binarize Image Simple Threshold or adaptive threshold or direction based -Image Thinning reduce to 1 pixel width without breaking lines. -Minutiae Detection Find pixel where ridge ends or bifurcates -Minutiae Post Processing Remove false minutiae such as border, artifacts generated by earlier processing, and not so sure!! -Store minutiae in database (along with persons ID)
Fingerprint Matching
Noise Reduction
Fingerprint Matching
Noise Reduction
Consider Image represented as 2 dimensional array of unsigned char with h as height and w as width. Following code filters the image and creates a new filtered image using Gaussian 3x3 kernel
unsigned char gfilt[3][3] = { { 1, 2, 1 }, { 2, 4, 2 }, { 1, 2, 1 } }; for ( int a = 1; a < height - 1; a++ ) { for ( int b = 1; b < width 1; b++ ) { value = 0; for ( int j = -1; j <= 1; j++ ) { for ( int k = -1; k <= 1; k++ ) { value += image[a+j][b+k] * gfilt[j+1][k+1]; } } newimage[a][b] = value / 16; } }
Fingerprint Matching
Binarization
Adaptive
Directional
Threshold
Fingerprint Matching
Thinning
Fingerprint Matching
Minutiae Detection
Fingerprint Matching
Minutiae Detection
Compute Crossing number for a black pixel in image. Crossing at P is define as CN(P) = half the sum of the differences between the adjacent pixels in the 8 neighborhood of P if CN = 1 then termination if CN = 3 then bifurcation above 3 is complex minutiae such as cross over etc.
Fingerprint Matching
// MINUTIAE COMPUTATION ON THINNED IMAGE #define PVAL(x) (x) == 0 ? 1 : 0 int FPDetectMinutiae ( unsigned char *image, int h, int w, char *minfile) { int r, c, count, cn; FILE *fp; if (( fp = fopen(minfile,"w")) == NULL )return -1; for ( r = 16; r < h - 16; r++ ) { for ( c = 16; c < w - 16; c++ ) { if ( image[r*w+c] == WHITE_PIXEL ) continue; cn = 0; cn += abs(PVAL(image[(r-1)*w+c]) - PVAL(image[(r-1)*w+(c-1)])); cn += abs(PVAL(image[(r-1)*w+(c+1)]) - PVAL(image[(r-1)*w+c])); cn += abs(PVAL(image[(r)*w+(c+1)]) - PVAL(image[(r-1)*w+(c+1)])); cn += abs(PVAL(image[(r+1)*w+(c+1)]) - PVAL(image[(r)*w+(c+1)])); cn += abs(PVAL(image[(r+1)*w+c]) - PVAL(image[(r+1)*w+(c+1)])); cn += abs(PVAL(image[(r+1)*w+(c-1)]) - PVAL(image[(r+1)*w+c])); cn += abs(PVAL(image[(r)*w+(c-1)]) - PVAL(image[(r+1)*w+(c-1)])); cn += abs(PVAL(image[(r-1)*w+(c-1)]) - PVAL(image[r*w+(c-1)])); cn /= 2; // Termination Minutia if ( cn == 1 ) fprintf(fp,"%d %d 0 0\n", c, r ); // Bifurcation or complex minutia else if ( cn >= 3 ) fprintf(fp,"%d %d 1 0\n", c, r ); } } fclose(fp); return 0; }