加性高斯白噪聲及維納濾波的基本原理與Python實現

1. 加性高斯白噪聲

1.1 特點

加性高斯白噪聲屬于白噪聲的一種,有如下兩個特點:

  • 功率譜密度為常數,即白
  • 高斯則為其幅度的概率密度函數服從高斯分布

1.2 高斯分布的一維概率密度函數

P(x) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}

  • \sigma 為標準差
  • \mu為均值

1.3 Python內置庫說明

random.gauss(mu, sigma)其值即服從高斯分布,若想要是實現加性高斯白噪聲,循環作加即可

1.4 Code

import numpy as np
import random

def gaussian_white_noise(intput_signal, mu, sigma):
    '''
    加性高斯白噪聲(適用于灰度圖)
    :param intput_signal: 輸入圖像
    :param mu: 均值
    :param sigma: 標準差
    :return:
    '''

    intput_signal_cp = np.copy(intput_signal)  # 輸入圖像的副本

    m, n = intput_signal_cp.shape   # 輸入圖像尺寸(行、列)

    # 添加高斯白噪聲
    for i in range(m):
        for j in range(n):
            intput_signal_cp[i, j] = intput_signal_cp[i, j] + random.gauss(mu, sigma)


    return intput_signal_cp

1.5 測試對比

均值為0,標準差為10時的加行高斯白噪聲前后對比圖

2. 逆濾波

實際上逆濾波是維納濾波的一種理想情況,當不存在加性噪聲時,維納濾波與逆濾波等同。

2.1 基本原理

在時域內有
y(n) = x(n)\bigotimes h(n)

  • x(n)為輸入信號
  • h(n)為系統函數
  • y(n)為輸出信號

根據時域卷積定理,我們知道時域卷積等于頻域乘積

Y(\omega) = X(\omega) \times H(\omega)

  • Y, X, H分別為輸出信號,輸入信號,系統函數的傅里葉變換

則有
X(\omega) = \frac{Y(\omega)}{H(\omega)}
這意味著,當我們已知系統函數時,我們可以很簡單的完成濾波。

2.2 Code

import numpy as np


def inverse_filtering(input_singal, h):
    '''
    逆濾波
    :param input_singal: 輸入信號
    :param h: 退化函數(時域)
    :return: 濾波后的信號(幅值)
    '''
    output_signal = [] #輸出信號
    output_signal_fft = [] #輸出信號的傅里葉變換

    h_fft = np.fft.fft2(h) # 退化函數的傅里葉變換

    input_singal_fft = np.fft.fft2(input_singal)  # 輸入信號的傅里葉變換

    output_signal_fft = input_singal_fft / h_fft

    output_signal = np.abs(np.fft.ifft2(output_signal_fft))

    return output_signal

3 維納濾波

3.1 直觀認識

理解了逆濾波的基本過程之后,實際上維納濾波就不是太大問題了。實際上,逆濾波對于絕大多數情況濾波效果都不好,因為逆濾波是通過傅里葉變換將信號由時域轉換到頻域,再根據時域卷積定理,在頻域作除法。對于乘性干擾這當然是沒問題的,甚至是完美的。而如果存在加性噪聲,例如:加性高斯白噪聲。逆濾波效果就不好了,某些情況下幾乎無法完成濾波情況。

3.2 數學解釋

輸入信號經過系統函數后
時域上
y(n) = x(n)\bigotimes h(n)
頻域上
Y(\omega) = X(\omega) \times H(\omega)
若存在加性噪聲則為
時域上
y(n) = g(n) + d(n)

  • 其中g(n) = x(n)\bigotimes h(n)

頻域上
Y(\omega) = G(\omega) + C(\omega)

  • 其中G(\omega) = X(\omega) \times H(\omega)


\frac {Y(\omega)}{H(\omega)} = \hat{X}(\omega)=X(\omega)+\frac{C(\omega)}{H(\omega)}

于是,從上面對輸入信號的估計表達式可以看出,多出了一項加性噪聲的傅里葉變換與系統函數的比值。尤其當H(\omega)相對于C(\omega)很小時,濾波后的信號差距十分嚴重。

3.3 維納濾波表達式

\hat{X}(\omega)=\left[\frac{1}{H(\omega)} \frac{|H(\omega)|^{2}}{|H(\omega)|^{2}+K}\right] G(\omega)

  • K = \frac{|C(\omega)|^2}{|H(\omega)|^2}

而我們又知道:白噪聲的白為噪聲的功率譜為常數,即|C(\omega)|^2為常數,于是,從直觀上看,當|H(\omega)|相對于|C(\omega)|較大時,則K較小,上式第一項則較小,而第二項較大從而保持相對平穩。

3.4 Code

import numpy as np

def wiener_filtering(input_signal, h, K):
    '''
    維納濾波
    :param input_signal: 輸入信號
    :param h: 退化函數(時域)
    :param K: 參數K
    :return: 維納濾波后的信號(幅值)
    '''
    output_signal = []  # 輸出信號

    output_signal_fft = [] # 輸出信號的傅里葉變換

    input_signal_cp = np.copy(input_signal) # 輸入信號的副本

    input_signal_cp_fft = np.fft.fft2(input_signal_cp)  # 輸入信號的傅里葉變換

    h_fft = np.fft.fft2(h) # 退化函數的傅里葉變換

    h_abs_square = np.abs(h_fft)**2 # 退化函數模值的平方

    # 維納濾波
    output_signal_fft = np.conj(h_fft) / (h_abs_square + K)

    output_signal = np.abs(np.fft.ifft2(output_signal_fft * input_signal_cp_fft)) # 輸出信號傅里葉反變換

    return output_signal

4 維納濾波與逆濾波對比

camera
coins

5 GitHub

click me!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容