本文基于奧比中光深度相機進行虹膜識別處理
圖1 奧比中光紅外深度相機拍攝效果
MATLAB仿真紅外效果的圖片,使用奧比中光的Astra_Pro深度相機和Astra+進行拍攝,效果很好。
++聲明:本文的虹膜識別系統模型參考了西澳大利亞大學,計算機科學與軟件工程學院,馬特實驗室,利博爾·馬塞克與彼得·科維西教授的《基于虹膜的生物特征識別系統》++
首先,先簡單介紹以下各個文件夾的功能,文件夾“CASIA1”包括原始眼睛圖像(將拍攝好的虹膜圖像保存到這個文件夾中);文件夾“fnc”包含GUI的后端函數;文件夾“template-database”存儲從眼睛圖像中提取的注冊模板(虹膜參數);文件“IrisRecognitionGUI.mlapp”是系統GUI配置生成的app。
下圖是MATLAB的圖形用戶操作界面:
‘Enrollment’的功能是將賬戶虹膜的模板注冊到數據庫中,‘Verify’的功能是驗證數據庫中不同虹膜的模型,‘View Account information’的功能是查看虹膜文件的信息。
接下來,我會簡單介紹虹膜識別系統的操作流程,具體操作步驟如下:
單擊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+相機拍攝的紅外圖像,完全可以勝任虹膜識別任務,并且有很好的效果。
編輯:黃飛
評論
查看更多