本算法是基于Lin Hong et al 的论文“Fingerprint ImageEnhancement: Algorithm and Performance Evaluation”编写而成。其中一个重要的假设就是:沿脊线垂直方向的灰度变化呈正弦波形。
程序的流程如下所示:
0 Notation
O 是方向场F 是频率场 R 是区域标记
1 Normalization
将原始图像的灰度值的均值和方差调整到所期望的均值和方差,减少沿脊和谷方向上的灰度级的变化。
img=imread('25_2.tif'); img=double(img); figure,imshow(img./255) [ht,wt] = size(img); m = mean(img(:)); v = var(img(:)); gmidx = find(img > m); lmidx = find(img <=m); m0=100;v0=100; nimg(gmidx) = m0 + sqrt((v0*(img(gmidx)-m).^2)/v); nimg(lmidx) = m0 - sqrt((v0*(img(lmidx)-m).^2)/v); nimg = reshape(nimg,[ht,wt]); figure,imshow(nimg./255)
2 Orientation Image
方向场反映了指纹图像上纹线的方向,其准确性直接影响图像增强的效果。
(1):将图像划分为不重叠的子块(16×16)
(2):利用Sobel算子计算每个子块的像素点的梯度值。
(3):利用以下公式计算中心点在(i,j)的子块的脊线的方向值
其中是以像素θ(i,j)为中心的子块的局部脊线方向。由于指纹脊线方向变化缓慢,并在一个小范围内具有相对稳定的变化趋势。因此可采用高斯低通滤波器进行平滑处理。
dbg_show_orientation=1; img=imread('6_2.tif'); img=double(img); % figure,imshow(img./255) hy = fspecial('sobel'); hx = hy'; gx = imfilter(img,hx,'same','symmetric'); gy = imfilter(img,hy,'same','symmetric'); g = gx+i*gy; gblk=blkproc(g.^2,[10 10],inline('sum(sum(x))')); oimg = 0.5*angle(gblk)+pi/2; [blkht,blkwt] = size(oimg) %smoothen_orientation_field g = cos(2*oimg)+i*sin(2*oimg); g = imfilter(g,fspecial('gaussian',5)); oimg= 0.5*angle(g); if(dbg_show_orientation) quiver(cos(oimg),sin(oimg)); axis ij;axis image; axis([0 blkwt 0 blkht]); title('Orientation Image'); pause; end;
3 Ridge Frequency Image
在指纹图像的局部非奇异区域里,沿着垂直于脊线的方向看,指纹脊线和谷线像素点灰度值大致形成一个二维的正弦波,定义纹线频率为相邻的两个波峰或波谷之间的像素点数的倒数。
(1):将图像划分为不重叠的子块(16×16)
(2):以图像子块中心点(i,j)为中心,子块脊线方向为短轴,作一个尺寸为的长方形窗口,如图所示:在窗口中按如下公式计算幅值X[K]