图像滤波
圖像濾波,可以對圖像進行增強(提取圖像特征),或對圖像進行平滑(降噪、模糊)。
文章目錄
- 濾波器分類
- boxblur 方框濾波
- blur 均值濾波
- GaussianBlur 高斯濾波
- medianBlur 中值濾波
- bilateralFilter 雙邊濾波
- 使用openCV進行圖像濾波
濾波器分類
-
低通濾波器:允許低頻率像素通過(去噪、模糊)
-
高通濾波器:允許高頻率像素通過(邊緣檢測、銳化)
線性濾波器:每個像素的輸出值是一些輸入像素的加權和,易于從頻率響應角度來進行分析,如:
-
方框濾波:cv2.boxblur函數
-
均值濾波:cv2.blur函數
-
高斯濾波:cv2.GaussianBlur函數
非線性濾波,濾波速度相對較慢,有時可以達到更好的實現效果,如:
-
中值濾波:cv2.medianBlur函數
-
雙邊濾波:cv2.bilateralFilter函數
boxblur 方框濾波
用于計算每個像素鄰域內的積分特性。方框濾波所用到的核:
h=α[11...111...1........11...1]h = \alpha \begin{bmatrix} 1 & 1 & ... & 1\\ 1 & 1 & ... & 1\\ ..& .. & .. & ..\\ 1 & 1 & ... & 1 \end{bmatrix}h=α?????11..1?11..1?...........?11..1??????
其中:
α={1kSize.width×kSize.heightnormalize=True1otherwise}\alpha = \begin{Bmatrix} \frac{1}{kSize.width \times kSize.height} & normalize = True\\ 1 & otherwise \end{Bmatrix}α={kSize.width×kSize.height1?1?normalize=Trueotherwise?}
當normalize(歸一化)為true時,方框濾波也就成了均值濾波。
函數原型如下:
參數:
-
src:輸入圖像,即源圖像,函數對通道是獨立處理的,且可以處理任意通道數的圖片
-
ddepth:出圖像的深度,-1代表使用原圖深度
-
ksize:卷積核的大小,Size( w,h )
-
dst:輸出目標圖像
-
anchor:錨點(即被平滑的那個點),默認值Point(-1,-1),負值表示取核的中心為錨點
-
normalize:是否歸一化(normalized),默認值為true
-
borderType:用于推斷圖像外部像素的某種邊界模式,默認值BORDER_DEFAULT
返回:輸出目標圖像
blur 均值濾波
使用鄰域像素均值進行濾波,在圖像去噪的同時也破壞了圖像的細節部分,使圖像變得模糊。
函數原型如下:
def blur(src, ksize, dst=None, anchor=None, borderType=None)參數:
-
src:輸入圖像,即源圖像,函數對通道是獨立處理的,且可以處理任意通道數的圖片
-
ksize:卷積核的大小,Size( w,h )
-
dst:輸出目標圖像
-
anchor:錨點(即被平滑的那個點),默認值Point(-1,-1),負值表示取核的中心為錨點
-
borderType:用于推斷圖像外部像素的某種邊界模式,默認值BORDER_DEFAULT
返回:輸出目標圖像
GaussianBlur 高斯濾波
采用離散化的高斯函數產生歸一化的高斯核,基于高斯核函數對圖像灰度矩陣的每一點進行加權求和,對于抑制服從正態分布的噪聲非常有效。
函數原型如下:
def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)參數:
-
src:輸入圖像,即源圖像,函數對通道是獨立處理的,且可以處理任意通道數的圖片
-
ksize:卷積核的大小,Size( w,h ),w,h為正奇數,可以不同
-
sigmaX:表示高斯核函數在X方向的的標準偏差,double類型
-
dst:輸出目標圖像
-
sigmaY:表示高斯核函數在Y方向的的標準偏差,double類型
-
borderType:用于推斷圖像外部像素的某種邊界模式,默認值BORDER_DEFAULT
返回:輸出目標圖像
若sigmaY為零,則sigmaY=sigmaX,若sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height計算出來
正態分布:
正態分布的密度函數叫做"高斯函數"(Gaussian function)。它的一維形式是:
f(x)=1σ2πe?(x?μ)22σ2f(x)=\frac{1}{\sigma \sqrt{2\pi}}e^{-\frac{(x-\mu )^2}{2\sigma^2}}f(x)=σ2π?1?e?2σ2(x?μ)2?
其中,μμμ是xxx的均值,σσσ是xxx的方差。計算平均值的時候,中心點為原點時,μμμ等于0:
f(x)=1σ2πe?x22σ2f(x)=\frac{1}{\sigma \sqrt{2\pi}}e^{-\frac{x^2}{2\sigma^2}}f(x)=σ2π?1?e?2σ2x2?
根據一維高斯函數,可以推導得到二維高斯函數:
G(x,y)=12πσ2e?x2+y22σ2G(x,y)=\frac{1}{ 2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}}G(x,y)=2πσ21?e?2σ2x2+y2?
有了這個函數 ,就可以計算每個點的權重了。
medianBlur 中值濾波
用鄰域灰度的中值進行濾波,在去除脈沖/椒鹽噪聲的同時還能保留圖像的細節部分,花費時間是均值濾波的5倍以上,但其在噪聲的消除能力上更強。對一些細節多,特別是線、尖頂等細節多的圖像不宜采用中值濾波。
函數原型如下:
def medianBlur(src, ksize, dst=None)參數:
-
src:輸入 1、3或者4通道的圖像
-
ksize:孔徑的線性尺寸,值為大于1的正奇數
-
dst:輸出目標圖像
返回:輸出目標圖像
bilateralFilter 雙邊濾波
使用空間鄰近度和灰度相似度進行濾波,比高斯濾波多了一個高斯方差sigma-d,是基于空間分布的高斯濾波函數,達到保留邊緣且去除噪聲的目的。具有簡單、非迭代、局部的特點。但是由于保存了過多的高頻信息,對于彩色圖像里的高頻噪聲,雙邊濾波器不能夠干凈的濾掉,只能夠對于低頻信息進行較好的濾波。
函數原型如下:
def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)參數:
-
src:輸入圖像,即源圖像,函數對通道是獨立處理的,且可以處理任意通道數的圖片
-
d:表示在過濾過程中每個像素鄰域的直徑
-
sigmaColor:顏色空間濾波器的sigma值。值越大,表明該像素鄰域內有更寬廣的顏色會被混合到一起,產生較大的半相等顏色區域。
-
sigmaSpace:坐標空間中濾波器的sigma方差值,數值越大,意味著越遠的像素會相互影響,從而使更大的區域足夠相似的顏色獲取相同的顏色。當d>0,d指定了鄰域大小且與sigmaSpace無關。否則,d正比于sigmaSpace。
-
dst:輸出目標圖像
-
borderType:用于推斷圖像外部像素的某種邊界模式,默認值BORDER_DEFAULT
返回:輸出目標圖像
使用openCV進行圖像濾波
import cv2def smoothing(k):if k % 2 == 0:returnbox = cv2.boxFilter(gray, -1, (k, k))blur = cv2.blur(gray, (k, k))gaussian = cv2.GaussianBlur(gray, (k, k), 0)median = cv2.medianBlur(gray, k, 0)bilateral = cv2.bilateralFilter(gray, k, k*2, k/2)cv2.imshow('box', box)cv2.moveWindow('box', 650, 40)cv2.imshow('blur', blur)cv2.moveWindow('blur', 1200, 40)cv2.imshow('gaussian', gaussian)cv2.moveWindow('gaussian', 20, 400)cv2.imshow('median', median)cv2.moveWindow('median', 650, 400)cv2.imshow('bilateral', bilateral)cv2.moveWindow('bilateral', 1200, 400)cv2.namedWindow('filter demo') cv2.moveWindow('filter demo',20,20) img = cv2.imread("/home/blue/Ivy/data/haar/VehicleDataset/train/91_frame.png") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imshow('filter demo', img)ksize = 3 cv2.createTrackbar('ksize', 'filter demo', ksize, 25, smoothing)smoothing(ksize) if cv2.waitKey(0) == 27:cv2.destroyAllWindows()濾波器 kSize=5kSize=5kSize=5 時:
濾波器 kSize=9kSize=9kSize=9 時:
濾波器 kSize=25kSize=25kSize=25 時:
濾波后,進行邊緣檢測,濾波器 kSize=5kSize=5kSize=5 時:
濾波器 kSize=9kSize=9kSize=9 時:
總結
- 上一篇: MeanShift 目标跟踪
- 下一篇: 卷积层 convolutional ne