Finger Print Orientation FIeld

This issue is devoted to my first meeting with Computer Vision. It is a part of my first thesis for my Bachelor Degree in Control Systems in Technical University of Sofia - Campus Plovdiv. Because I did not prefer the themes which the lecturers was provided I decided to think up my own theme. This project concerns a pre-processing approach for finger prints processing related to their later processing in biometric recognition algorithms. I will outline the basics of the used approach and for some issues and additional explanation, please follow the links. Finger prints are today the most widely used biometric features for personal identification. Basically, the idea of the project is to process the raw finger print image scanned from a sheet of paper. There are many issues related to the finger print image quality because of, for example, wounds of the finger skin, dirtiness, cracks of the skin, noises of the image sensor etc. Because the quality of the finger print image is not so preferable, it should be enhanced using some method.

Different fingerprint image incompatibles

There are many decisions of that problem, for example frequency filtering, some complex sequential methods as histogram equalization, Wiener filtering, binarization, image opening and closing (as a combination of morphological image erosion and dilation), thinning etc. The purpose is the feature points – minutiae - to be extracted.

Minutiae


Such feature points can be terminations and bifurcations of the finger print ridges which are hard to be extracted if the image is processed via the feature points extracting algorithm directly. In my thesis I used spatial non-adaptive filtering. One of the tasks was to be generated a Gabor filter bank which will be used later for filtering the different image sections according to their orientation. I will not expose the entire thesis; but I wish to present you the most interesting task – “orientation field estimation”.

Orientation field estimation


Orientation field flow is an interesting approach for processing of finger print images. The reason I used the orientation field was to enhance the quality of the finger print images. I will not present all of my project because it will be hard to me to translate it in English, however I will describe just the orientation field estimation. I need the orientation field flow so that I can use later the Gabor filter bank for enhancement of the image. So, when we have some finger print image (for example this):


A raw finger print image

we should apply the following equations to the image:



To apply this algorithm we should use block processing and we need to divide the image of blocks of size "UxV" ( for example 5x5). In these equations "dx" and "dy" are the gradients in "x" and "y" received using Sobel operator. It does not mean that we use Sobel mask of size 5x5. The Sobel mask may be of size 3x3 estimating the gradient pixel by pixel, and then when we estimate Vx and Vy we divide the image of blocks of size UxV. O(i, j) is the least square estimate of the local ridge orientation at the block centered at pixel (i, j).
Here is a grayscale image which represents the block values of O(i, j) :

O(i, j) values image

Here is an image of the orientation field flow:

Orientation field flow

And finally, an image of the orientation field flow in addition to the finger print image:

Finger print image + Orientation field flow

Due to presence of noise, corrupted ridge and furrow structures in the input image, the estimated local orientation, O(i, j) may not always be estimated correctly. The local ridge orientation varies slowly in a local neighborhood where no singular points appear, a low-pass filter can be used to modify the incorrect local ridge orientation. However, this will not be presented in this post. 

Here is the M-code which you can use in Matlab to test the approach or to modify and to develop:

clear all
RGB=imread('3.jpg');
B1=rgb2gray(RGB);
C1=255-B1;
B=int16(B1);
im=imresize(B, [500 500]);
bw=im2bw(im);
H = FSPECIAL('sobel');
GrY=imfilter(im,H);
GrX=imfilter(im,H');
[i_lim, j_lim]=size(im);
i=-4;
Field=zeros(500,500);

while (i<(i_lim-6))
    i=i+10;
    j=-4;
    while (j<(j_lim-6))
       
        j=j+10;
        u=i-5:i+4;
        v=j-5:j+4;
        Vx(i, j)=sum(sum(2*GrX(u, v).*GrY(u, v)));
        Vy(i, j)=sum(sum((GrX(u, v)).^2-(GrY(u, v)).^2));
       
            tmp=0.5*(atan2(Vy(i, j),Vx(i, j)))+(pi/4);
           
            O(u, v)=tmp;

            if (tmp>-1*pi/12)&(pi/12>tmp)           
                Field(i,v)=ones(1,10);
            end
            if (tmp<7*pi/12)&(5*pi/12<tmp)           
                Field(u,j)=ones(10,1);
            end
            if (tmp>8*pi/12)|(-pi/6>tmp)            
                Field(u,v)=eye(10,10);

            end
            if (tmp>3*pi/12)&(tmp<5*pi/12)           
                Field(u,v)=[0 0 0 0 0 0 0 1 0 0;
                            0 0 0 0 0 0 1 0 0 0;
                            0 0 0 0 0 0 1 0 0 0;
                            0 0 0 0 0 1 0 0 0 0;
                            0 0 0 0 0 1 0 0 0 0;
                            0 0 0 0 1 0 0 0 0 0;
                            0 0 0 0 1 0 0 0 0 0;
                            0 0 0 1 0 0 0 0 0 0;
                            0 0 0 1 0 0 0 0 0 0;
                            0 0 1 0 0 0 0 0 0 0];

            end 
            if (tmp<3*pi/12)&(tmp>pi/12)             
                Field(u,v)=[0 0 0 0 0 0 0 0 0 0;
                            0 0 0 0 0 0 0 0 0 0;
                            0 0 0 0 0 0 0 0 0 1;
                            0 0 0 0 0 0 0 1 1 0;
                            0 0 0 0 0 1 1 0 0 0;
                            0 0 0 1 1 0 0 0 0 0;
                            0 1 1 0 0 0 0 0 0 0;
                            1 0 0 0 0 0 0 0 0 0;
                            0 0 0 0 0 0 0 0 0 0;
                            0 0 0 0 0 0 0 0 0 0];

            end 
            if (tmp<8*pi/12)&(tmp>7*pi/12)           
                Field(u,v)=[0 0 1 0 0 0 0 0 0 0;
                            0 0 0 1 0 0 0 0 0 0;
                            0 0 0 1 0 0 0 0 0 0;
                            0 0 0 0 1 0 0 0 0 0;
                            0 0 0 0 1 0 0 0 0 0;
                            0 0 0 0 0 1 0 0 0 0;
                            0 0 0 0 0 1 0 0 0 0;
                            0 0 0 0 0 0 1 0 0 0;
                            0 0 0 0 0 0 1 0 0 0;
                            0 0 0 0 0 0 0 1 0 0];

            end
            if (tmp<-pi/12)&(tmp>-pi/6)              
                Field(u,v)=[0 0 0 0 0 0 0 0 0 0;
                            0 0 0 0 0 0 0 0 0 0;
                            1 0 0 0 0 0 0 0 0 0;
                            0 1 1 0 0 0 0 0 0 0;
                            0 0 0 1 1 0 0 0 0 0;
                            0 0 0 0 0 1 1 0 0 0;
                            0 0 0 0 0 0 0 1 1 0;
                            0 0 0 0 0 0 0 0 0 1;
                            0 0 0 0 0 0 0 0 0 0;
                            0 0 0 0 0 0 0 0 0 0];
            end 
    end
end

F=int16(Field*255);    
Z=imadd(im,F);          
Z=uint8((255/528)*Z);     
figure(1);imshow(Z);     
figure(2);imshow(O);     
figure(3);imshow(Field);  

Every of the pre-generated filter masks from the Gabor filter bank is applied according to the orientation of every one of the blocks by convolution. Here is the result of the filtering.

Filtered image with the Gabor filter bank
Raw fingerprint image














Няма коментари:

Публикуване на коментар