1. 加性高斯白噪聲
1.1 特點
加性高斯白噪聲屬于白噪聲的一種,有如下兩個特點:
- 功率譜密度為常數,即白
- 高斯則為其幅度的概率密度函數服從高斯分布
1.2 高斯分布的一維概率密度函數
-
為標準差
-
為均值
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 基本原理
在時域內有
-
為輸入信號
-
為系統函數
-
為輸出信號
根據時域卷積定理,我們知道時域卷積等于頻域乘積
-
分別為輸出信號,輸入信號,系統函數的傅里葉變換
則有
這意味著,當我們已知系統函數時,我們可以很簡單的完成濾波。
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 數學解釋
輸入信號經過系統函數后
時域上
頻域上
若存在加性噪聲則為
時域上
- 其中
頻域上
- 其中
則
于是,從上面對輸入信號的估計表達式可以看出,多出了一項加性噪聲的傅里葉變換與系統函數的比值。尤其當相對于
很小時,濾波后的信號差距十分嚴重。
3.3 維納濾波表達式
而我們又知道:白噪聲的白為噪聲的功率譜為常數,即為常數,于是,從直觀上看,當
相對于
較大時,則
較小,上式第一項則較小,而第二項較大從而保持相對平穩。
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