卷積
LPF(低通濾波) 幫助我們去除噪音,模糊圖像,降低圖像的高頻成分。
如 kernel = [[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]]
HPF (高通濾波)幫助我們找到圖像的邊緣 ,去除圖像的低頻成分。
如: kernel = [[0, -1, 0],
[-1, 4, -1],
[0, -1, 0]]
在低頻區域(圖像變化很小的區域),通過卷積,會將該點的灰度值變成接近0的值,而在高頻區域(變化大的區域,邊緣),通過卷積會保留下來(灰度值接近1)。
OpenCV 提供的函數 cv.filter2D() 可以讓我們對一幅圖像進行卷積操作(實際上並非卷積操作)。
代碼:
1 import numpy as np 2 import cv2 3 from matplotlib import pyplot as plt 4
5 img = cv2.imread("../image/girl.jpg") 6 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 7
8 # 生成 5 X 5的平均濾波器核
9 kernel = np.ones((5, 5), np.float32) / 25
10
11 dst = cv2.filter2D(img, -1, kernel) 12
13 plt.subplot(121), plt.imshow(img), plt.title("Original") 14 plt.subplot(122), plt.imshow(dst), plt.title("Avera") 15 plt.show()
結果:
平均法
這是由一個歸一化卷積框完成的。他只是用卷積框覆蓋區域所有像素的平均值來代替中心元素。可以使用函數 cv2.blur() 和 cv2.boxFilter() 來完這個任務。
如果你不想使用歸一化卷積框,你應該使用 cv2.boxFilter(),這時要傳入參數 normalize=False
代碼:
1 import numpy as np 2 import cv2 3 from matplotlib import pyplot as plt 4
5 img = cv2.imread("../image/noisy.jpg") 6 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 7
8 blur = cv2.blur(img, (5, 5)) 9
10 plt.subplot(121), plt.imshow(img), plt.title("Original") 11 plt.subplot(122), plt.imshow(blur), plt.title("Avera") 12 plt.show()
結果:
高斯模糊
把卷積核換成高斯核(簡單來說,方框不變,將原來每個方框的值是相等的,現在里面的值是符合高斯分布的,方框中心的值最大,其余方框根據距離中心元素的距離遞減,構成一個高斯小山包。原來的求平均數現在變成求加權平均數,全就是方框里的值)。實現的函數是 cv2.GaussianBlur()。我們需要指定高斯核的寬和高(必須是奇數)。以及高斯函數沿 X, Y 方向的標准差。如果我們只指定了 X 方向的的標准差, Y 方向也會取相同值。如果兩個標准差都是 0,那么函數會根據核函數的大小自己計算。高斯濾波可以有效的從圖像中去除高斯噪音。
也可以使用函數 cv2.getGaussianKernel() 自己構建一個高斯核。
1 #0 是指根據窗口大小( 5,5)來計算高斯函數標准差
2 blur = cv2.GaussianBlur(img,(5,5),0)
結果:
中值濾波
主題思想是取相鄰像素的點,然后對相鄰像素的點進行排序,取中點的灰度值作為該像素點的灰度值。這個濾波器經常用來去除椒鹽噪聲(一種隨機出現的白點或黑點),同時又能保留邊緣細節。
卷積核的大小也應該是一個奇數。
代碼:
1 median = cv2.medianBlur(img, 5)
結果:去除椒鹽噪聲效果比高斯濾波均值濾波效果要好
雙邊濾波
cv2.bilateralFilter() 能在保持邊界清晰的情況下有效的去除噪音。但是這種操作與其他濾波器相比會比較慢。我們已經知道高斯濾波器是求中心點鄰近區域像素的高斯加權平均值。這種高斯濾波器只考慮像素之間的空間關系,而不會考慮像素值之間的關系(像素的相似度)。所以這種方法不會考慮一個像素是否位於邊界。因此邊界也會被模糊掉,而這正不是我們想要。
雙邊濾波同時使用空間高斯權重和灰度值相似性高斯權重。空間高斯函數確保只有鄰近區域的像素對中心點有影響,灰度值相似性高斯函數確保只有與中心像素灰度值相近的才會被用來做模糊運算。所以這種方法會確保邊界不會被模糊掉,因為邊界處的灰度值變化比較大。
代碼:
1 # 9-代表鄰域直徑,75分別代表空間高斯函數標准差,灰度值相似性高斯函數標准差
2 blur = cv2.bilateralFilter(img, 9, 75, 75)
結果:從結果可以看出,由於保存了過多的高頻信息,對於彩色圖像里的高頻噪聲,雙邊濾波器不能夠干凈的濾掉,只能夠對於低頻信息進行較好的濾波
總結:
1)均值模糊無法克服邊緣像素信息丟失的缺陷,原因是均值濾波是基於平均權重的。
2)高斯模糊部分克服了該缺陷,但無法完全避免,因為沒有考慮像素值的不同。
3)高斯雙邊模糊-是邊緣保留額濾波方法,避免了邊緣信息丟失,保留了圖像輪廓不變,但容易導致高頻噪聲無法完全去除。
4)在實際應用時,應根據噪聲的特點、期望的圖像和邊緣特征等來選擇合適的濾波器,這樣才能發揮圖像濾波的最大優點。