APP下载

基于OpenCV的指纹提取算法与实现

2017-09-29岳雅茹朱嘉林

软件导刊 2017年9期
关键词:函数库指纹图直方图

岳雅茹 朱嘉林

摘 要:目前,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.

(责任编辑:孙 娟)

猜你喜欢

函数库指纹图直方图
符合差分隐私的流数据统计直方图发布
用于优化雷达信号处理的VSIPL函数库
Scratch求最值和平均值
基于BB60C的IQ数据采集与存储系统设计
用直方图控制画面影调
指纹图像传感器技术与后续发展研究
沉香GC-MS指纹图谱分析
基于模板检测法的指纹图像的细节特征提取
基于空间变换和直方图均衡的彩色图像增强方法
基于直方图平移和互补嵌入的可逆水印方案