用迭代法求指纹图像中的阀值
摘要:给出使用直方图方法求阀值的例子;结合直方图方法提出用于计算最优阀值的迭代法,该方法是基于256级的指纹灰度图像计算;最后给出迭代法中初值的选择方法。实验结果证明该方法切实可行。
关键词:二值化 直方图 阀值 迭代法
在指纹识别系统中,通常的指纹处理算法都需要对指纹图像进行二值化处理,二值化之后可以对指纹图像进行细化和特征提取等工作。二值化过程需要确定合适的阀值,当相应的灰度值大于该阀值时则把该灰度值设的阀值,当相应的灰度值大于该阀值时对把该灰度值设为255(白),否则设为0(黑)。二值化过程使得指纹图像的纹线变得更加清晰。确定阀值的方法有很多,例如直方图法、迭代法等。对于有两个波峰的指纹图像,直方图法很容易得到合适的阀值,两个波峰的波谷即为阀值。但是对于只有一个波峰或没有波峰的指纹图像,确定合适的阀值很困难。如果使用文中提到的迭代法,不管有多少个波峰,都能很容易找到最优的阀值。迭代法的实现是基于256级灰度图像的直方图,其迭代初值的选择决定了该方法的收敛速度。最后,文中使用大量实验结果证明该迭代法的可行性,以及迭代初值的选择方法。
javascript:window.open(this.src);" style="cursor:pointer;"/>
1 直方图法确定阀值
通常指纹图像都是256级灰度图像,因此其直方图就是分别计算图像灰度从0-255的像素个数并用图表示出来,如图1所示。图1左图为指纹图像原因,右图为直方图。通过直方图法确定图像的阀值很简单。图1所示的指纹图像有两个波峰,波峰之间的波谷即是该指纹图像的阀值。
通过直方图法确定阀值必须保证指纹图像有两个波峰,而对于如图2所示的指纹图像,该方法就无能为力了。图2所示的图像吸有一个明显的波峰,没有所谓的波谷,因此很难找到一个合适的阀值。
javascript:window.open(this.src);" style="cursor:pointer;"/>
2 迭代法确定阀值
迭代法求指纹图像的阀值也离不开图像的直方图。下面将给出其计算公式。一般情况下指纹图像的灰度值使用256级,也就是说灰度值从0-255变化。设Si表示指纹图像内灰度从0-255的像素点数目,i=0-255;Ti表示阀值,则如下公式:
javascript:window.open(this.src);" style="cursor:pointer;"/>
若指定一个极小值ε,有:
Ti+1-Ti<ε (6)
则Ti+1即为最后的迭代结果,否则令Ti=Ti+1重新执行上面的计算过程,直到满足(6)式的条件。上述的迭代法用计算机实现很简单,只需按上面的公式列式计算即可。
javascript:window.open(this.src);" style="cursor:pointer;"/>
与直方图法相比,迭代法的计算量会大一些,但是它会找到任意指纹图像的最优阀值。
3 实验结果
本文按照上面的迭代法对不同的指纹图像进行迭代计算,求出其最优阀值,如图3、图4、图5、图6所示。这些指纹图像中前面三个是用光学传感器采集的,后面一个是用电容传感器的采集的,大小不完全一样。首先给出每一帧指纹图像的直方图,然后列表给出了它们的最优阀值,以及它们在不同初值下的迭代次数。
javascript:window.open(this.src);" style="cursor:pointer;"/>
对上述四幅指纹图像按文中提到的迭代方法进行迭代计算,最后得到的阀值如表1所示,它们在不同迭代初值下的迭代次数如表2所示。
表1 指纹图像的最优阀值
图像编号 | 图像3 | 图像4 | 图像5 | 图像6 |
最优阀值 | 140 | 173 | 184 | 138 |
表2
初始值/次数 | 图像3 | 图像4 | 图像5 | 图像6 |
50 | 迭代失败 | |||
100 | 6 | 6 | 6 | 4 |
128 | 5 | 5 | 5 | 3 |
140 | 1 | 5 | 5 | 2 |
170 | 5 | 3 | 4 | 3 |
200 | 6 | 3 | 3 | 4 |
240 | 迭代失败 | 4 | 4 | 迭代失败 |
从表2可以看出,在不同的迭代初值下迭代次数并不完全相同,特别是当初值迭得特别小或特别大时还会出现迭代失败的情况,因此迭代初值的选取非常关键。从表1可以看到,同一类型的传感器得到的阀值相差很小,而不同类型的传感器得到的阀相差较大。因此,对某一种类型的传感器,可以采取自适应的方式调节初值。这样初值就会很接近最后的阀值,迭代次数也会相应减少。