指纹识别技术应该是目前应用最为广泛的一种生物体特征识别技术,离我们最近且最为常用的就是手机上的指纹解锁功能。相较于其他的生物体特征识别,如掌纹、虹膜、面部等,指纹虽因其更易被仿照安全性稍逊于其他生物体特征,但与之对应的指纹识别技术因其易操作性、时间成本、开发成本都远优于其他特征识别技术而普及最广。同时也由于其是一项相对成熟、完善和简单的技术,且包含较为综合的图像处理技术,所以是图像算法学习与入门的不二之选。
图片及其格式
一张常规的图片通过行与列可将其分为多个像素点,每个像素点对应各自的色彩便可构成我们所看到的图片。这种图片也就是我们常见的点阵式图片(JPG、BMP等),这种类型的图片文件对应的就是一个典型的矩阵。
- JPEG格式
JPEG格式的图片有着极高的压缩率,它可以抛弃许多冗余的色彩数据,以达到极小的磁盘占用率,但这也意味着每次的压缩保存图片都会失真,这也被认为是我们时常发现在网络上被许多人多次保存和转发的图片变模糊变绿的原因之一(变绿被认为还同RGB与YCbCr色彩空间的相互转换有关)。 - BMP格式
BMP是bitmap的缩写是Windows系统中标准的一种图像格式,相对于JPEG而言它拥有更为丰富的色彩信息,且几乎不存在压缩,所以BMP格式的图片也更占磁盘空间。出于其图片的保真率较高图片信息储存较为完整,它也是机构发布的指纹识别标准的图片指定格式。
以下是Windows给出的BMP文件头结构体定义,其中包含了文件类型、文件大小、文件头到实际图像数据偏移量以及两个保留位。
typedef struct tagBITMAPFILEHEADER { UINT16 bfType; DWORD bfSize; UINT16 bfReserved1; UINT16 bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER;
以下是Windows给出的BMP文件的信息头,其中包括图片大小、图片像素宽高、颜色索引以及是否压缩等信息。
typedef struct tagBITMAPINFOHEADER { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER;
了解到图片的基本文件格式后,我们可以从文件中提取我们需要的信息进行操作,理论上讲通过设置各个像素点的色彩我们甚至可直接用代码作画。
灰度图及图像二值化
显然,就指纹的图像信息而言,是否有颜色对我们而言没有意义,我们所需要的指纹信息本质上其纹理走向,其他色彩信息反而会影响我们的判断。
所以需要将采集到的含有彩色信息的图片转化为灰度图,即黑白图像。若是YCbCr色彩空间我们只需要保留亮度信息Y,而将另外的两个颜色分量Cb、Cr丢掉就好了。对于RGB色彩空间,有一个经典的灰度转换公式:
G r a y = R ∗ 0.299 + G ∗ 0.587 + B ∗ 0.114 Gray = R*0.299 + G*0.587 + B*0.114 Gray=R∗0.299+G∗0.587+B∗