Question

I have an application which takes data from the fingerprint device. There are 3 steps for the Finger Minutiae Extraction:

  1. Fingerprint image Binarization
  2. Image Thinning
  3. Minutiae Extraction

I am done with the Image binarization and Image thinnig part. Now I have implemented code for the Minutiae Extraction. Code look like this:

byte[][] outSkeleton = BasicOperations.copy(fingerprint.getSkeleton());

    int margin = 50;
    int bif = 0;
    int eol = 0;
    for(int i=margin+20; i<width-margin-20; i++){
        for(int j=margin; j<height-margin; j++){
            int patterns = BasicOperations.timesPattern01(i,j,fingerprint.getSkeleton());
            if(fingerprint.getSkeleton()[i][j]==1){
                if(patterns==1){
                    outSkeleton = drawRectangle(i,j,outSkeleton,2);
                    eol++;
                }
                if(patterns==3){
                    outSkeleton = drawRectangle(i,j,outSkeleton,3);
                    bif++;
                }
            }
        }
    }

..........

public static int timesPattern01(int i, int j, byte[][] image){
    int pattern01 = 0;

    //Counting threads[0,1]
    if(image[i-1][j]==0 && image[i-1][j+1]==1) pattern01++;
    if(image[i-1][j+1]==0 && image[i][j+1]==1) pattern01++;
    if(image[i][j+1]==0 && image[i+1][j+1]==1) pattern01++;
    if(image[i+1][j+1]==0 && image[i+1][j]==1) pattern01++;
    if(image[i+1][j]==0 && image[i+1][j-1]==1) pattern01++;
    if(image[i+1][j-1]==0 && image[i][j-1]==1) pattern01++;
    if(image[i][j-1]==0 && image[i-1][j-1]==1) pattern01++;
    if(image[i-1][j-1]==0 && image[i-1][j]==1) pattern01++;

    return pattern01;
}

.....

private static byte[][] drawRectangle(int x, int y, byte[][] skeleton, int color){
    int size = 3;
    for(int i=-size; i<=size; i++){
        skeleton[x-i][y+size] = (byte)color;
        skeleton[x+i][y-size] = (byte)color;
        skeleton[x-size][y+i] = (byte)color;
        skeleton[x+size][y-i] = (byte)color;
    }
    return skeleton;
}

But this code calculate around average 300 END OF LINES. It takes into account every end of line point.

enter image description here

Could any one help me to optimize the code?

Was it helpful?

Solution

So the reason for this is, while getting the minutiae map false minutiae are also detected. So after getting the minutiae we have to remove the false minutiae from the minutiae map.

Types of false minutiae:

  1. Spike
  2. Bridge
  3. Hole
  4. Break
  5. Spur
  6. Ladder

In addition a large number of false minutiae are always detected close to the boundary of the region of interest (boundary effect).

So for removing these false minutiae there are various algorithms defined. One of them is defined in this link.

OTHER TIPS

If what you need is to get miniature points in the form X, Y with their angle of orientation, check out Source AFIS project here. I was able to extract miniature data from fingerprint images with it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top