椒鹽噪聲也稱爲脈衝噪聲,是圖像中經常見到的一種噪聲,它是一種隨機出現的白點或者黑點,可能是亮的區域有黑色像素或是在暗的區域有白色像素(或是兩者皆有)。椒鹽噪聲的成因可能是影像訊號受到突如其來的強烈干擾而產生、類比數位轉換器或位元傳輸錯誤等。例如失效的感應器導致像素值爲最小值,飽和的感應器導致像素值爲最大值。
常用的去除這種噪聲的有效手段是使用中值濾波器。
在圖像處理中,在進行如邊緣檢測這樣的進一步處理之前,通常需要首先進行一定程度的降噪。中值濾波是一種非線性數字濾波器技術,經常用於去除圖像或者其它信號中的噪聲。這個設計思想就是檢查輸入信號中的採樣並判斷它是否代表了信號,使用奇數個採樣組成的觀察窗實現這項功能。觀察窗口中的數值進行排序,位於觀察窗中間的中值作爲輸出。然後,丟棄最早的值,取得新的採樣,重複上面的計算過程。
中值濾波是圖像處理中的一個常用步驟,它對於斑點噪聲和椒鹽噪聲來說尤其有用。保存邊緣的特性使它在不希望出現邊緣模糊的場合也很有用。
一副數字圖像生成椒鹽噪聲的步驟如下:
1.指定信噪比 SNR (其取值範圍在[0, 1]之間)
2.計算總像素數目 SP, 得到要加噪的像素數目 NP = SP * (1-SNR)
3.隨機獲取要加噪的每個像素位置P(i, j)
4.指定像素值爲255或者0。
5.重複3,4兩個步驟完成所有像素的NP個像素
6.輸出加噪以後的圖像
中值濾波cv2.medianBlur(img, 3)這個函數的參數可以調節!!!!!!!!
import cv2
import numpy as np
def addSaltNoise(img,snr):
# 指定信噪比
SNR = snr
# 獲取總共像素個數
size = img.size
# 因爲信噪比是 SNR ,所以噪聲佔據百分之10,所以需要對這百分之10加噪聲
noiseSize = int(size * (1 - SNR))
# 對這些點加噪聲
for k in range(0, noiseSize):
# 隨機獲取 某個點
xi = int(np.random.uniform(0, img.shape[1]))
xj = int(np.random.uniform(0, img.shape[0]))
# 增加噪聲
if img.ndim == 2:
img[xj, xi] = 255
elif img.ndim == 3:
img[xj, xi] = 0
return img
def removeSaltNoise():
filename = "C:/Users/hanyufeng/Desktop/3.jpg"
# 得到加噪聲之後的圖像
img = addSaltNoise(cv2.imread(filename),0.9)
# 進行中值濾波
#一開始參數值是3,不是7
dstimg = cv2.medianBlur(img, 7)
cv2.imshow('src', img)
cv2.imshow('dst', dstimg)
cv2.waitKey(0)
def main():
removeSaltNoise()
if __name__ == '__main__':
main()