
目錄
- 1 分類
- 2 鄰域濾波
- 2.1 線性濾波
- 2.1.1 方框濾波
- 2.1.2 高斯濾波
- 2.2 非線性濾波
- 3 頻域濾波
- 3.1 低通濾波
- 3.2 高通濾波
1 分類
影像濾波按影像域可分為兩種型別:
- 鄰域濾波(Spatial Domain Filter),其本質是數字視窗上的數學運算,一般用于影像平滑、影像銳化、特征提取(如紋理測量、邊緣檢測)等,鄰域濾波使用鄰域算子——利用給定像素周圍像素值以決定此像素最終輸出的一種算子
- 頻域濾波(Frequency Domain Filter),其本質是對像素頻率的修改,一般用于降噪、重采樣、影像壓縮等,
按影像頻率濾除效果主要分為兩種型別:
- 低通濾波,濾除原影像的高頻成分,即模糊影像邊緣與細節,
- 高通濾波,濾除原影像的低頻成分,即影像銳化,
匯入原圖和噪圖
import cv2,skimage
import numpy as np
# 原圖
srcImg = cv2.imread("test.jpg")
cv2.imshow("src image", srcImg)
# 給影像增加高斯噪聲
noiseImg = skimage.util.random_noise(srcImg, mode='gaussian')
cv2.imshow("image with noise", noiseImg)
其中噪聲可選
gaussian:高斯加性噪聲localvar:高斯加性噪聲,每點具有特定區域方差poisson: 泊松分布噪聲salt:鹽噪聲,隨機用1替換像素pepper:胡椒噪聲,隨機用0或-1替換像素s&p:椒鹽噪聲,呈現出黑白雜點
2 鄰域濾波
2.1 線性濾波
線性鄰域濾波,指像素的輸出值取決于輸入區域像素的加權和,下面介紹常見的線性濾波算子,
2.1.1 方框濾波
方框濾波(Box Filter),其核函式為:
K
e
r
??
=
??
1
α
[
1
1
?
1
1
1
?
1
?
?
?
?
1
1
?
1
]
Ker\,\,=\,\,\frac{1}{\alpha}\left[ \begin{matrix} 1& 1& \cdots& 1\\ 1& 1& \cdots& 1\\ \vdots& \vdots& \ddots& \vdots\\ 1& 1& \cdots& 1\\\end{matrix} \right]
Ker=α1???????11?1?11?1??????11?1???????
其中 α = { 1 K e r S i z e ?? , N o r m a l i z e ?? = ?? T r u e 1 , N o r m a l i z e ?? = ?? F a l s e \alpha =\begin{cases} \frac{1}{KerSize}\,\, , Normalize\,\,=\,\,True\\ 1 , Normalize\,\,=\,\,False\\\end{cases} α={KerSize1?,Normalize=True1,Normalize=False?
非歸一化的方框濾波用于計算每個像素鄰域內的積分特性,比如密集光流演算法(Dense Optical Flow Algorithms)中用到的影像倒數的協方差矩陣,
歸一化的方框濾波則為均值濾波(Blur),即鄰域平均法——用一片影像區域各個像素的均值來代替原影像中的各個像素值,均值濾波用于影像平滑,但其在降噪的同時也破壞了影像的邊緣細節,從而使影像變得模糊,降噪能力較差,
進行方框濾波
# 方框濾波
boxImg = cv2.boxFilter(noiseImg, ddepth = -1, ksize = (2, 2), normalize = False)
cv2.imshow("box Image", boxImg)
# 均值濾波
blurImg = cv2.blur(noiseImg, (6, 5))
cv2.imshow("blur image", blurImg)
若將方框濾波核設為(6,5)且歸一化,則效果與均值濾波相同,
2.1.2 高斯濾波
高斯濾波(Gauss Filter)基于二維高斯核函式
G ( x , y , σ ) = 1 2 π σ 2 e ? x 2 + y 2 2 σ 2 G\left( x,y,\sigma \right) =\frac{1}{2\pi \sigma ^2}e^{-\frac{x^2+y^2}{2\sigma ^2}} G(x,y,σ)=2πσ21?e?2σ2x2+y2?
具有在保持細節的條件下進行噪聲濾波的能力,因此廣泛應用于影像降噪中,但其效率比均值濾波低,
高斯濾波器有兩個特征量:
- 核大小,其決定了影像的平滑范圍,理論上,高斯核函式應該無窮大,以達到最佳的平滑效果,但過大的卷積核會導致運算效率驟降,根據高斯函式 3 σ 3\sigma 3σ規則,可以取高斯核大小為 ( 6 σ + 1 ) × ( 6 σ + 1 ) \left( 6\sigma +1 \right) \times \left( 6\sigma +1 \right) (6σ+1)×(6σ+1);
- 離散程度 σ \sigma σ,其決定了對高頻成分的抑制程度, σ \sigma σ越大,像素加權半徑越大,平滑程度越強,

# 高斯濾波
gaussImg = cv2.GaussianBlur(noiseImg, (5, 5), 0)
cv2.namedWindow("gaussain image")
cv2.imshow("gaussain image", gaussImg)

2.2 非線性濾波
雖然線性濾波器易于構造且計算效率高,但有些情況下,使用鄰域像素的非線性濾波效果更好,例如,若影像具有椒鹽噪聲而非高斯噪聲,此時對影像高斯濾波并不會去除噪聲像素,只是把噪聲轉換為更為柔和但仍然可見的顆粒,

中值濾波(Median filter)是一種基于排序統計理論的典型非線性濾波技術,核心原理是用像素點鄰域灰度值中值代替該像素點的灰度值,中值濾波對脈沖噪聲、椒鹽噪聲尤為有效,且具有邊緣保護特性,中值濾波器本質上是數字視窗內的非線性取中值運算,而非線性濾波器的加權運算,因此中值濾波沒有卷積核,運算效率僅有線性濾波的1/5左右,
# 原圖
srcImg = cv2.imread("test.jpg")
cv2.imshow("src image", srcImg)
# 給影像增加椒鹽噪聲
noiseImg = skimage.util.random_noise(srcImg, mode='s&p')
cv2.imshow("image with noise", noiseImg)
medImg = cv2.medianBlur(np.uint8(noiseImg * 255), 3)
cv2.namedWindow("median image")
cv2.imshow("median image", medImg)
3 頻域濾波
通過傅里葉變換將影像變換到頻域,即可在頻域進行影像處理,根據傅里葉變換的對稱性以及從低頻到高頻的排列規則,影像原始頻域影像會在四角形成低頻分量區,而形成高頻中心,通常為了觀察方便,變換演算法(例如Matlab中的fftshift)會將低頻分量移動到影像中心形成低頻中心
影像傅里葉變換代碼如下
# 傅里葉變換
dft = cv2.dft(np.float32(grayImg), flags = cv2.DFT_COMPLEX_OUTPUT)
# 將影像中的低頻部分移動到影像的中心
dftShift = np.fft.fftshift(dft)
# 計算幅頻特性
magnitude = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))
plt.subplot(121), plt.imshow(grayImg, cmap = 'gray')
plt.title('原圖'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude, cmap = 'gray')
plt.title('頻譜圖'), plt.xticks([]), plt.yticks([])
plt.show()
3.1 低通濾波
# 定義濾波掩碼
def mask(img, ftype):
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得影像的中心點位置
# 低通
if ftype == 'low':
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# 高通
if ftype == 'high':
mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0
return mask
lowImg = dftShift * mask(grayImg, 'low')
lowImg = np.fft.ifftshift(lowImg)
lowImg = cv2.idft(lowImg)
lowImg = cv2.magnitude(lowImg[:, :, 0], lowImg[:, :, 1])

3.2 高通濾波
# 定義濾波掩碼
def mask(img, ftype):
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得影像的中心點位置
# 低通
if ftype == 'low':
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# 高通
if ftype == 'high':
mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0
return mask
highImg = dftShift * mask(grayImg, 'high')
highImg = np.fft.ifftshift(highImg)
highImg = cv2.idft(highImg)
highImg = cv2.magnitude(highImg[:, :, 0], highImg[:, :, 1])

完整代碼關注下方公眾號回復 CV002 獲取
🚀 計算機視徑訓礎教程說明
章號 內容
0 色彩空間與數字成像
1 計算機幾何基礎
2 影像增強、濾波、金字塔
3 影像特征提取
4 影像特征描述
5 影像特征匹配
6 立體視覺
7 專案實戰
🔥 更多精彩專欄:
- 《機器人原理與技術》
- 《計算機視覺教程》
- 《機器學習》
- 《嵌入式系統》
- 《數值優化方法》
- …
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/431476.html
標籤:AI

