Opencv學習(四)圖像的噪聲處理(椒鹽噪聲)

椒鹽噪聲也稱爲脈衝噪聲,是圖像中經常見到的一種噪聲,它是一種隨機出現的白點或者黑點,可能是亮的區域有黑色像素或是在暗的區域有白色像素(或是兩者皆有)。椒鹽噪聲的成因可能是影像訊號受到突如其來的強烈干擾而產生、類比數位轉換器或位元傳輸錯誤等。例如失效的感應器導致像素值爲最小值,飽和的感應器導致像素值爲最大值。

常用的去除這種噪聲的有效手段是使用中值濾波器

圖像處理中,在進行如邊緣檢測這樣的進一步處理之前,通常需要首先進行一定程度的降噪中值濾波是一種非線性數字濾波器技術,經常用於去除圖像或者其它信號中的噪聲。這個設計思想就是檢查輸入信號中的採樣並判斷它是否代表了信號,使用奇數個採樣組成的觀察窗實現這項功能。觀察窗口中的數值進行排序,位於觀察窗中間的中值作爲輸出。然後,丟棄最早的值,取得新的採樣,重複上面的計算過程。

中值濾波是圖像處理中的一個常用步驟,它對於斑點噪聲和椒鹽噪聲來說尤其有用。保存邊緣的特性使它在不希望出現邊緣模糊的場合也很有用。

 一副數字圖像生成椒鹽噪聲的步驟如下:

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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章