CONCLUSION AND FUTURE SCOPE
5.3 FUTURE SCOPE
Biometrics is quite rightly viewed to be at the cutting edge of security technology. From the very first commercial application of a finger print reader in 1984, we have seen new systems and applications introduced to the market on a regular basis; some are still firmly in the development phase whilst others, like iris and facial recognition, are gradually being introduced into practical installations.
In many ways, it has taken the increased threat from global terrorism and organised crime to create an acceptance of biometric security, convincing an anxious and cynical public that systems do not necessarily pose a threat to civil liberties, provided they are properly controlled and effectively managed.
In a recent pan-European survey of consumer attitudes conducted by LogicaCMG, research showed that the general public were more concerned with their safety when travelling - and with the security of managing their financial affairs - than they were threatened by any potential privacy issues. It seems that the debate has now moved on from questioning what is ethical and acceptable to asking what form of biometric technology is most effective and appropriate for particular applications.
Recent system developments have seen a significant change in both the biometric information being analysed and the quality of the reading and processing performance. From the early finger print readers - which still carry with them an unfortunate association with criminal identification, as well as some lingering doubts over the users ability to fool the scanners - have come a range of iris, face, vein and voice technologies. These emergent technologies are now providing specifiers and security managers with real choice, allowing them to select the most appropriate system for their particular needs - balancing the key variables of accuracy, quality, reliability, speed of performance and cost.
APPENDIX
<RIDGE FILTER>
function newim = ridgefilter(im, orient, freq, kx, ky, showfilter)
if nargin == 5 showfilter = 0;
end
angleInc = 3; % Fixed angle increment between filter orientations in % degrees. This should divide evenly into 180
im = double(im);
[rows, cols] = size(im); newim = zeros(rows,cols);
[validr,validc] = find(freq > 0); % find where there is valid frequency data.
ind = sub2ind([rows,cols], validr, validc);
% Round the array of frequencies to the nearest 0.01 to reduce the % number of distinct frequencies we have to deal with.
freq(ind) = round(freq(ind)*100)/100;
% Generate an array of the distinct frequencies present in the array % freq
unfreq = unique(freq(ind));
% Generate a table, given the frequency value multiplied by 100 to obtain % an integer index, returns the index within the unfreq array that it
% corresponds to
freqindex = ones(100,1);
for k = 1:length(unfreq)
freqindex(round(unfreq(k)*100)) = k;
% Generate filters corresponding to these distinct frequencies and % orientations in 'angleInc' increments.
filter = cell(length(unfreq),180/angleInc); sze = zeros(length(unfreq),1); for k = 1:length(unfreq) sigmax = 1/unfreq(k)*kx; sigmay = 1/unfreq(k)*ky; sze(k) = round(3*max(sigmax,sigmay)); [x,y] = meshgrid(-sze(k):sze(k));
reffilter = exp(-(x.^2/sigmax^2 + y.^2/sigmay^2)/2)...
.*cos(2*pi*unfreq(k)*x);
% Generate rotated versions of the filter. Note orientation % image provides orientation *along* the ridges, hence +90 % degrees, and imrotate requires angles +ve anticlockwise, hence % the minus sign.
for o = 1:180/angleInc
filter{k,o} = imrotate(reffilter,-(o*angleInc+90),'bilinear','crop');
end end
% if showfilter % Display largest scale filter for inspection % figure(7), imshow(filter{1,end},[]); title('filter'); % end
% Find indices of matrix points greater than maxsze from the image % boundary
maxsze = sze(1);
% Convert orientation matrix values from radians to an index value % that corresponds to round(degrees/angleInc)
maxorientindex = round(180/angleInc); orientindex = round(orient/pi*180/angleInc);
i = find(orientindex < 1); orientindex(i) = orientindex(i)+maxorientindex; i = find(orientindex > maxorientindex);
orientindex(i) = orientindex(i)-maxorientindex;
% Finally do the filtering for k = 1:length(finalind) r = validr(finalind(k)); c = validc(finalind(k));
% find filter corresponding to freq(r,c)
filterindex = freqindex(round(freq(r,c)*100)); s = sze(filterindex);
newim(r,c) = sum(sum(im(r-s:r+s, c-s:c+s).*filter{filterindex,orientindex(r,c)}));
end
<RIDGE FREQUENCY>
function [freq, medianfreq] = ridgefreq(im, mask, orient, blksze, windsze, ...
minWaveLength, maxWaveLength) [rows, cols] = size(im);
freq = zeros(size(im));
for r = 1:blksze:rows-blksze
for c = 1:blksze:cols-blksze
blkim = im(r:r+blksze-1, c:c+blksze-1); blkor = orient(r:r+blksze-1, c:c+blksze-1); freq(r:r+blksze-1,c:c+blksze-1) = ...
end end
% Mask out frequencies calculated for non ridge regions
freq = freq.*mask;
% Find median freqency over all the valid regions of the image.
medianfreq = median(freq(find(freq>0))); <RIDGE ORIENTATION>
function [orientim, reliability] = ...
ridgeorient(im, gradientsigma, blocksigma, orientsmoothsigma) [rows,cols] = size(im);
% Calculate image gradients.
sze = fix(6*gradientsigma); if ~mod(sze,2); sze = sze+1; end
f = fspecial('gaussian', sze, gradientsigma); % Generate Gaussian filter.
[fx,fy] = gradient(f); % Gradient of Gausian.
Gx = filter2(fx, im); % Gradient of the image in x
Gy = filter2(fy, im); % ... and y
% Estimate the local ridge orientation at each point by finding the % principal axis of variation in the image gradients.
Gxx = Gx.^2; % Covariance data for the image gradients
Gxy = Gx.*Gy; Gyy = Gy.^2;
% Now smooth the covariance data to perform a weighted summation of the % data.
Gxx = filter2(f, Gxx); Gxy = 2*filter2(f, Gxy); Gyy = filter2(f, Gyy);
% Analytic solution of principal direction
denom = sqrt(Gxy.^2 + (Gxx - Gyy).^2) + eps;
sin2theta = Gxy./denom; % Sine and cosine of doubled angles
cos2theta = (Gxx-Gyy)./denom;
sze = fix(6*orientsmoothsigma); if ~mod(sze,2); sze = sze+1; end
f = fspecial('gaussian', sze, orientsmoothsigma);
cos2theta = filter2(f, cos2theta); % Smoothed sine and cosine of
sin2theta = filter2(f, sin2theta); % doubled angles
orientim = pi/2 + atan2(sin2theta,cos2theta)/2;
% Calculate 'reliability' of orientation data. Here we calculate the % area moment of inertia about the orientation axiS
% orientation information.
Imin = (Gyy+Gxx)/2 - (Gxx-Gyy).*cos2theta/2 - Gxy.*sin2theta/2; Imax = Gyy+Gxx - Imin;
reliability = 1 - Imin./(Imax+.001);
% Finally mask reliability to exclude regions where the denominator % in the orientation calculation above was small. Here I have set % the value to 0.001, adjust this if you feel the need
reliability = reliability.*(denom>.001); <RIDGE SEGMENT>
function [normim, mask, maskind] = ridgesegment(im, blksze, thresh) im = normalise(im,0,1); % normalise to have zero mean, unit std dev
fun = inline('std(x(:))*ones(size(x))');
stddevim = blkproc(im, [blksze blksze], fun);
mask = stddevim > thresh; maskind = find(mask);
% Renormalise image so that the *ridge regions* have zero mean, unit % standard deviation.
im = im - mean(im(maskind)); normim = im/std(im(maskind));