MATLAB仿真实现效果展示
图1 奥比中光红外深度相机拍摄效果
MATLAB仿真红外效果的图片,使用奥比中光的Astra_Pro深度相机和Astra+进行拍摄,效果很好。
++声明:本文的虹膜识别系统模型参考了西澳大利亚大学,计算机科学与软件工程学院,马特实验室,利博尔·马塞克与彼得·科维西教授的《基于虹膜的生物特征识别系统》++
首先,先简单介绍以下各个文件夹的功能,文件夹“CASIA1”包括原始眼睛图像(将拍摄好的虹膜图像保存到这个文件夹中);文件夹“fnc”包含GUI的后端函数;文件夹“template-database”存储从眼睛图像中提取的注册模板(虹膜参数);文件“IrisRecognitionGUI.mlapp”是系统GUI配置生成的app。
下图是MATLAB的图形用户操作界面:
‘Enrollment’的功能是将账户虹膜的模板注册到数据库中,‘Verify’的功能是验证数据库中不同虹膜的模型,‘View Account information’的功能是查看虹膜文件的信息。
接下来,我会简单介绍虹膜识别系统的操作流程,具体操作步骤如下:
1.单击app中的‘image select …’选择一张虹膜图像打开。
2.填写信息,并点击‘Enroll’进行信息注册。
3.显示如下图所示的消息,代表注册虹膜信息成功。
4.要想验证图像,同样的按照操作1的方式进行操作。
5.选择虹膜信息并打开后,单击‘Verify’对虹膜信息进行验证。
6.选择单击‘View account…’可以查看该模板的信息。
MATLAB仿真实现介绍
接下来,会详细介绍该系统的具体实现流程,包括但不限于:①用到的算法介绍 ②GUI制作详细说明 ③代码功能的实现,等等。
霍夫变换算法
霍夫变换是一种计算机视觉算法,可以用来确认目标图像中存在的简单几何对象的参数,如直线和圆。
可以从眼睛结构示意图中发现虹膜其实是一个圆形,所有使用圆形霍夫变换可以用来推导出瞳孔和虹膜区域的半径和中心坐标。并且本文采用一种基于圆形霍夫变换的自动分割算法,将iris虹膜分割出来,方便进行比对。
首先,通过计算眼睛图像中亮度值的一阶导数来生成边缘图,然后对其进行阈值化。从边缘图中,在霍夫空间中对通过每个边缘点的圆的参数进行统计。这些参数是圆心坐标,以及半径,它们能根据圆的方程来定义任何大小的圆,表示为:
霍夫空间中的最大值点将对应于由边缘点最优定义的圆的半径和中心坐标,并利用抛物线霍夫变换来检测眼睑,用抛物线弧线逼近上下眼睑,表示为:
其中a_j控制曲率,h_j,k_j是抛物线的峰值,θ_j是相对于x轴的旋转角度。
Daugman的积分-微分算子
Daugman利用积分-微分算子定位圆形虹膜和瞳孔区域,以及上下眼睑的弧线。积分-微分算子的定义如下:
其中I(x,y)是眼睛图像,r是要搜索的半径,G_σ (r)是高斯平滑函数,s是由r,x_0,y_0给出的圆形轮廓。通过改变圆形轮廓的半径和中心x,y的位置,搜素像素值变化的圆形路径。为了实现精确的虹膜定位,该算子被迭代地应用,平滑的数量逐渐减少。
并且眼睑以类似的方式进行定位,轮廓整合的路径从圆形变成弧形。
主动轮廓模型
利用主动轮廓模型对目标图像中的瞳孔进行定位。主动轮廓通过对内部变形或在目标图像上移动,直到达到平衡状态,来响应预先设定的内部或外部力。
轮廓包含一些顶点,它们的位置会被两个相反的力改变,一个是内力,它依赖于期望的特征,另一个是外力,它依赖于目标图像。每个顶点在时间t和t+1之间移动,表达式如下:
其中F_i是内力,G_i是外力,v_i是顶点i的位置。为了给瞳孔进行定位,内力被校准,以便轮廓形成一个全局扩展的离散图。外部力通常是利用边缘信息找到的。
MATLAB仿真代码分析
Createiristemplate 核心功能函数文件详解,详细代码请见附录ii,详解如下:
函数createIristemplate用于使用霍夫变换和预定义的参数集创建Iris模板图像。它将图像eyeimage_filename作为输入,该图像被假定为虹膜的灰度图像
首先为霍夫变换设置了一些默认参数,例如径向和角度分辨率(radial_res和angular_res)以及特征编码参数(nscales、minWaveLength、mult和sigmaOnf),使用imread函数读取输入图像eyeimage_filename。
将输出模板图像和掩码图像(掩码)保存到用户使用fileattrib函数指定的文件中。输出模板图像保存为包含输入图像名称和.mat文件扩展名的文件名,掩码图像保存为包括输入图像名称以及-houghpara.mat(即后缀.mat和-houghpara)的文件名。
最后将输出模板图像和掩码图像(模板和掩码)作为函数输出返回。
if stat == 1
% if this file has been processed before
% then load the circle parameters and
% noise information for that file.
load(savefile);
else
% if this file has not been processed before
% then perform automatic segmentation and
% save the results to a file
[circleiris circlepupil imagewithnoise] = segmentiris(eyeimage);
save(savefile,'circleiris','circlepupil','imagewithnoise');
end
% WRITE NOISE IMAGE
%
imagewithnoise2 = uint8(imagewithnoise);
imagewithcircles = uint8(eyeimage);
%get pixel coords for circle around iris
[x,y] = circlecoords([circleiris(2),circleiris(1)],circleiris(3),size(eyeimage));
ind2 = sub2ind(size(eyeimage),double(y),double(x));
%get pixel coords for circle around pupil
[xp,yp] = circlecoords([circlepupil(2),circlepupil(1)],circlepupil(3),size(eyeimage));
ind1 = sub2ind(size(eyeimage),double(yp),double(xp));
以上代码主要是使用霍夫变换分割虹膜和瞳孔的图像,然后将结果保存到文件中。
首先调用主函数createIristemplate,然后调用一系列辅助函数createCircleMask和createPupilMask。
createCircleMask负责创建虹膜周围圆圈的二进制掩码图像。它首先使用imread函数读取输入图像eyeimage,并将图像保存到具有指定后缀的文件(例如circle.mat)中。
然后,它对图像应用霍夫变换以检测圆,并将生成的掩模图像(circlemask)保存到文件中。掩模图像是通过对图像进行阈值处理来创建圆形像素的二进制掩模来创建的,每个圆形由一组连接的像素表示。
createPupilMask负责创建瞳孔的二进制掩码图像。它的工作原理与createCircleMask类似,但有一些不同。它使用不同的霍夫变换来检测瞳孔周围的圆,还检测瞳孔中的椭圆和其他非圆形特征。它将生成的遮罩图像(pupilmask)保存到一个文件中。
代码初始化两个新变量imagewithnoise2和imagewithcircles,这两个变量都是8位无符号整数。变量imagewithnoise2是通过使用uint8函数将imagewithnoise函数的输出从16位浮点图像转换为8位无符号整数图像而创建的。通过使用uint8函数将眼睛图像函数的输出(虹膜的灰度图像)转换为8位无符号整数图像,创建带圆圈的可变图像。
然后,该代码定义了两个新函数getCircleCoordinates和sub2in,并使用它们从输入图像眼睛图像中提取虹膜周围的圆和瞳孔周围的圆的坐标。
getCircleCoordinates函数接受三个参数:第一个和第三个圆的中心坐标,以及第二个圆的半径。sub2in函数是将输入图像的2D坐标映射到1D索引的辅助函数,该1D索引可用于提取各个像素的坐标。
然后,代码定义了另外两个变量x和y,用于提取虹膜周围圆的中心和半径的坐标。瞳孔周围圆的中心和半径的坐标是使用相同的sub2in函数提取的。x和y变量分别指定圆的圆心和半径的x和y坐标。
最后,代码定义了另外两个变量xp和yp,用于提取瞳孔周围圆的中心和半径的坐标。瞳孔周围圆的中心和半径的坐标是使用相同的sub2in函数提取的。xp和yp变量分别被指定圆的中心和半径的xp和yp坐标。
% Write noise regions
imagewithnoise2(ind2) = 255;
imagewithnoise2(ind1) = 255;
% Write circles overlayed
imagewithcircles(ind2) = 255;
imagewithcircles(ind1) = 255;
w = cd;
cd(DIAGPATH);
imwrite(imagewithnoise2,[eyeimage_filename,'-noise.jpg'],'jpg');
imwrite(imagewithcircles,[eyeimage_filename,'-segmented.jpg'],'jpg');
cd(w);
% perform normalisation
[polar_array noise_array] = normaliseiris(imagewithnoise, circleiris(2),...
circleiris(1), circleiris(3), circlepupil(2), circlepupil(1), circlepupil(3),eyeimage_filename, radial_res, angular_res);
% WRITE NORMALISED PATTERN, AND NOISE PATTERN
w = cd;
cd(DIAGPATH);
imwrite(polar_array,[eyeimage_filename,'-polar.jpg'],'jpg');
imwrite(noise_array,[eyeimage_filename,'-polarnoise.jpg'],'jpg');
cd(w);
% perform feature encoding
[template mask] = encode(polar_array, noise_array, nscales, minWaveLength, mult, sigmaOnf);
以上代码负责对图像进行标准化,创建噪声模式,并对标准化和降噪图像执行特征编码。
首先调用normaliseiris函数,然后调用createIristemplate来分割虹膜和瞳孔。createIristemplate的输出保存到具有指定后缀的文件中(例iris.mat)接下来,代码定义了一些变量:
polar_array:这是一个像素值的二维数组,表示输入图像的极坐标表示。它是通过对输入图像应用极坐标变换来创建的。
noise_array:这是表示降噪图像的像素值的二维数组。它是通过将降噪算法应用于输入图像而创建的。
template:这是表示标准化图像的像素值的二维数组。它是通过将特征编码算法应用于极坐标和降噪图像而创建的。
mask:这是一个像素值的一维数组,表示归一化图像中圆形像素的二进制掩码。它是通过对极性图像和降噪图像进行阈值处理来创建圆形像素的二进制掩码的。
然后对polar_array和noise_array变量调用normaliseiris函数,并将生成的数组保存到具有指定后缀的文件中(例如polar.mat和polarnoise.mat)。
接下来,再次调用createIristemplate函数来分割瞳孔,并为瞳孔创建单独的降噪图像。此函数的输出保存到具有指定后缀的文件中(例如,pidul.mat)。
最后,对模板和noise_array变量调用encodepattern函数,以创建极坐标和降噪图像的特征向量表示。然后,该矢量表示被保存到具有指定后缀的文件中(例如,编码.mat)。
MATLAB虹膜识别系统GUI设计
MATLAB虹膜识别系统GUI设计可以通过使用MATLAB的Graph函数创建,并使用Subplot函数添加多个图形窗口来实现
如上表格所示,通过奥比中光的Astra_pro和Astra+相机拍摄的红外图像,完全可以胜任虹膜识别任务,并且有很好的效果