细节提取算法Java

时间:2013-08-29 07:16:05

标签: java image-processing fingerprint

我有一个从指纹设备获取数据的应用程序。 Finger Minutiae Extraction有3个步骤:

  1. 指纹图像二值化
  2. 图像细化
  3. Minutiae Extraction
  4. 我完成了Image binarization和Image thinnig部分。 现在我已经实现了Minutiae Extraction的代码。代码如下所示:

    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;
    }
    

    但是这段代码大约平均计算300 END OF LINES。它考虑了线点的每一端。

    enter image description here

    任何人都可以帮我优化代码吗?

2 个答案:

答案 0 :(得分:2)

所以这样做的原因是,在获取细节图时,也会检测到错误的细节。因此,在获得细节之后,我们必须从细节图中删除错误的细节。

虚假细节的类型:

  1. 圆柱
  2. 此外,在感兴趣区域的边界附近总是检测到大量的错误细节(边界效应)。

    因此,为了消除这些错误细节,定义了各种算法。 其中一个在this link中定义。

答案 1 :(得分:0)

如果您需要的是以X,Y形式获取微观点及其方向角,请查看Source AFIS项目here。我能用它从指纹图像中提取微缩数据。