数字图像处理与分析---指纹图像增强

£可爱£侵袭症+ 提交于 2020-02-08 02:44:10

•​ 图1是一幅包含指纹的真实图像,请使用所学的图像处理技术进行处理,满足下面的要求:

•​ 1. 使图像中的指纹更加清晰;

•​ 2. 考虑到冬季皮肤粗糙的情况(成像时存在噪声,请自行添加噪声点),尽可能去除其中的噪声。

图1 基础题图像

目录

1需求分析... 3

1.1给指纹图像加噪声点... 3

1.2 指纹图像去除噪点... 3

1.3 图片转为灰度图... 4

1.4 灰度直方图... 4

1.5 图像分割... 4

1.6断点连接... 5

1.7 使得指纹图像平滑... 5

2 实现代码... 5

2.1 添加高斯噪声... 5

2.2 去除高斯噪声... 6

2.3 转换为灰度图... 6

2.4 计算灰度直方图... 7

2.5 指纹断点连接处理... 7

2.6 图片进行形态学开操作... 8

3 实验结果及分析... 8

4 附录... 13

4.1 代码目录... 13

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1需求分析

根据题目要求,使得图像中的指纹更加清晰。给图像指纹加噪声点,尽可能去除其中的噪点。

1.1给指纹图像加噪声点

使用高斯噪声给图片添加噪声点,高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯白噪声的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。高斯白噪声包括热噪声和散粒噪声。在通信信道测试和建模中,高斯噪声被用作加性白噪声以产生加性白高斯噪声。

高斯分布,也称正态分布,又称常态分布,记为N(μ,σ^2),其中μ,σ^2为分布的参数,分别为高斯分布的期望和方差。当有确定值时,p(x)也就确定了,特别当μ=0,σ^2=1时,X的分布为标准正态分布。

高斯分布函数公式如下:

1.2 指纹图像去除噪点

       使用高斯滤波器去除噪点。

是根据高斯函数来选择权值的线性平滑滤波器,对随机分布和服从正态分布的噪声有很好地滤除效果。它可以辅助大部分的边缘检测算法,

对图像的边缘进行扩展(边缘厚度变大),使噪声点的灰度降低,从而减少边缘检测中噪声的数量。

二维的高斯函数公式如下:

其中σ为正态分布的标准偏差,其值决定了高斯函数的变化幅度,对应就是滤波器的权值。高斯函数分布与二维滤波器常见模板如下:

 

1.3 图片转为灰度图

灰度图,Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶。

 

1.4 灰度直方图

灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。

      

1.5 图像分割

使用最大类间方差法最大类间方差法获得图像的阈值。它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

最大方差阈值是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种自适应的阈值确定方法。算法假设图像像素能够根据阈值,被分成背景[background]和目标[objects]两部分。然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大。

公式:  记 M = 256 单通道灰度分级 Sum = 像素总数

最大方差阈值不管图像的直方图有无明显的双峰,都能得到较为满意的结果,这种方法是与阈值自动选取的最优方法

 

 

1.6断点连接

统计当前像素点的八邻域,如果只存在一个像素值=255,说明只有这个个像素于当前像素连接,当前像素值为端点,接下来考虑16邻域,如果有像素值=255,则将这两个像素之间的像素值置为255

 

1.7 使得指纹图像平滑

开操作可以平滑物体轮廓,断开狭窄的间断和消除细小的突出物。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。

  • 开运算(Open Operation):先腐蚀后膨胀的过程;
  • 功能:
  • 消除小物体;
  • 在纤细处分离物体;
  • 平滑较大的边界并不明显改变其面积;

 

 

 

 

2 实现代码

2.1 添加高斯噪声

#添加高斯噪声(拍照的时候常见的噪声)
import numpy as np
import cv2

def gasuss_noise(image, mean=0, var=0.001):
    '''
        添加高斯噪声
        mean : 均值
        var : 方差
    '''
    #归一化操作
    #数据减去对应维度的最小值除以维度最大值减去维度最小值,这样做可以将数值压缩到[0,1]的区间。
    image = np.array(image/255, dtype=float)
    #生成随机噪声(正态分布的噪声)
    # mean=0说明这一个以Y轴为对称轴的正态分布,
    # var ** 0.5 正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。
    # image.shape 输出的值赋在shape里
    noise = np.random.normal(mean, var ** 0.5, image.shape)
    #将噪声添加到图片中
    out = image + noise

    if out.min() < 0:
        low_clip = -1.
    else:
        low_clip = 0.

    #将图片的像素值范围控制在(low_clip,1)
    out = np.clip(out, low_clip, 1.0)
    #图片还原
    out = np.uint8(out*255)

    return out

 

2.2 去除高斯噪声

#利用高斯滤波器处理高斯噪声

image = cv2.GaussianBlur(out,(3,3),1)

cv2.imshow("gasuss", image)

cv2.waitKey(0)

 

2.3 转换为灰度图

#对比度增强

#将图片转换成灰度图

gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)

cv2.imshow("gray", gray)

cv2.waitKey(0)

2.4 计算灰度直方图

#计算灰度直方图

def calcGrayHist(image):

    h,w = image.shape #获取图片的宽高

    grayHist = np.zeros([256],np.int8)  #返回来一个用0填充的数组

    for r in range(h):

        for c in range(w):

            #0-255 => 1-256 统计所有的灰度值

            grayHist[image[r,c]] += 1

    return grayHist



def plot_hist(image):

    grayHist = calcGrayHist(image)

    x_range = range(256)

    #对 x,y绘制为线条

    plt.plot(x_range, grayHist, 'r', linewidth=2, c='black')

    y_maxValue = np.max(grayHist)

    #设置xy轴的范围

    plt.axis([0, 255, 0, y_maxValue])

    # 设置坐标轴标签

    plt.xlabel('gray Level')

    plt.ylabel('number of pixels')

    # 显示直方图

    plt.show()

 

 

2.5 指纹断点连接处理

#边缘断裂连接

def connect(image):

    h,w = image.shape

    for i in range(2,h-2):

        for j in range(2,w-2):

            #如果中心点位置为255 考虑八邻域

            if image[i,j] == 255:

                num = 0

                for k in range(-1,2):

                    for l in range(-1,2):

                        if k != 0 or l != 0 and image[i+k,i+l] == 255:

                            num += 1



                #如果八邻域中只有一个点是255,说明该中心点为端点,则考虑其他领域

                if num == 1:

                    for k in range(-2,3):

                        for l in range(-2,3):

                            #非八邻域

                            if not(k<2 and k>-2 and l<2 and l>-2) and image[i+k,i+l] == 255:

                                image[i+k,i+l] = 255

    return image

 


 

 

2.6 图片进行形态学开操作

#利用形态学操作去除,将指纹边缘毛刺地方消除

#先腐蚀(毛刺)后膨胀

opening = cv2.morphologyEx(connect_image, cv2.MORPH_OPEN, (10,200))

cv2.imshow('opening', opening)

cv2.waitKey(0)

 

 

3 实验结果及分析

 

【原图】

 

【加入高斯噪声的图片】

 

                            原图                                                                      加上高斯噪声的图

 

两图对比仔细看的话,会看得出加上高斯噪声的图会有许多彩色的小点。这些小点就是通过高斯噪声加上的噪点。如果看不清楚可以运行源程序进行查看。

 

 

 

 

 

 

 

 

【处理高斯噪声后得图片】

 

去除噪点后,指纹图像会显得有点模糊,这是因为处理噪点时候使用了高斯模糊(英语:Gaussian Blur),也叫高斯平滑。用它来减少图像噪声以及降低细节层次。

 

【将图片转换成灰度图】

 

 

【查看灰度直方图】

 

 

图像的对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度级范围越大代表对比度越高;反之对比度越低,低对比度的图像在视觉上给人的感觉是看起来不够清晰,所以通过算法调整图像的灰度值,从而调整图像的对比度是有必要的。最简单的一种对比度增强的方法是通过灰度值的线性变换实现的。可以看出改灰度图出现了双峰。

 

【通过最大类间方差法(OTSU)进行图片像素分割】

 

                                                               【增强后的图片

这个算法是通过背景和前景图的像素概率值,来进行自动阈值估计,原图被我转换成了灰度图,只存在0,1像素值,这就意味着图像形成的直方图将是双峰值图像,根据前面的oTsu评估出来的阈值,直接将双峰分割开形成指纹(前景)以及白纸(背景)。可以看出该图片的指纹变得更清晰了,条理变粗。

 

【查看灰度直方图】

 

按照双峰值,将小于阈值的设为0,其他的按照公式(最大类间方差)进行设置灰度值

 

 

 

 

 

【断点处重连】

 

使用断点连接技术。统计当前像素点的八邻域,如果只存在一个像素值=255,说明只有这个个像素于当前像素连接,当前像素值为端点,接下来考虑16邻域,如果有像素值=255,则将这两个像素之间的像素值置为255。

由于断点距离太大,使用这个技术没办法实现断点连接,理论上是可以的。只有那种像素点之间有1个像素点的位置会有像素点填充。

 

【形态学开操作】

 

先腐蚀毛刺得边缘,再膨胀

 

开操作可以平滑物体轮廓,断开狭窄的间断和消除细小的突出物。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。

如果放大图片就可以看得到红框标记的地方指纹出现了膨胀。

 

 

4 附录

4.1 代码目录

exp1.py是主文件

noise.py 是添加噪声的方法

utils.py是工具,里面有画出灰度直方图工具以及断点重连方法

1.jpg 是需要处理的图片

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!