• 图1是一幅包含指纹的真实图像,请使用所学的图像处理技术进行处理,满足下面的要求:
• 1. 使图像中的指纹更加清晰;
• 2. 考虑到冬季皮肤粗糙的情况(成像时存在噪声,请自行添加噪声点),尽可能去除其中的噪声。
图1 基础题图像
目录
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 是需要处理的图片
来源:CSDN
作者:浪里小黑狼
链接:https://blog.csdn.net/qq_41398448/article/details/104212738