数字图像处理与分析---指纹图像增强(Python)
???圖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 cv2def 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 + noiseif 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]] += 1return grayHistdef 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.shapefor i in range(2,h-2):for j in range(2,w-2):#如果中心點位置為255 考慮八鄰域if image[i,j] == 255:num = 0for 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] = 255return 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 是需要處理的圖片
?
完整源碼下載地址 https://download.csdn.net/download/qq_41398448/12495945
總結
以上是生活随笔為你收集整理的数字图像处理与分析---指纹图像增强(Python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试培训班 软件测试0基础到项目实战
- 下一篇: python是一种解释型、面向什么的计算