指紋特征提取及描述(附Python代碼)

一、設(shè)計思路
項目的編程環(huán)境為python3.7.7,編譯器使用pycharm2019.3.4 x64。首先為項目設(shè)計一個GUI界面,界面有四個按鈕,分別是“選擇圖片”、“圖像增強”、“細(xì)化”和“特征提取及描述”,使用是按順序點擊按鈕即可,每完成一步,都會在按鈕下方顯示處理結(jié)果,最終的特征描述會在右下的文本框中顯示。
二、圖像增強
圖像歸一化
由于不同的指紋圖像在灰度圖分布上有很大的差異,會給之后的圖像特征提取和匹配增加難度,因此指紋圖像要進(jìn)行歸一化處理,將所有圖像轉(zhuǎn)換成具有給定均值和方差的標(biāo)準(zhǔn)圖像。歸一化并不能改變指紋的脊線和谷線的清晰程度,其結(jié)果是減少了不同指紋圖像之間灰度值的差異,并為接下來的圖像處理做好準(zhǔn)備。歸一化公式如下:

式中和分別為規(guī)格化前后的圖像,、是預(yù)先設(shè)定的圖像平均灰度和均方差,和為原圖像的灰度均值和方差。
方向場估算
方向場反映了指紋圖像上紋線的方向,其準(zhǔn)確性直接影響圖像增強的效果。根據(jù)紋線方向在局部區(qū)域內(nèi)基本一致的特點,先把指紋圖像分塊,然后計算每一個子塊的紋線方向,最后用該方向代表對應(yīng)子塊內(nèi)各個像素的方向。用這種方法來求指紋方向場效率較高且不易受少量的圖像噪聲影響,具體算法如下:
把歸一化圖像分成的像素塊,然后利用Sobel算子計算塊中每個像素點水平方向上的梯度值和垂直方向上的梯度值。
計算中心點為的邊長為w的子塊的脊線方向角,公式如下:

指紋圖像的方向場
頻率場估算
在指紋圖像的局部非奇異區(qū)域里,沿著垂直于脊線的方向看,指紋脊線和谷線像素點灰度值大致形成一個二維的正弦波,定義紋線頻率為相鄰的兩個波峰或波谷之間的像素點數(shù)的倒數(shù)。求取這些互不重疊的局部區(qū)域的頻率值,按各區(qū)域位置組成一個場結(jié)構(gòu),稱為指紋的頻率場。設(shè)表示規(guī)格化后的圖像,是指紋方向場,算法如下:
在所得方向場的基礎(chǔ)上,沿其垂直方向投影每一塊所有像素的灰度值,該投影形成一維正弦波,其極值點對應(yīng)指紋的脊線和谷線。假定作為上述一維正弦波兩相鄰峰值之間的平均像素數(shù),則頻率。
gabor濾波
一旦指紋圖像的方向場和頻率場確定,這些參數(shù)可以用來構(gòu)造偶對稱Gabor濾波器。Gabor濾波器是具有方向選擇特性和頻率選擇特性的帶通濾波器,并且能夠達(dá)到時域和頻域的最佳結(jié)合。偶對稱的Gabor濾波器在空間域中具有下面的形式:

式中,是濾波器的方向,是脊線的頻率,表示坐標(biāo)軸逆時針旋轉(zhuǎn)角度,,和,分別是沿著x和y軸的高斯包絡(luò)常量。
原圖和圖像增強后的效果圖
三、骨架提取
圖像骨架提取,實際上就是提取目標(biāo)在圖像上的中心像素輪廓,以目標(biāo)中心為準(zhǔn),對目標(biāo)進(jìn)行細(xì)化。一般細(xì)化后的目標(biāo)都是單層像素寬度。細(xì)化是從原來的圖中去掉一些點,但仍要保持原來的形狀。實際上是保持原圖的骨架。判斷一個點P是否能去掉是以8個相鄰點的情況來作為判據(jù)的,具體判據(jù)為:
內(nèi)部點不能刪除
孤立點不能刪除
端點不能刪除
如果P是邊界點,去掉P后,如果連通分量不增加,則P可刪除
骨架提取
四、指紋特征提取和表示
本次項目選取的特征是指紋圖像的端點和分叉點,特征描述為特征點所處的位置和脊線在特征點處的切線斜率,其中,位置為特征點在圖像中的橫坐標(biāo)和縱坐標(biāo),端點的切線斜率有1個,分叉點的切線斜率有3個。
端點
若骨架提取后的二值圖像的點為黑色像素,且其八領(lǐng)域有且只有一個黑色像素,其余7個為白色像素,則點為端點,端點特征的提取和表示算法如下:
按上述定義遍歷骨架提取后的二值圖像的像素點,尋找所有符合定義的端點;
剔除指紋圖像邊緣的端點,因為采集的指紋存在邊緣,邊緣的端點不能視為指紋的端點,需要予以剔除。方法是看步驟1得到的端點所在的行和列的某一側(cè)是否全為白色像素,是的話判斷為邊緣,予以剔除,否則判斷為內(nèi)部端點,予以保留;
沿著端點所在的脊線,尋找距離端點間隔4個像素點的點,若5步之內(nèi)脊線斷裂或遇到分叉點,則將該端點剔除,該步驟用于剔除孤立點,并為計算端點的切線斜率做準(zhǔn)備;
由步驟3得到的端點和間隔4個像素點的點,計算脊線的切線斜率,公式如下:

分叉點
若骨架提取后的二值圖像的點為黑色像素,且其八領(lǐng)域有3個黑色像素,其余5個為白色像素,則點為端點,端點特征的提取和表示算法如下:
按上述定義遍歷骨架提取后的二值圖像的像素點,尋找所有符合定義的分叉點;
按照步驟1有些分叉點在像素級別上能得到2個相互貼近的點,需要剔除其中一個。如我們得到下圖2個分叉點,在宏觀上其實是同一個。項目中剔除原則是鄰域黑像素相互貼近的分叉點,所以下圖剔除掉第一個,保留第二個;
像素級別上相互貼近的兩個分叉點
沿著端點所在的3條脊線,分別尋找距離端點間隔4個像素點的3個點,若5步之內(nèi)脊線斷裂或遇到分叉點,則將該端點剔除,為計算端點的切線斜率做準(zhǔn)備;
由步驟3得到的端點和間隔4個像素點的3個點,計算分叉點的3條脊線的切線斜率,公式如下:

五、最終效果圖


推薦閱讀
(點擊標(biāo)題可跳轉(zhuǎn)閱讀)
通俗易懂之最小二乘法(附matlab和python例子實現(xiàn))
教你用Python制作實現(xiàn)自定義字符大小的簡易小說閱讀器
匯總超全Matplotlib可視化最有價值的 50 個圖表(附 Python 源代碼)(一)
老鐵,三連支持一下,好嗎?↓↓↓


點分享

點點贊

點在

