滤波实际上是信号处理里的一个概念,而图像本身也可以看成是一个二维的信号。
其中像素点灰度值的高低代表信号的强弱。
高频:图像中灰度变化剧烈的点。
低频:图像中平坦的,灰度变化不大的点。
根据图像的高频与低频的特征,我们可以设计相应的高通与低通滤波器。
- 高通滤波:可以检测图像中尖锐、变化明显的地方(锐化图像)
- 低通滤波:可以让图像变得光滑,滤除图像中的噪声(平滑图像)
线性滤波
均值模糊
不能很好的保留图像的细节。
dst = cv.blur(src, ksize)
ksize - 用于平滑操作的核的大小。
(1, 15)水平模糊, 1*15的矩阵
(15, 1)垂直模糊
dst = cv.blur(image, (30, 1))
blur()平滑图像的函数,它用一个点邻域内像素的平均灰度值来代替该点的灰度
平滑模糊、高斯模糊这两个滤波器,都是邻域内的像素按照一个权重相加,最后设置为当前点的灰度值,这种操作又称为卷积。
这样的滤波器叫线性滤波器,另外还有一种非线性的滤波器,比如中值滤波器,它是取邻域内所有像素的中值作为当前点的灰度值。
高斯模糊
高斯滤波是指用高斯函数作为滤波函数的滤波操作,高斯模糊就是高斯低通。越靠近该像素的点提供越高的权重,计算平均值作为插值。
ksize高斯内核的大小,其中ksize.height和size.width可以不同,但是必须为正数&&奇数,或者是0(由sigma计算而来)
double类型的sigmaX,表示高斯核函数在X轴方向的标准偏差。
double类型的sigmaY,表示高斯核函数在Y轴方向的标准偏差。
若为0则设为sigmaX;两者都为0则由ksize.height和size.width计算出来。
高斯随机噪声图片:
numpy.random.normal(loc=0.0, scale=1.0, size=None)
loc:float此概率分布的均值(对应着整个分布的中心centre)
scale:float此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
非线性滤波
中值滤波
https://blog.csdn.net/weixin_37720172/article/details/72627543
取邻域内所有像素的中值作为当前点的灰度值。
可用于去掉椒盐噪声,脉冲噪声,又能保留图像的边缘细节。
(花费时间是均值滤波的五倍以上)对细节(细、尖顶)很多的图像不太合适。
dst = cv.medianBlur(image, 5)
ksize参数表示滤波窗口尺寸,必须是奇数并且大于1。比如这里是5,中值滤波器就会使用5×5的范围来计算,即对像素的中心值及其5×5邻域组成了一个数值集,对其进行处理计算,当前像素被其中值替换掉。
双边滤波
Bilateral filter结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性。
- edge preserving
比高斯滤波多了一个高斯方差sigma-d
边缘保留滤波Edge Preserving Filter
高斯双边
差异很大,就是显著特征,会被平滑掉
双边滤波函数
可以在保证边界清晰的情况下,有效的去掉噪声。考虑了图像空间关系,也考虑了灰度关系。双边滤波同时使用了空间高斯权重、灰度相似性高斯权重,确保了边界不会被模糊掉。
cv2.bilateralFilter(img,d,’p1’,’p2’)
d是领域的直径,
空间高斯函数标准差
灰度值相似性高斯函数标准差
用户自定义模糊
dst = cv.filter2D(src, ddepth, kernel)
ddepth
表示目标图像深度,输入值为-1时,目标图像和原图像深度保持一致
kernel
卷积核(或者是相关核),一个单通道浮点型矩阵。修改kernel矩阵即可实现不同的模糊。
https://www.cnblogs.com/hihilary/archive/2012/11/27/2777973.html
通道表示每个点能存放多少个数,类似于BGR彩色图中的每个像素点有三个值,即三通道的。
图片中的深度表示每个值由多少位来存储,是一个精度问题,一般图片是8bit(位)的,则深度是8。
def customer_blur_demo(image):
# kernel = np.ones([5, 5], np.float32)/25
# [0, -1, 0], [-1, 5, -1], [0, -1, 0]
# [1, 1, 1], [1, 1, 1], [1, 1, 1]/9
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
dst = cv.filter2D(image, -1, kernel)
cv.imshow("customer_blur", dst)