Hi Folks,
I am still working on my degree project of fingerprint matching. I have changed the image of the print so far in the following ways; grey-scale, smooth, Binarized it and now I am thinning it i.e making it one pixel in width (skeleton). I will then be extracting the minutiae points and comparing them to the prints on file. However, I am having some trouble trying to get the results I need with thinning. I have some code to thin an image but instead of thinning it it appears to be making it larger?? I have stepped through it and believe it should work for me. If anyone has experience of thinning I would be grateful for any suggestions.
Thanks in advance,
-Colin.
Code:
void __fastcall TForm1::ThinningClick(TObject *Sender)
{
//THINNING
int count,count2,row,col;
int num_transitions ;
int transitions ;
int tempimage[297][353]={0};
int row1,col1;
for(row = 1; row < Image1->Height-1 ; row++)
{
for(col = 1; col < Image1->Width-1 ; col++)
{
count = 0;
num_transitions = 0;
// check for N(p)
if (Image1->Canvas->Pixels[col][row] == 0xFFFFFF)
{
if (Image1->Canvas->Pixels[col-1][row-1] != 0)
count++;
if (Image1->Canvas->Pixels[col][row-1] != 0)
count++;
if (Image1->Canvas->Pixels[col+1][row-1] != 0)
count++;
if (Image1->Canvas->Pixels[col+1][row] != 0)
count++;
if (Image1->Canvas->Pixels[col-1][row] != 0)
count++;
if (Image1->Canvas->Pixels[col+1][row+1] != 0)
count++;
if (Image1->Canvas->Pixels[col][row+1] != 0)
count++;
if (Image1->Canvas->Pixels[col-1][row+1] != 0)
count++;
if (count != 8)
{
// 2 <= N(p) <= 6
if (count >= 2 && count <= 6)
{
if(Image1->Canvas->Pixels[col-1][row] == 0 &&
Image1->Canvas->Pixels[col-1][row+1] == 0xFFFFFF)
num_transitions++ ;
if(Image1->Canvas->Pixels[col-1][row+1] == 0 &&
Image1->Canvas->Pixels[col][row+1] == 0xFFFFFF)
num_transitions++ ;
if(Image1->Canvas->Pixels[col][row+1] == 0 &&
Image1->Canvas->Pixels[col+1][row+1] == 0xFFFFFF)
num_transitions++ ;
if(Image1->Canvas->Pixels[col+1][row+1] == 0 &&
Image1->Canvas->Pixels[col+1][row] == 0xFFFFFF)
num_transitions++ ;
if(Image1->Canvas->Pixels[col+1][row] == 0 &&
Image1->Canvas->Pixels[col+1][row-1] == 0xFFFFFF)
num_transitions++ ;
if(Image1->Canvas->Pixels[col+1][row-1] == 0 &&
Image1->Canvas->Pixels[col][row-1] == 0xFFFFFF)
num_transitions++ ;
if(Image1->Canvas->Pixels[col][row-1] == 0 &&
Image1->Canvas->Pixels[col-1][row-1] == 0xFFFFFF)
num_transitions++ ;
if(Image1->Canvas->Pixels[col-1][row-1] == 0 &&
Image1->Canvas->Pixels[col-1][row] == 0xFFFFFF)
num_transitions++ ;
//S(p) = 1
if (num_transitions == 1)
{
// if p2 * p4 * p6 = 0
if (Image1->Canvas->Pixels[col][row-1] == 0 ||
Image1->Canvas->Pixels[col][row+1] == 0 ||
Image1->Canvas->Pixels[col+1][row] == 0)
{
// if p4 * p6 * p8 = 0
if(Image1->Canvas->Pixels[col][row+1] == 0 ||
Image1->Canvas->Pixels[col+1][row] == 0 ||
Image1->Canvas->Pixels[col][row-1] == 0)
tempimage[col][row] = 0;
else
tempimage[col][row] = 0xFFFFFF;
}
else
tempimage[col][row] = 0xFFFFFF;
}
else
tempimage[col][row] = 0xFFFFFF;
}
else
tempimage[col][row] = 0xFFFFFF;
}
else
tempimage[col][row] = 0xFFFFFF;
}
else
tempimage[col][row] =0;//0xFFFFFF;
}
}
//copy thinned image back to original
for(row = 0; row < Image1->Height ; row++)
for(col = 0; col < Image1->Width; col++)
Image1->Canvas->Pixels[col][row]=tempimage[col][row];
// step 2 of the thinning algorithm
for(row = 1; row < Image1->Height-1 ; row++)
{
for(col = 1; col < Image1->Width-1 ; col++)
{
count2 = 0;
transitions = 0;
if (Image1->Canvas->Pixels[col][row] == 0xFFFFFF)
{
if (Image1->Canvas->Pixels[col-1][row-1] != 0)
count2++;
if (Image1->Canvas->Pixels[col][row-1] != 0)
count2++;
if (Image1->Canvas->Pixels[col+1][row-1] != 0)
count2++;
if (Image1->Canvas->Pixels[col+1][row] != 0)
count2++;
if (Image1->Canvas->Pixels[col-1][row] != 0)
count2++;
if (Image1->Canvas->Pixels[col+1][row+1] != 0)
count2++;
if (Image1->Canvas->Pixels[col][row+1] != 0)
count2++;
if (Image1->Canvas->Pixels[col-1][row+1] != 0)
count2++;
if (count2 != 8)
{
if (count2 >= 2 && count2 <= 6)
{
if(Image1->Canvas->Pixels[col-1][row] == 0 &&
Image1->Canvas->Pixels[col-1][row+1] == 0xFFFFFF)
transitions++ ;
if(Image1->Canvas->Pixels[col-1][row+1] == 0 &&
Image1->Canvas->Pixels[col][row+1] == 0xFFFFFF)
transitions++ ;
if(Image1->Canvas->Pixels[col][row+1] == 0 &&
Image1->Canvas->Pixels[col+1][row+1] == 0xFFFFFF)
transitions++ ;
if(Image1->Canvas->Pixels[col+1][row+1] == 0 &&
Image1->Canvas->Pixels[col+1][row] == 0xFFFFFF)
transitions++ ;
if(Image1->Canvas->Pixels[col+1][row] == 0 &&
Image1->Canvas->Pixels[col+1][row-1] == 0xFFFFFF)
transitions++ ;
if(Image1->Canvas->Pixels[col+1][row-1] == 0 &&
Image1->Canvas->Pixels[col][row-1] == 0xFFFFFF)
transitions++ ;
if(Image1->Canvas->Pixels[col][row-1] == 0 &&
Image1->Canvas->Pixels[col-1][row-1] == 0xFFFFFF)
transitions++ ;
if(Image1->Canvas->Pixels[col-1][row-1] == 0 &&
Image1->Canvas->Pixels[col-1][row] == 0xFFFFFF)
transitions++ ;
if (transitions == 1)
{
// if p2 * p4 * p8 = 0
if(Image1->Canvas->Pixels[col][row-1] == 0 ||
Image1->Canvas->Pixels[col][row+1] == 0 ||
Image1->Canvas->Pixels[col][row-1] == 0)
{
// if p2 * p4 * p6
if(Image1->Canvas->Pixels[col-1][row] == 0 ||
Image1->Canvas->Pixels[col+1][row] == 0 ||
Image1->Canvas->Pixels[col][row-1] == 0)
tempimage[col][row] = 0;
else
tempimage[col][row] = 0xFFFFFF;
}
else
tempimage[col][row] = 0xFFFFFF;
}
else
tempimage[col][row] = 0xFFFFFF;
}
else
tempimage[col][row] = 0xFFFFFF;
}
else
tempimage[col][row] = 0xFFFFFF;
}
else
tempimage[col][row] = 0;
}
}
for(row = 0; row < Image1->Height ; row++)
for(col = 0; col < Image1->Width; col++)
Image1->Canvas->Pixels[col][row]=tempimage[col][row];
}