Download this file

103 lines (89 with data), 3.6 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
% FREQEST - Estimate fingerprint ridge frequency within image block
%
% Function to estimate the fingerprint ridge frequency within a small block
% of a fingerprint image. This function is used by RIDGEFREQ
%
% Usage:
% freqim = freqest(im, orientim, windsze, minWaveLength, maxWaveLength)
%
% Arguments:
% im - Image block to be processed.
% orientim - Ridge orientation image of image block.
% windsze - Window length used to identify peaks. This should be
% an odd integer, say 3 or 5.
% minWaveLength, maxWaveLength - Minimum and maximum ridge
% wavelengths, in pixels, considered acceptable.
%
% Returns:
% freqim - An image block the same size as im with all values
% set to the estimated ridge spatial frequency. If a
% ridge frequency cannot be found, or cannot be found
% within the limits set by min and max Wavlength
% freqim is set to zeros.
%
% Suggested parameters for a 500dpi fingerprint image
% freqim = freqest(im,orientim, 5, 5, 15);
%
% See also: RIDGEFREQ, RIDGEORIENT, RIDGESEGMENT
%
% Note I am not entirely satisfied with the output of this function.
% Peter Kovesi
% School of Computer Science & Software Engineering
% The University of Western Australia
% pk at csse uwa edu au
% http://www.csse.uwa.edu.au/~pk
%
% January 2005
function freqim = freqest(im, orientim, windsze, minWaveLength, maxWaveLength)
debug = 0;
[rows,cols] = size(im);
% Find mean orientation within the block. This is done by averaging the
% sines and cosines of the doubled angles before reconstructing the
% angle again. This avoids wraparound problems at the origin.
orientim = 2*orientim(:);
cosorient = mean(cos(orientim));
sinorient = mean(sin(orientim));
orient = atan2(sinorient,cosorient)/2;
% Rotate the image block so that the ridges are vertical
rotim = imrotate(im,orient/pi*180+90,'nearest', 'crop');
% Now crop the image so that the rotated image does not contain any
% invalid regions. This prevents the projection down the columns
% from being mucked up.
cropsze = fix(rows/sqrt(2)); offset = fix((rows-cropsze)/2);
rotim = rotim(offset:offset+cropsze, offset:offset+cropsze);
% Sum down the columns to get a projection of the grey values down
% the ridges.
proj = sum(rotim);
% Find peaks in projected grey values by performing a greyscale
% dilation and then finding where the dilation equals the original
% values.
dilation = ordfilt2(proj, windsze, ones(1,windsze));
maxpts = (dilation == proj) & (proj > mean(proj));
maxind = find(maxpts);
% Determine the spatial frequency of the ridges by divinding the
% distance between the 1st and last peaks by the (No of peaks-1). If no
% peaks are detected, or the wavelength is outside the allowed bounds,
% the frequency image is set to 0
if length(maxind) < 2
freqim = zeros(size(im));
else
NoOfPeaks = length(maxind);
waveLength = (maxind(end)-maxind(1))/(NoOfPeaks-1);
if waveLength > minWaveLength & waveLength < maxWaveLength
freqim = 1/waveLength * ones(size(im));
else
freqim = zeros(size(im));
end
end
if debug
show(im,1)
show(rotim,2);
figure(3), plot(proj), hold on
meanproj = mean(proj)
if length(maxind) < 2
fprintf('No peaks found\n');
else
plot(maxind,dilation(maxind),'r*'), hold off
waveLength = (maxind(end)-maxind(1))/(NoOfPeaks-1);
end
end