python高斯滤波和降噪_高斯滤波原理及python实现
高斯濾波器時(shí)一種線性平滑濾波器,主要適用處理高斯噪聲,所以在了解高斯濾波之前,我們首先熟悉一下高斯噪聲。噪聲在圖像中表現(xiàn)的通常是引起視覺(jué)效果的孤立像素點(diǎn)和像素塊,簡(jiǎn)單說(shuō)噪聲點(diǎn)就是會(huì)給圖像帶來(lái)干擾,讓圖像變的不清楚。而高斯噪聲是指它的概率密度函數(shù)服從高斯分布(即正態(tài)分布)的一類噪聲。如果一個(gè)噪聲,它的幅度分布服從高斯分布,而它的功率譜密度又是均勻分布的,則稱它為高斯白噪聲。
高斯濾波器是一類根據(jù)高斯函數(shù)的形狀來(lái)選擇權(quán)值的線性平滑濾波器。高斯平滑濾波器對(duì)于抑制服從正態(tài)分布的噪聲非常有效。由于圖像都是二維的,所以在圖像處理中我們需要的是二維高斯函數(shù)。高斯函數(shù)的一維形式是:
$$
f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}
$$
其中μ是x的均值,δ是x的方差。當(dāng)中心點(diǎn)為原點(diǎn)時(shí),u為0,此時(shí)的公式如下:
$$
f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{x^2}{2\sigma{^2}}}
$$
根據(jù)一維高斯函數(shù),可以推導(dǎo)出二維高斯函數(shù)(中心為原點(diǎn)):
$$
f(x)=\frac{1}{2\pi\sigma{^2}}e^{-\frac{x^2+y^2}{2\sigma{^2}}}
$$
通過(guò)上述兩個(gè)維度的高斯濾波器函數(shù)可以得到下圖的函數(shù)圖像。其中$\delta$的大小決定了高斯函數(shù)的寬度, σ越大函數(shù)圖像跨幅越寬,反之則越窄。
在圖像處理中,高斯濾波一般有兩種實(shí)現(xiàn)方式,一是用離散化窗口滑窗卷積,另一種通過(guò)傅里葉變換。最常見(jiàn)的就是第一種滑窗實(shí)現(xiàn),只有當(dāng)離散化的窗口非常大,用滑窗計(jì)算量非常大(即使用可分離濾波器的實(shí)現(xiàn))的情況下,可能會(huì)考慮基于傅里葉變化的實(shí)現(xiàn)方法。
高斯濾波也是一個(gè)非常典型的圖像卷積例子,本質(zhì)上,高斯濾波就是將(灰度)圖像 和一個(gè)高斯核進(jìn)行卷積操作,具體的方式和上面的兩個(gè)濾波方法相似,只是卷積核存在差別。理論上,高斯分布在所有定義域上都有非負(fù)值,這就需要一個(gè)無(wú)限大的卷積核。在實(shí)際的計(jì)算過(guò)程中,卷積核是固定大小的,只需要將待計(jì)算的“中心點(diǎn)”作為原點(diǎn),將周?chē)狞c(diǎn)按照正態(tài)分布函數(shù)分配權(quán)重,計(jì)算加權(quán)平均值,得到最終的值,這個(gè)過(guò)程就是二維高斯核的卷積過(guò)程。
具體過(guò)程如下圖所示,假定中心點(diǎn)坐標(biāo)為(0,0),當(dāng)設(shè)定卷積核為3時(shí),只需計(jì)算距離它最近的8個(gè)點(diǎn),如圖中的第一個(gè)矩陣所示。以此矩陣中的坐標(biāo),帶入到公式2-14中,并且取σ=1.5,則半徑為1的權(quán)重矩陣如圖中第二個(gè)矩陣所示。因?yàn)樾枰迷摍?quán)重矩陣做加權(quán)平均,故需要對(duì)原始的矩陣做歸一化。具體操作方式是求出第二個(gè)矩陣的總和為0.4783,然后再將該矩陣的9個(gè)值分別除以0.4783,得到最終的卷積核(權(quán)重矩陣)。
通過(guò)上述步驟計(jì)算出高斯核,基于該高斯核便可進(jìn)行高斯濾波操作。假設(shè)現(xiàn)有9個(gè)像素點(diǎn),灰度值(0-255)如下圖中第一個(gè)卷積核所示,計(jì)算圖中中心點(diǎn)的濾波后的值。每個(gè)像素點(diǎn)乘以相對(duì)應(yīng)的權(quán)重值,得到最終的分布值。將這9個(gè)像素的值相加得到的結(jié)果,就是中心位置圖像濾波后的值。對(duì)所有點(diǎn)重復(fù)這個(gè)過(guò)程,就得到了高斯濾波后的圖像。如果原圖是彩色圖片,可以對(duì)RGB三個(gè)通道分別做高斯濾波。
講解完卷積核的過(guò)程,通過(guò)代碼具體的實(shí)現(xiàn)高斯濾波。由于高斯濾波主要針對(duì)高斯噪聲表現(xiàn)的比較好,所有g(shù)asuss_noise在原始圖片中添加隨機(jī)噪聲,其中的參數(shù)mean和var對(duì)應(yīng)二維高斯核函數(shù)的 和 。調(diào)用了opencv的GaussianBlur函數(shù),針對(duì)下面代碼中的(3,3)是高斯矩陣的長(zhǎng)和寬,0是高斯核的標(biāo)準(zhǔn)差是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('添加隨機(jī)高斯噪聲')
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()
運(yùn)行代碼得到,通過(guò)matplotlib函數(shù)可以得到下圖所示的圖像。從結(jié)果圖中可以看出卷積核越大,高斯噪聲過(guò)濾的效果越好,但是最終的結(jié)果圖也就越模糊,清晰度越差。具體過(guò)濾需要結(jié)果過(guò)濾效果和圖像清晰度綜合選取濾波卷積核尺寸半徑。
總結(jié)
以上是生活随笔為你收集整理的python高斯滤波和降噪_高斯滤波原理及python实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: clover引导macos big su
- 下一篇: 利用循环神经网络生成唐诗_11种主要神经