python高斯滤波和降噪_高斯滤波原理及python实现
高斯濾波器時一種線性平滑濾波器,主要適用處理高斯噪聲,所以在了解高斯濾波之前,我們首先熟悉一下高斯噪聲。噪聲在圖像中表現的通常是引起視覺效果的孤立像素點和像素塊,簡單說噪聲點就是會給圖像帶來干擾,讓圖像變的不清楚。而高斯噪聲是指它的概率密度函數服從高斯分布(即正態分布)的一類噪聲。如果一個噪聲,它的幅度分布服從高斯分布,而它的功率譜密度又是均勻分布的,則稱它為高斯白噪聲。
高斯濾波器是一類根據高斯函數的形狀來選擇權值的線性平滑濾波器。高斯平滑濾波器對于抑制服從正態分布的噪聲非常有效。由于圖像都是二維的,所以在圖像處理中我們需要的是二維高斯函數。高斯函數的一維形式是:
$$
f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}
$$
其中μ是x的均值,δ是x的方差。當中心點為原點時,u為0,此時的公式如下:
$$
f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{x^2}{2\sigma{^2}}}
$$
根據一維高斯函數,可以推導出二維高斯函數(中心為原點):
$$
f(x)=\frac{1}{2\pi\sigma{^2}}e^{-\frac{x^2+y^2}{2\sigma{^2}}}
$$
通過上述兩個維度的高斯濾波器函數可以得到下圖的函數圖像。其中$\delta$的大小決定了高斯函數的寬度, σ越大函數圖像跨幅越寬,反之則越窄。
在圖像處理中,高斯濾波一般有兩種實現方式,一是用離散化窗口滑窗卷積,另一種通過傅里葉變換。最常見的就是第一種滑窗實現,只有當離散化的窗口非常大,用滑窗計算量非常大(即使用可分離濾波器的實現)的情況下,可能會考慮基于傅里葉變化的實現方法。
高斯濾波也是一個非常典型的圖像卷積例子,本質上,高斯濾波就是將(灰度)圖像 和一個高斯核進行卷積操作,具體的方式和上面的兩個濾波方法相似,只是卷積核存在差別。理論上,高斯分布在所有定義域上都有非負值,這就需要一個無限大的卷積核。在實際的計算過程中,卷積核是固定大小的,只需要將待計算的“中心點”作為原點,將周圍的點按照正態分布函數分配權重,計算加權平均值,得到最終的值,這個過程就是二維高斯核的卷積過程。
具體過程如下圖所示,假定中心點坐標為(0,0),當設定卷積核為3時,只需計算距離它最近的8個點,如圖中的第一個矩陣所示。以此矩陣中的坐標,帶入到公式2-14中,并且取σ=1.5,則半徑為1的權重矩陣如圖中第二個矩陣所示。因為需要利用該權重矩陣做加權平均,故需要對原始的矩陣做歸一化。具體操作方式是求出第二個矩陣的總和為0.4783,然后再將該矩陣的9個值分別除以0.4783,得到最終的卷積核(權重矩陣)。
通過上述步驟計算出高斯核,基于該高斯核便可進行高斯濾波操作。假設現有9個像素點,灰度值(0-255)如下圖中第一個卷積核所示,計算圖中中心點的濾波后的值。每個像素點乘以相對應的權重值,得到最終的分布值。將這9個像素的值相加得到的結果,就是中心位置圖像濾波后的值。對所有點重復這個過程,就得到了高斯濾波后的圖像。如果原圖是彩色圖片,可以對RGB三個通道分別做高斯濾波。
講解完卷積核的過程,通過代碼具體的實現高斯濾波。由于高斯濾波主要針對高斯噪聲表現的比較好,所有gasuss_noise在原始圖片中添加隨機噪聲,其中的參數mean和var對應二維高斯核函數的 和 。調用了opencv的GaussianBlur函數,針對下面代碼中的(3,3)是高斯矩陣的長和寬,0是高斯核的標準差是0,具體代碼如下:
def gasuss_noise(img, mean=0, var=0.005):
'''
添加高斯噪聲
mean : 均值
var : 方差
'''
image = img.copy()
image = np.array(image/255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape)
out = image + noise
if out.min() < 0:
low_clip = -1.
else:
low_clip = 0.
out = np.clip(out, low_clip, 1.0)
out = np.uint8(out*255)
return out
#讀取圖片
gasuss_noise_img = gasuss_noise(img)
#均值濾波
gasuss_filter_img = cv2.GaussianBlur(img, (3, 3), 1.1)
gasuss_filter_img1 = cv2.GaussianBlur(gasuss_noise_img, (3, 3), 1.1)
gasuss_filter_img2 = cv2.GaussianBlur(gasuss_noise_img, (9, 9), 1.1)
## 顯示
plt.figure(figsize=(15, 10))
plt.subplot(2, 2, 1), plt.imshow(img)
plt.axis('off'); plt.title('原圖')
plt.subplot(2, 2, 2), plt.imshow(gasuss_noise_img)
plt.axis('off'); plt.title('添加隨機高斯噪聲')
plt.subplot(2, 2, 3), plt.imshow(gasuss_filter_img1)
plt.axis('off'); plt.title('高斯核為3')
plt.subplot(2, 2, 4), plt.imshow(gasuss_filter_img2)
plt.axis('off'); plt.title('高斯核為9')
plt.show()
運行代碼得到,通過matplotlib函數可以得到下圖所示的圖像。從結果圖中可以看出卷積核越大,高斯噪聲過濾的效果越好,但是最終的結果圖也就越模糊,清晰度越差。具體過濾需要結果過濾效果和圖像清晰度綜合選取濾波卷積核尺寸半徑。
總結
以上是生活随笔為你收集整理的python高斯滤波和降噪_高斯滤波原理及python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: clover引导macos big su
- 下一篇: python程序员搞笑段子_程序员才能看