指纹识别预处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指纹识别预处理相关的知识,希望对你有一定的参考价值。
求指纹图像预处理的MATLAB实现的程序!!
参考技术A 介绍了采用TI公司的高速DSP芯片TMS320VC5402的指纹识别系统的预处理算法和编程实现。算法实现采用的DSP集成开发环境(IDE)为CCS 2.2。通过采用极值滤波、平滑滤波、拉普拉斯锐化、二值化等对指纹图像进行预处理,取得了良好的试验结果。利用生物认证技术取代传统的使用钥匙、身份证、密码等方法进行个人身份鉴定,可广泛应用于银行、机场、公安等领域的出入管理。将信息技术与生物技术相结合的生物认证技术是本世纪最有发展潜力的技术之一,而指纹识别技术则是其中非常有前景的一种。
数字信号处理器(DSP)是指以数值计算的方法对数字信号进行处理的芯片。它具有处理速度快、灵活、精确、抗干扰能力强、体积小、使用方便等优点。DSP应用于指纹识别已经成为一个新的科技领域和独立的学科体系,当前已形成了有潜力的产业和市场。
本文选定100MHz DSP TMS320VC5402作为指纹信号的处理器,利用其流水线编码的操作特点,并结合指纹识别技术,实现基于DSP CCS2.2的指纹识别预处理系统。CCS 2.2(Code Composer Studio)是一种针对标准TMS320调试接口的集成开发环境(IDE),由TI公司于1999年推出。指纹识别的处理流程如图1所示。
指纹处理过程可分为三个阶段:
(1) 获取原始指纹图像,进行预处理;
(2) 提取指纹特征点;
(3) 指纹识别分析判断。
在上述三个阶段中,指纹图像的预处理阶段尤为重要,该阶段对图像处理的好坏直接关系到后面两个阶段工作的开展。本文结合TMS320VC5402的特点,重点研究指纹识别的预处理算法及其DSP实现问题,其中包括指纹的极值滤波、平滑滤波、拉普拉斯锐化、迭代二值化和该算法在DSP开发平台CCS2.2的C5000上的仿真实现。这一问题的解决,可为未来指纹识别系统的脱机应用提供很有价值的参考。
1 指纹识别预处理算法
指纹识别预处理的目的是使指纹图像更清晰,边缘更明显,以便提取指纹的特征点进行识别。本文采取极值滤波和改进的平滑滤波进行噪声消除,使图像不失真;采取拉普拉斯锐化对指纹进行纹线增强,突出边缘信息,为自适应阀值的迭代二值化提供方便。
1.1 极值滤波
解梅、马争[1]认为极值滤波器的设计是基于这样一种理念:在指纹图像的采集过程中,指纹图像所受到的冲击性噪声表现为一些斑点或亮点。在一般情况下,可以认为绝大数冲击性噪声是被真实的灰度值所包围。同时噪声污染的像素要远远小于真实灰度值的像素。因此在噪声的消除过程中,无需对大多数没有被噪声污染的像素进行改变处理,只需对那些被污染的像素进行“真实值”代替处理,而这些值的确定可通过图像像素邻域的相关性来确定。
指纹处理过程可分为三个阶段:
(1) 获取原始指纹图像,进行预处理;
(2) 提取指纹特征点;
(3) 指纹识别分析判断。
在上述三个阶段中,指纹图像的预处理阶段尤为重要,该阶段对图像处理的好坏直接关系到后面两个阶段工作的开展。本文结合TMS320VC5402的特点,重点研究指纹识别的预处理算法及其DSP实现问题,其中包括指纹的极值滤波、平滑滤波、拉普拉斯锐化、迭代二值化和该算法在DSP开发平台CCS2.2的C5000上的仿真实现。这一问题的解决,可为未来指纹识别系统的脱机应用提供很有价值的参考。
1 指纹识别预处理算法
指纹识别预处理的目的是使指纹图像更清晰,边缘更明显,以便提取指纹的特征点进行识别。本文采取极值滤波和改进的平滑滤波进行噪声消除,使图像不失真;采取拉普拉斯锐化对指纹进行纹线增强,突出边缘信息,为自适应阀值的迭代二值化提供方便。
1.1 极值滤波
解梅、马争[1]认为极值滤波器的设计是基于这样一种理念:在指纹图像的采集过程中,指纹图像所受到的冲击性噪声表现为一些斑点或亮点。在一般情况下,可以认为绝大数冲击性噪声是被真实的灰度值所包围。同时噪声污染的像素要远远小于真实灰度值的像素。因此在噪声的消除过程中,无需对大多数没有被噪声污染的像素进行改变处理,只需对那些被污染的像素进行“真实值”代替处理,而这些值的确定可通过图像像素邻域的相关性来确定。
设有一待处理器像素为s0,其周围8邻域像素排列为
取邻域相关像素的均值为Ai,i∈1,2,...8,并以四个像素为一组处理单元,则改进的极值滤波[1]算法可表述如下:
如果A0>max(Ai),i∈1,2,...8,则
如果A0 < min(Ai), i∈1,2,...8, 则
s1=s2=s4=s0=min(A1,A2,A4)
s2=s3=s5=s0=min(A2,A3,A5)
s4=s6=s7=s0=min(A4,A6,A7) (3)
s5=s7=s8=s0=min(A5,A7,A8)
如果min(Ai)≤Ai≤max(Ai),i∈1,2,...8,则将像素原值输出,不作处理。
实验结果表明,该方法能得到与中值滤波类似的效果,达到了初步去除噪声的目的。
1.2 平滑滤波
经过上面的极值滤波处理之后,图像传输过程中所形成的大多数冲击性噪声均被除去,但指纹图像中还存在着随机噪声,需进一步对图像进行平滑处理。本文采取两次平滑滤波,一次是在极值滤波之后,一次是在锐化滤波之后。改进的平滑卷积核为
系数取1/15而非原来的1/17的原因在于提高图像的对比度;而卷积核中心像素加权系数取为5是为了突出该点像素。实验结果表明,该改进是可行的,有利于突出中心像素并有效去除随机噪声。
1.3 锐化滤波
对于由于积分运算所造成的模糊图像,有必要对其模糊进行校正,进而增强指纹图像的边界。具体做法为增强指纹脊线与谷的对比度。这种增强指纹图像的高频成分,使其边缘清晰的方法称为锐化。因此,锐化的目的在于使经过平均或积分运算后变得模糊的图像的边缘和轮廓变得清晰,并使细节清晰[2]。在本文中,锐化卷积核采用拉普拉斯算子[3]:
通过该卷积核对图像进行卷积预算,能实现高通滤波,进而得到锐化后的指纹脊线。
1.4 迭代阀值二值化
指纹图像经过极值滤波、平滑滤波、拉普拉斯锐化滤波、平滑滤波后,大多数噪声都已被消除,这就为特征点提取提供了基础。为了提取特征点,需对指纹图像进行分割。本文采取迭代阀值的方法对指纹图像进行阀值分割。在图像处理中,反复地用一种运算直至条件满足而得到输出图像的方法称为迭代。迭代阀值方法如下:
①设定初始灰度阀值T(如令T=127),把指纹图像的灰度值分为两组R1和R2。
②计算两组的平均灰度值u1和u2。
③重新设定新的灰度阀值T。新的T定义为:T=(u1+u2)/2。
④依据新的T对指纹图像进行阀值分割。
这种方法是以自适应的阀值对指纹图像进行二值化处理。实验结果表明,该方法比设定固定阀值进行处理更有普遍意义,且行之有效。
2 指纹图像在CCS 2.2上的输入与输出
在设计中,采用DSP集成开发环境CCS2.2对指纹识别算法进行模拟验证。用指纹成像系统采集一幅*bmp格式指纹图像,如finger.bmp指纹图像。在该指纹图像的数据上面添加一个COFF文件的文件头。以文件名finger.out保存。*.out文件为TI的公共目标文件。利用CCS中的File-Load Data 可以将finger.out的指纹图像放到DSP的相应内存中去,本次设计中将finger.out存放于DSP的数据存储空间。利用CCS中的Image菜单,通过设置相关选项可以观察处理前的图像与处理后的图像。
3 实际指纹图像预处理效果
依据上述指纹识别预处理算法,通过CCS2.2的模拟功能,实现了指纹识别预处理的DSP处理,达到了DSP处理指纹图像的应用目的。结果如图2所示。
图2 实际指纹预处理结果
本文针对TMS320VC5402 DSP的快速、高效的特点,采取了DSP集成开发环境CCS2.2对指纹图像进行预处理。在指纹的预处理中,由于DSP具有10ns指令周期,使采用改进的极值滤波和改进的卷积核平滑滤波对指纹图像进行一次、二次平滑实时处理成为可能。实验结果表明,该方法能有效地处理指纹图像的冲击性噪声和随机噪声。而迭代二值化的运算充分利用了DSP 五级流水线操作,达到了利用DSP对指纹图像进行预处理的应用目的。
指纹验证完整版处理小结
在ios中指纹的使用相对比较简单,但是在使用的过程中遇到以下几个问题,故对指纹使用进行简单封装,以处理这些问题,问题如下:
1、ios 9之后系统指纹被锁,系统不会主动弹出密码解锁的页面
2、ios 10.*系统不区分指纹未录入和密码未设置的情况
处理逻辑如下:
处理部分代码如下:
----------------------------.h文件 /* 1、处理iOS 9.0之后,指纹被锁不会自动弹出密码解锁的情况; 2、处理iOS 10.*系统不区分未录入指纹和未设置密码的情况; */ #import <Foundation/Foundation.h> typedef NS_ENUM(NSInteger, TITouchIDVerificationError) { TITouchIDVerificationErrorLocalizedReason, TITouchIDVerificationErrorAuthFailMessage, TITouchIDVerificationErrorNotAvailableMessage, TITouchIDVerificationErrorNotEnrolledMessage, TITouchIDVerificationErrorLockOut, TITouchIDVerificationErrorPasscodeNotSetMessage, TITouchIDVerificationErrorUserCancel, TITouchIDVerificationErrorAppCancel, TITouchIDVerificationErrorUnknown }; typedef NS_ENUM(NSInteger, TIVerificationStatus) { TIVerificationStatusSuccess, TIVerificationStatusPasswordNotSet, TIVerificationStatusNotEncrolled, TIVerificationStatusFailed, TIVerificationStatusFallback, TIVerificationStatusLockOut, TIVerificationStatusCancel, TIVerificationStatusError, }; typedef void(^VerificationCompletion)(TIVerificationStatus status, NSError *error); @interface LYYTouchID : NSObject /** 调用TouchID @param completion 验证完成,如果返回YES,验证成功;如果返回NO,验证失败(输入密码和指纹验证失败) */ + (void)touchVerificationWithFallbackTitle:(NSString*)fallbackTitle completion:(VerificationCompletion)completion; @end ---------------------------.m文件 #import "LYYTouchID.h" #import <UIKit/UIKit.h> #import <LocalAuthentication/LocalAuthentication.h> #define TI_IS_iOS_LATER(num) ([UIDevice currentDevice].systemVersion.floatValue >= (num)) #define TI_IS_iOS8_LATER TI_IS_iOS_LATER(8.0) #define TI_IS_iOS9_LATER TI_IS_iOS_LATER(9.0) #define TI_IS_iOS10_LATER TI_IS_iOS_LATER(10.0) #define TI_IS_iOS11_LATER TI_IS_iOS_LATER(11.0) NSString * const TouchIDLocalizedReason = @"请您验证已有TouchID"; NSString * const TouchIDNotAvailableMessage = @"您当前设备不支持TouchID"; NSString * const TouchIDNotEnrolledMessage = @"您当前没有录入指纹信息"; NSString * const TouchIDNotCorrectMessage = @"您的指纹信息不匹配"; NSString * const TouchIDPasscodeNotSetMessage = @"您当前没有设置密码"; NSString * const TouchIDCancelMessage = @"您已取消验证TouchID"; NSString * const TouchIDUnknownErrorMessage = @"出现未知错误"; NSString * const TouchIDLockOutMessage = @"TouchID 被锁定"; static BOOL _isTouchIDLocked;//用于存储第一遍canEvaluatePolicy检查到的指纹被锁的状态 static BOOL _touchIDSecondCheck;//用于存储canEvaluatePolicy是否是第二次查询 @interface LYYTouchID () @end @implementation LYYTouchID #pragma mark - 验证 + (void)touchVerificationWithFallbackTitle:(NSString*)fallbackTitle completion:(VerificationCompletion)completion{ LAContext *context = [[LAContext alloc] init]; context.localizedFallbackTitle = fallbackTitle?:@""; LAPolicy policy = [self setPolicy]; NSError *notSupportError = nil; if ([context canEvaluatePolicy:policy error:¬SupportError]) { //处理10.*系统纯指纹策略不走passwordNotSet方法 if (_touchIDSecondCheck&&TI_IS_iOS10_LATER&&!TI_IS_iOS11_LATER) {//第二次检测指纹是否可用(指纹+密码策略),且可以 _touchIDSecondCheck = NO; completion(TIVerificationStatusNotEncrolled,[self returnErrorInfoWithErrorCode:LAErrorTouchIDNotEnrolled]); return; } //不是第二次检测指纹是否可用,直接进行验证 [context evaluatePolicy:policy localizedReason:TouchIDLocalizedReason reply:^(BOOL success, NSError * _Nullable error) { dispatch_async(dispatch_get_main_queue(), ^{ if (success) { if (TI_IS_iOS9_LATER&&_isTouchIDLocked) {//TouchID 解锁成功时,更改为纯指纹策略,验证TouchID _isTouchIDLocked = NO; [self touchVerificationWithFallbackTitle:fallbackTitle completion:completion]; }else{//ios9.0之前版本不支持密码策略直接返回信息 _isTouchIDLocked = NO; completion(TIVerificationStatusSuccess,nil); } } else { int code = (int)error.code; ////设置锁定状态为NO _isTouchIDLocked = NO; [self dealErrorWithErrorCode:code fallbackTitle:fallbackTitle complection:completion]; } }); }]; }else { [self dealErrorWithErrorCode:(int)notSupportError.code fallbackTitle:fallbackTitle complection:completion]; } } #pragma mark - 设置指纹策略 + (LAPolicy)setPolicy{ LAPolicy policy; if (_touchIDSecondCheck&&TI_IS_iOS9_LATER){//已经查验过纯指纹策略,且纯指纹策略不支持,改变策略为指纹+密码进行二次验证 policy = LAPolicyDeviceOwnerAuthentication; return policy; } if (_isTouchIDLocked&&TI_IS_iOS9_LATER) {//指纹被锁定且系统大于9.0,使用“指纹+密码”策略 policy = LAPolicyDeviceOwnerAuthentication; }else{//使用“指纹”策略(默认是指纹策略) policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics; } return policy; } #pragma mark - 处理不同错误 + (void)dealErrorWithErrorCode:(int)code fallbackTitle:(NSString*)fallbackTitle complection:(VerificationCompletion)completion{ switch (code) { case LAErrorUserFallback: completion(TIVerificationStatusFallback,[self returnErrorInfoWithErrorCode:code]); break; case LAErrorAuthenticationFailed: completion(TIVerificationStatusFailed,[self returnErrorInfoWithErrorCode:code]); break; case LAErrorSystemCancel:{ _isTouchIDLocked = NO; _touchIDSecondCheck = NO; } break; case LAErrorPasscodeNotSet: _isTouchIDLocked = NO; _touchIDSecondCheck = NO; completion(TIVerificationStatusPasswordNotSet,[self returnErrorInfoWithErrorCode:code]); break; case LAErrorTouchIDNotAvailable: break; case LAErrorAppCancel:{ _isTouchIDLocked = NO; _touchIDSecondCheck = NO; } break; case LAErrorUserCancel: _isTouchIDLocked = NO; _touchIDSecondCheck = NO; completion(TIVerificationStatusCancel,[self returnErrorInfoWithErrorCode:code]); break; default: { if (TI_IS_iOS9_LATER) { if (code==LAErrorTouchIDLockout) { //ios9.0更改为密码策略,解锁TouchID _isTouchIDLocked = YES; [self touchVerificationWithFallbackTitle:fallbackTitle completion:completion]; break; } } if (TI_IS_iOS8_LATER&&!TI_IS_iOS11_LATER) { if (code==LAErrorTouchIDNotEnrolled) { //处理ios 10.*系统不走passwordNotSet if (TI_IS_iOS10_LATER&&!_touchIDSecondCheck) {//ios 9.0之后,第一次返回指纹不可用的结果(这时是纯指纹策略) _touchIDSecondCheck = YES; [self touchVerificationWithFallbackTitle:fallbackTitle completion:completion]; }else{ //ios 9.0 之后是第二次返回不可用结果,此时采用的是指纹+密码策略,此时指纹确实不可用 //ios 9.0 之前,第一次返回指纹不可用的结果,此时直接返回指纹不可用的错误 _touchIDSecondCheck = NO; completion(TIVerificationStatusNotEncrolled,[self returnErrorInfoWithErrorCode:code]); } break; } } if (@available(iOS 11.0, *)) { if (code==LAErrorBiometryNotEnrolled) { completion(TIVerificationStatusNotEncrolled,[self returnErrorInfoWithErrorCode:code]); break; } } completion(TIVerificationStatusError,[self returnErrorInfoWithErrorCode:code]); } break; } } #pragma mark - 生成error + (NSError *)returnErrorInfoWithErrorCode:(int)errorCode { if (TI_IS_iOS9_LATER) { if (errorCode == LAErrorAppCancel) { NSError *tempError = [NSError errorWithDomain:@"TouchIDVerfityDomain" code:TITouchIDVerificationErrorAppCancel userInfo:@{@"message":TouchIDCancelMessage}]; return tempError; } } NSString *errorMessage = @""; NSUInteger errCode = 0; switch (errorCode) { case LAErrorTouchIDNotAvailable: errorMessage = TouchIDNotAvailableMessage; errCode = TITouchIDVerificationErrorNotAvailableMessage; break; case LAErrorAuthenticationFailed: errorMessage = TouchIDNotCorrectMessage; errCode = TITouchIDVerificationErrorAuthFailMessage; break; case LAErrorPasscodeNotSet: errorMessage = TouchIDPasscodeNotSetMessage; errCode = TITouchIDVerificationErrorPasscodeNotSetMessage; break; case LAErrorUserCancel: errorMessage = TouchIDCancelMessage; errCode = TITouchIDVerificationErrorUserCancel; break; default: if (TI_IS_iOS9_LATER) { if (errorCode==LAErrorTouchIDLockout) { errorMessage = TouchIDLockOutMessage; errCode = TITouchIDVerificationErrorLockOut; break; } } if (TI_IS_iOS8_LATER&&!TI_IS_iOS11_LATER) { if (errorCode==LAErrorTouchIDNotEnrolled) { errorMessage = TouchIDNotEnrolledMessage; errCode = TITouchIDVerificationErrorNotEnrolledMessage; break; } } if (@available(iOS 11.0, *)) { if (errorCode==LAErrorBiometryNotEnrolled) { errorMessage = TouchIDNotEnrolledMessage; errCode = TITouchIDVerificationErrorNotEnrolledMessage; break; } } errorMessage = TouchIDUnknownErrorMessage; errCode = TITouchIDVerificationErrorUnknown; break; } NSError *tempError = [NSError errorWithDomain:@"TouchIDVerfityDomain" code:errCode userInfo:@{@"message":errorMessage}]; // return tempError; } @end
以上是关于指纹识别预处理的主要内容,如果未能解决你的问题,请参考以下文章