指紋デバイスからデータを取得するアプリケーションがあります。指特徴点抽出には 3 つの手順があります。
- 指紋画像の二値化
- 画像の細線化
- 特徴点抽出
画像の二値化と画像の細線化の部分が完了しました。これで、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
ます。ラインのすべての終点が考慮されます。
コードを最適化するのを手伝ってくれる人はいますか?