岳雅茹 朱嘉林


摘 要:目前,OpenCV函數庫的應用越來越廣泛,將其運用到數字圖像處理中解決一些圖像處理問題,能夠提高圖像處理的有效性。而常用的大津算法容易造成圖像細節丟失的問題,為了解決這些問題對大津算法進行了改進,使其能夠在不均勻光照、圖像模糊的情況下很好地對圖像目標進行分割,結果準確,實現簡單。使用OpenCV函數庫實現一個指紋提取算法,該算法利用改進后的大津算法得到最佳閾值,用最佳閾值對圖片進行分割處理。利用面向對象Vc++6.0編程工具進行仿真實驗,結果表明,基于OpenCV函數庫的指紋提取算法是有效的,提高了指紋提取的準確性,貼近真實圖像。
關鍵詞:OpenCV;指紋提取;最佳閾值;Vc++6.0
DOI:10.11907/rjdk.171539
中圖分類號:TP312 文獻標識碼:A 文章編號:1672-7800(2017)009-0072-03
Abstract:At present, OpenCV function library isapplied more and more widely, and it is used in digital image processing to solve some problems of image processing, and it can improve the effectiveness of image processing. Commonly it is easy to cause the loss of image detail for the Otsu method, in order to solve these problems the Otsu method is improved. In the case of uneven illumination and blurred image, it can segment the target, and the result is accurate and simple. A fingerprint extraction algorithm is achieved using the OpenCV functions. The algorithm uses the Otsu algorithm improved to get the best threshold that it can segment image. Simulation experiment is carried out by using object-oriented Vc++6.0 programming tools, and it proves that the fingerprint extraction algorithm based on OpenCV function library is effective. It can improve the accuracy of fingerprint extraction, and image likes real image. Give some code.
Key Words:OpenCV; Otsu; fingerprint extraction; optimal threshold; Vc++6.0
0 引言
由于指紋受遺傳基因和母體內環境的影響,紋路圖案上隨機出現各種斷點和交叉點,造成所有人的指紋都有明顯差異,因而指紋可以對應一個人的真實身份。在實際中,指紋識別應用于安檢、刑偵技術及信息匹配各個方面。盡管此項技術已經應用在很多方面,也較為成熟,但受商業利益或者其它因素的影響,這項技術并未公開[1]。在學習OpenCV的過程中,利用便利的函數庫對指紋提取進行研究,具有一定理論意義和實用價值。
本文使用OpenCV開源視覺函數庫提出了一種指紋提取算法,能夠在Liunx、Windows和MacOs等操作系統上運行,具有計算快、實時性強的優點[2-4]。指紋提取算法主要是應用圖像分割中的大津法,它是一種比較經典的算法,可以獲取灰度圖像的自適應閾值,對圖像進行二值化,達到目標與背景分割的目的[5]。然而,經過閱讀相關文獻發現,在使用大津算法之前采用一般的灰度變換會影響圖像的細節,甚至丟失圖像的部分內容,從而導致圖像處理準確度不高。理想的結果是提取出的指紋線條細節分明,對細節要求較高。針對光照相對不均勻及RGB三通道分量占比不均勻的圖像,提出運用權重對指紋圖像進行灰度變換。該方法利用人眼對綠色最為敏感的特性,提高G通道的權重,符合人體生理學特點[6]。該算法能夠較好地保留圖像細節,貼近原圖的內容。本文詳細給出了算法實現過程及結果。
1 算法思想
通常,自適應閾值算法有大津法、迭代閾值法和二次定值法等[7-8]。由于大津法(OTSU算法)計算方法簡單,不受圖像亮度及對比度的影響,在數字圖像處理上被廣泛應用[9],效果良好,使本文有了實踐依據,因此,選用此方法作為指紋提取算法中的主體。
大津法的基本思想是:使用圖像直方圖中某一灰度值將圖像分割成兩組,一組灰度對應目標,即指紋線條,一組灰度對應背景,即除去指紋的部分,當兩組之間方差最大時,就取該灰度值作為最佳閾值,將圖像分成背景和前景兩部分。在直方圖中,方差的大小表示灰度分布是否均勻。目標與背景之間方差越大,說明這兩部分之間的差別越大,就更容易將兩部分區分開來,此時分割效果最好。然而當部分目標錯分為背景,或者部分背景錯分為目標時,都會導致兩部分區別不明顯,這樣會影響指紋圖像細節的丟失。因此,在使用大津法之前,通過對圖像作加權平均值法的灰度變換處理解決此缺陷。
設灰度圖像灰度級是L,則灰度范圍為[0,L-1],利用大津法計算指紋圖像最佳閾值的公式為:t=Max[w0(t)*(u0(t)-u)2+w1(t)*(u1(t)-u)2]endprint
(1) 式(1)中,t表示圖像分割的閾值,w0為背景比例,u0為背景均值,w1為前景比例,u1為前景均值,u為整幅圖像的均值。式(1)中值最大的t,即為最佳閾值。
基于OpenCV函數庫,將大津法作為主體算法,指紋提取算法的實現大致為:首先,對彩色指紋圖像進行RGB三通道分解,得到RGB三通道圖像;其次,將G通道作權重提高處理,得到灰度圖;再次,使用大津法獲取最佳閾值;最后,根據獲得的最佳閾值對圖像進行二值化處理,將指紋提取出來。
2 算法過程及程序
指紋提取步驟:采集指紋圖像、圖像預處理(去噪、灰度化、增強)、指紋提取(分割)。指紋提取流程如圖1所示。
2.1 圖像去噪
將采集到的指紋圖像進行去噪處理,本文采用二維中值濾波法抑制背景噪聲。中值濾波的基本原理是將數字圖像中某一點的值用該點的一個鄰域中各點值的中值代替,很容易將其推廣到二維。二維中值濾波方法的優勢是在某些條件下可以做到既去除噪聲又保護圖像邊緣的良好復原,是一種去除噪聲效果良好的非線性處理方法,窗口形式也多種多樣,既可以是長方形,也可以是圓形或者十字形,且相比鄰域平均法,在消除噪聲的同時還能保持圖像中的細節部分,防止邊緣模糊,很好地滿足了本文需求。本文選擇3×3的平滑濾波模板。
2.2 圖像灰度化
將去噪后的彩色圖像轉換為灰度圖像。彩色圖像RGB模型中,如果R=G=B,則彩色表示一種灰度顏色,該值叫灰度值。灰度值在0~255之間,數值越大,該點越白,即越亮,越小則越黑。灰度變換方法有3種:最大值法、平均值法和加權平均值法。為了不浸沒圖像的細節部分,本文采用加權平均值法,給R、G、B賦予不同的權值系數,并加權求和,得到灰度值Gray。
轉換關系為:Gray(i,j)=0.11R(i,j)+0.59G(i,j)+0.3B(i,j)
具體實現方法:首先獲得原圖數據區指針;其次循環數字圖像的每個像素,求出每個像素R、G、B 3個分量值;再次按照轉換關系求出灰度值Gray;最后將相應像素的R、G、B 3個分量值置為相同的灰度值。
去噪后圖像灰度化處理部分程序如下:
//灰度位圖數據處理
BYTE r, g, b;
LPBYTE lpGradeBmpData=(LPBYTE)(lpGradeBmp+
sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
//進行顏色轉換
for(int i=0; i
{
for(int j=0; j
{
b=m_lpData[i*uLineByte+3*j];
g=m_lpData[i*uLineByte+3*j+1];
r=m_lpData[i*uLineByte+3*j+2];
lpGradeBmpData[i*uGradeBmpLineByte+j]=
(BYTE)(0.299*r+0.587*g+0.114*b);
}
}
2.3 圖像分割
進行完灰度化處理之后,要對圖像作增強處理,然后進行圖像分割。圖像分割就是將圖像分為多個區域,利用各種算法判斷出感興趣的目標區域,提取出這些目標區域圖像的特征。按照各種算法的分割機理進行劃分,主要包括分水嶺法、閾值法、邊緣檢測法等。
閾值法是基于區域分割算法中一種最常用的分割技術,其是按照某個準則自動求出最優閾值,把像素點按灰度級進行聚集分類實現分割的過程。可以看出,該方法能夠很好地將背景和目標區分開。但該方法的計算量較大,運行時間較長,因此考慮利用OpenCV進行處理,以減少計算量。
圖像分割處理的關鍵是閾值的選擇和確定,指紋提取算法采用閾值法中的大津法,并對其進行改進,獲得最佳閾值,根據最佳閾值進行二值化,把圖像分成目標物體和背景兩個領域,提取出指紋信息。
在OpenCV計算機視覺函數庫的環境下,使用OTSU算法提取圖像閾值的公式為:g=w0*pow((u-u0),2)+w1*pow((u-u1),2)
(2) 式(2)中,w0為背景像素點占整幅圖像的比例; u0為w0平均灰度;w1為目標像素點占整幅圖像的比例;u1為w1平均灰度;u為整幅圖像的平均灰度。
具體實現方法:求出灰度變換后的直方圖,循環直方圖中所有灰度值(0~255),將每個灰度值作為閾值;用該閾值將圖像分割成兩組,對每一組求平均值及方差;當某個灰度值分割兩組間方差最大時,此灰度值是二值化處理的最佳閾值。
算法在Vc++6.0集成開發環境平臺上編程,通過利用OpenCV提供的CVAdaptiveThreshold()函數實現。電腦CPU為Intel-CORE-i5。圖片采用BMP 格式,其信息豐富、結構簡單,便于處理。該算法主體實現程序如下:
//灰度直方圖數組,并初始化
int nGrayHistogram[256];
memset(nGrayHistogram, 0, sizeof(nGrayHistogram));
//統計各個灰度級對應的像素個數,并存放到灰度直方圖數組中
int nPixel;
for (j=0; j
for (i=0; i
{
//獲取當前像素點的灰度值
nPixel=p_data[nLineByte*j+i];
//對灰度值統計計數endprint
nGrayHistogram[nPixel]++;
}
//聲明整個直方圖的均值u,c0組和c1組的均值u0和u1,c0組和c1組的概率w0和w1,方差和最大方差fVaria和fMaxVaria為符點型變量
float u, u0, u1, w0, w1, fVaria, fMaxVaria;
//聲明c0組的像素總數nCount0,閾值和最佳閾值nT和nBestT為整型變量
int nCount0, nT, nBestT;
//統計直方圖中像素點的總數,并存放到nSum中
int nSum=0;
for(i=0; i<256; i++)
nSum+=nGrayHistogram[i];
//令閾值nT從0遍歷到255
for(nT=0; nT<256; nT++)
{
//當閾值為nT時,計算c0組的均值和概率,同理,可以計算整個直方圖的均值以及c1組的均值和概率
u0=0;
nCount0=0;
for(i=0; i<=nT; i++)
{
u0+=i*nGrayHistogram[i];
nCount0+=nGrayHistogram[i];
}
u0/=nCount0;
w0=(float) nCount0 /nSum;
//計算兩組間的方差
fVaria=w0*(u-u0)^2+w1*(u-u1)^2;
//記錄最大方差和最佳閾值
if(fVaria>fMaxVaria)
{
fMaxVaria=fVaria;
nBestT=nT;
}
}
//最后,利用最佳閾值對原圖像作分割處理
for(j=0; j
for(i=0; i
{
if(p_data[j*nLineByte+i] p_data[j*nLineByte+i]=0; else p_data[j*nLineByte+i]=255; } 3 仿真結果及分析 基于OpenCV函數庫,在Vc++軟件上運行仿真如圖2所示,其中圖2(a)、(b)是一組,圖2(c)、(d)是一組。圖2(a)是在光線較暗的環境下所采集的圖片,從圖2(b)中可以看到,能夠清晰地提取出其原指紋圖像的細節,邊緣較為清晰,背景噪聲小,貼近指紋原圖,效果很好,但存在突出小點的問題,需要改進。圖2(c)是指紋原圖,錄取得不是很清晰,采用改進后的大津法進行圖像分割,從圖2(d)可以看到,能夠很好地提取其指紋線條,保留局部細節,貼近指紋原形,效果良好。 4 結語 基于OpenCV函數庫提出指紋提取算法,仿真實驗結果表明,與普通的大津法分割圖像相比,此算法能夠很好地利用圖像自身的灰度信息選擇最佳閾值,分割后的指紋線條較為清晰,背景噪聲小,能夠很好地保存圖像細節,貼近真實圖像,實現了指紋提取,并且利用OpenCV函數庫編寫的代碼簡潔、高效。同樣,此指紋提取算法可以用在指紋識別系統中采集訓練樣本。系統尚存在一定的不足,比如線條的某些地方有突出小點。初步研究,圖像增強部分對結果有所影響,這是下一步需要解決的問題。 參考文獻: [1] 胡春風.指紋紋線特征提取與匹配[D].長沙:國防科學技術大學,2013. [2] 薛圣利,蔡啟仲,楊海林,等.基于OpenCV的火車票識別算法[J].廣西科技大學學報,2016,27(2):46-51. [3] BRADSKI G, KAEHLER A. Learning OpenCV: computer vision with the OpenCV library[M].OReilly Media, Inc,2008. [4] WEN HUANWU, YING JUNZHAO, YONG FEICHE. Research and implementation of face detection based on openCV[J]. Trans Tech,2014(12):1710-1713. [5] 李了了,鄧善熙,丁興號.基于大津法的圖像分塊二值化算法[J].微計算機信息,2005(14):76-77. [6] 卜文斌,游福成,李泉,等.一種基于大津法改進的圖像分割方法[J].北京印刷學院學報,2015(4):76-78. [7] 張進猛,張進秋.基于OpenCV的圖像采集和處理[J].軟件導刊,2010,9(1):164-165. [8] 袁欣智,江洪,陳蕓芝,等.一種應用大津法的自適應閾值水體提取方法[J].遙感信息,2016,31(5):36-42. [9] 王蓉,侯鵬鵬,曾昭龍.基于OpenCV的人臉檢測與跟蹤方法實現[J].科學技術與工程,2014,24(14):115-118. (責任編輯:孫 娟)