首先看以下图,图像平滑(模糊)只是滤波中的一种操作,并不是整个滤波部分。
一、均值滤波
函数:
dst = cv.blur( src, ksize[, dst[, anchor[, borderType]]] )
src
:输入图像;ksize
: 卷积核大小;anchor
: 锚点位置设置,默认为卷积核的中心位置;borderType
: 边界填充方法。 均值滤波是一种线性滤波器,处理思路也很简单,就是将一个窗口区域中的像素计算平均值,然后将窗口中计算得到的均值设置为锚点上的像素值。该算法有优点在于效率高,思路简单。同样,缺点也很明显,计算均值会将图像中的边缘信息以及特征信息“模糊”掉,会丢失很多特征。
例如使用3*3卷积核如下所示:
k e r n e l = [ 1 1 1 1 1 1 1 1 1 ] kernel= \left[ \begin{matrix} 1 & 1 & 1\\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right] kernel=⎣⎡111111111⎦⎤
代码演示:
img_lena = cv.imread("./img/lenaNoise.png")
# 均值滤波blur(src, ksize[, dst[, anchor[, borderType]]])
# ksize : 卷积核大小, anchor:需要进行替换值的锚点, borderType: 边界填充方法
def img_show(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
blur = cv.blur(img_lena, (3,3))
#将原图像拼接进行比较
connect = np.hstack((img_lena, blur))
img_show("blur", connect)
二、方框滤波
方框滤波类似于均值滤波,不过在进行卷积核计算之后进行了归一化的操作。
例如使用3*3的卷积核:
k e r n e l = α [ 1 1 1 1 1 1 1 1 1 ] , α = { 1 k s i z e . w i d t h ∗ k s i z e . h e i g h t , 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 kernel=α \left[ \begin{matrix} 1 & 1 & 1\\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right] , α = \begin{cases} \frac{1}{ksize.width*ksize.height}& ,normalize=true\\ 1 & ,normalize=false\\ \end{cases} kernel=α⎣⎡111111111⎦⎤,α={ksize.width∗ksize.height11,normalize=true,normalize=false
函数:
dst = cv.boxFilter( src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]] )
ddepth
:图像深度(图像深度是指存储每个像素所用的位数),-1表示和原图像的颜色深度相同。代码示例:
boxFilter1 = cv.boxFilter(img_lena, -1, (3,3), normalize=True)
boxFilter2 = cv.boxFilter(img_lena, -1, (3,3), normalize=False)
connect = np.hstack((img_lena, boxFilter1, boxFilter2))
img_show("boxFilter", connect)
三、高斯滤波
高斯卷积核使用高斯函数,具体步骤参考:https://www.jianshu.com/p/73e6ccbd8f3f
函数:
dst = cv.GaussianBlur( src, ksize, sigmaX[, dst[, sigmaY=0[, borderType]]] )
sigmaX
:X轴方向上的标准差。#高斯滤波又称为高斯模糊,其卷积核满足高斯分布,即越靠近中心点的权重越大
GaussianBlur = cv.GaussianBlur(img_lena, (5,5), 1)
connect = np.hstack((img_lena, GaussianBlur))
img_show("gaussian", connect)
四、中值滤波
中值滤波是一种典型的非线性滤波,是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法在取出脉冲噪声、椒盐噪声的同时能保留图像的边缘细节。这些优良特性是线性滤波所不具备的。
函数:
dst = cv.medianBlur( src, ksize[, dst] )
Note:卷积核大小必须是奇数且大于1,例如:3,5,7...
代码示例:
medianblur = cv.medianBlur(img_lena, 5)
connect = np.hstack((img_lena, medianblur))
img_show("medianblur", connect)