OpenCV-Python 圖像平滑

目標

學會:

  • 使用各種低通濾鏡模糊圖像
  • 將定製的濾鏡應用於圖像(2D卷積)

2D卷積(圖像過濾)

與一維信號一樣,還可以使用各種低通濾波器(LPF),高通濾波器(HPF)等對圖像進行濾波。LPF有助於消除噪聲,使圖像模糊等。HPF濾波器有助於在圖像中找到邊緣。

OpenCV提供了一個函數cv.filter2D來將內核與圖像進行卷積。例如,我們將嘗試對圖像進行平均濾波。5x5平均濾波器內核如下所示:


OpenCV-Python 圖像平滑 | 十六

操作如下:保持這個內核在一個像素上,將所有低於這個內核的25個像素相加,取其平均值,然後用新的平均值替換中心像素。它將對圖像中的所有像素繼續此操作。試試這個代碼,並檢查結果:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('opencv_logo.png')
kernel = np.ones((5,5),np.float32)/25
dst = cv.filter2D(img,-1,kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
plt.xticks([]), plt.yticks([])
plt.show()

結果:

OpenCV-Python 圖像平滑 | 十六

圖像模糊(圖像平滑)

通過將圖像與低通濾波器內核進行卷積來實現圖像模糊。這對於消除噪音很有用。它實際上從圖像中消除了高頻部分(例如噪聲,邊緣)。因此,在此操作中邊緣有些模糊。(有一些模糊技術也可以不模糊邊緣)。OpenCV主要提供四種類型的模糊技術。

1.平均

這是通過將圖像與歸一化框濾鏡進行卷積來完成的。它僅獲取內核區域下所有像素的平均值,並替換中心元素。這是通過功能cv.blur()cv.boxFilter()完成的。檢查文檔以獲取有關內核的更多詳細信息。我們應該指定內核的寬度和高度。3x3歸一化框式過濾器如下所示:


OpenCV-Python 圖像平滑 | 十六

注意
如果您不想使用標準化的框式過濾器,請使用cv.boxFilter()。將參數normalize = False傳遞給函數。

查看下面的示例演示,其內核大小為5x5:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('opencv-logo-white.png')
blur = cv.blur(img,(5,5))
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

結果:

OpenCV-Python 圖像平滑 | 十六

2.高斯模糊

在這種情況下,代替盒式濾波器,使用了高斯核。這是通過功能cv.GaussianBlur() 完成的。我們應指定內核的寬度和高度,該寬度和高度應為正數和奇數。我們還應指定X和Y方向的標準偏差,分別為sigmaX和sigmaY。如果僅指定sigmaX,則將sigmaY與sigmaX相同。如果兩個都為零,則根據內核大小進行計算。高斯模糊對於從圖像中去除高斯噪聲非常有效。

如果需要,可以使用函數cv.getGaussianKernel() 創建高斯內核。

可以修改以上代碼以實現高斯模糊:

blur = cv.GaussianBlur(img,(5,5),0)

結果:

OpenCV-Python 圖像平滑 | 十六

3.中位模糊

在這裡,函數cv.medianBlur() 提取內核區域下所有像素的中值,並將中心元素替換為該中值。這對於消除圖像中的椒鹽噪聲非常有效。有趣的是,在上述過濾器中,中心元素是新計算的值,該值可以是圖像中的像素值或新值。但是在中值模糊中,中心元素總是被圖像中的某些像素值代替。有效降低噪音。其內核大小應為正奇數整數。

在此演示中,我向原始圖像添加了50%的噪聲並應用了中值模糊。檢查結果:

median = cv.medianBlur(img,5)

結果:

OpenCV-Python 圖像平滑 | 十六

4.雙邊濾波

cv.bilateralFilter() 在去除噪聲的同時保持邊緣清晰銳利非常有效。但是,與其他過濾器相比,該操作速度較慢。我們已經看到,高斯濾波器採用像素周圍的鄰域並找到其高斯加權平均值。高斯濾波器僅是空間的函數,也就是說,濾波時會考慮附近的像素。它不考慮像素是否具有幾乎相同的強度。它不考慮像素是否是邊緣像素。因此它也模糊了邊緣,這是我們不想做的。

雙邊濾波器在空間中也採用高斯濾波器,但是又有一個高斯濾波器,它是像素差的函數。空間的高斯函數確保僅考慮附近像素的模糊,而強度差的高斯函數確保僅考慮強度與中心像素相似的那些像素的模糊。由於邊緣的像素強度變化較大,因此可以保留邊緣。

以下示例顯示了使用雙邊過濾器(有關參數的詳細信息,請訪問docs)。

blur = cv.bilateralFilter(img,9,75,75)

結果:

OpenCV-Python 圖像平滑 | 十六

看到,表面上的紋理消失了,但是邊緣仍然保留。

其他資源

  1. 有關雙邊過濾的詳細信息:http://people.csail.mit.edu/sparis/bf_course/


分享到:


相關文章: