[opencv自学笔记]图像滤波

1、均值滤波(cv2.blur)

给一个模板,一般都是奇数乘奇数的模板,用平均值来代替这个像素点。

import cv2  
img = cv2.imread('01.jpg')  
blur = cv2.blur(img,(5,5))  
cv2.imshow("blur",blur)  
cv2.waitKey() 

2、中值滤波(cv2.medianBlur)

用模板的中位数来代替像素点

import cv2  
img = cv2.imread('01.jpg')  
median= cv2.medianBlur(img,5)  
cv2.imshow("median",median)  
cv2.waitKey() 

3、高斯滤波(cv2.GaussianBlur)

高斯噪声是指噪声的概率分布是高斯分布的,如下图
这里写图片描述
这里写图片描述

  理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核。实际上,仅需要取均值周围3倍标准差内的值,以外部份直接去掉即可。 如下图为一个标准差为1.0的整数值高斯核。
这里写图片描述
  高斯函数具有五个重要的性质,这些性质使得它在早期图像处理中特别有用.这些性质表明,高斯平滑滤波器无论在空间域还是在频率域都是十分有效的低通滤波器,且在实际图像处理中得到了工程人员的有效使用.高斯函数具有五个十分重要的性质,它们是:

  (1)二维高斯函数具有旋转对称性,即滤波器在各个方向上的平滑程度是相同的.一般来说,一幅图像的边缘方向是事先不知道的,因此,在滤波前是无法确定一个方向上比另一方向上需要更多的平滑.旋转对称性意味着高斯平滑滤波器在后续边缘检测中不会偏向任一方向.

  (2)高斯函数是单值函数.这表明,高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的.这一性质是很重要的,因为边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真.

  (3)高斯函数的傅立叶变换频谱是单瓣的.正如下面所示,这一性质是高斯函数付立叶变换等于高斯函数本身这一事实的直接推论.图像常被不希望的高频信号所污染(噪声和细纹理).而所希望的图像特征(如边缘),既含有低频分量,又含有高频分量.高斯函数付立叶变换的单瓣意味着平滑图像不会被不需要的高频信号所污染,同时保留了大部分所需信号.

  (4)高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带就越宽,平滑程度就越好.通过调节平滑程度参数σ,可在图像特征过分模糊(过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量(欠平滑)之间取得折衷.

  (5)由于高斯函数的可分离性,较大尺寸的高斯滤波器可以得以有效地实现.二维高斯函数卷积可以分两步来进行,首先将图像与一维高斯函数进行卷积,然后将卷积结果与方向垂直的相同一维高斯函数卷积.因此,二维高斯滤波的计算量随滤波模板宽度成线性增长而不是成平方增长.
  
  高斯滤波后图像被平滑的程度取决于标准差。它的输出是领域像素的加权平均,同时离中心越近的像素权重越高。因此,相对于均值滤波它的平滑效果更柔和,而且边缘保留的也更好。高斯滤波被用作为平滑滤波器的本质原因是因为它是一个低通滤波器,见下图。而且,大部份基于卷积平滑滤波器都是低通滤波器

import cv2  
img = cv2.imread('01.jpg')  
# GaussianBlur的第三个参数sigmaX是标准差,可以影响模糊效果。
# sigmaX小,表现在高斯曲线上就是曲线越高越尖,表现在滤波效果上就是模糊程度小;
# sigmaX大,表现在高斯曲线上就是曲线越矮越平缓,表现在滤波效果上就是模糊程度大;
gauss = cv2.GaussianBlur(img,(5,5),1)  
cv2.imshow("blur",gauss)  
cv2.waitKey() 

4、双边滤波(cv2.bilateralFilter)

函数cv2.bilateralFilter() 能在保持边界清晰的情况下有效的去除噪音。但是这种操作与其他滤波器相比会比较慢。我们已经知道高斯滤波器是求中心点邻近区域像素的高斯加权平均值。这种高斯滤波器只考虑像素之间的空间关系,而不会考虑像素值之间的关系(像素的相似度)。所以这种方法不会考虑一个像素是否位于边界。因此边界也会别模糊掉,而这正不是我们想要。
双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。
OpenCV在Python中双边滤波函数是cv2.bilateralFilter()。

bilateralFilter(src, d, sigmaColor, sigmaSpace)函数有四个参数需要,d是领域的直径,sigmaColor和sigmaSpace是灰度值相似性高斯函数标准差和空间高斯函数标准差。

import cv2  
img = cv2.imread('01.jpg')  
shuangBian = cv2.bilateralFilter(img,7,50,50)  
cv2.imshow("shuangBian",shuangBian)  
cv2.waitKey()  

猜你喜欢

转载自blog.csdn.net/tsfx051435adsl/article/details/78911448