OpenCV 中的滤波操作用于去除图像噪声,实现图像的平滑处理,改善图像质量或提取有用的信息。使用一张有噪声的图像作为示例
均值滤波
均值滤波是一种简单的线性滤波技术,通过将像素点周围邻域内的所有像素值取平均来达到平滑图像的效果,可以用来减少噪声。opencv中均值滤波使用方法blur,其函数原型如下:
cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst
参数说明
src
: 输入图像。ksize
: 滤波器窗口的大小,格式为(宽度, 高度)
。例如,(5, 5)
表示一个 5x5 的滤波器窗口。dst
: 输出图像。如果未指定,则默认与输入图像具有相同的类型和大小。anchor
: 锚点位置,默认为(-1, -1)
,表示锚点位于滤波器窗口的中心。- borderType: 边界填充方式,默认为cv2.BORDER_DEFAULT。常见的边界填充方式有:
cv2.BORDER_CONSTANT
: 用常数值填充边界。cv2.BORDER_REFLECT
: 用镜像反射的方式填充边界。cv2.BORDER_REPLICATE
: 用边界像素值重复填充边界。cv2.BORDER_WRAP
: 用环绕方式填充边界。
# 均值滤波 类似于平均卷积
blur = cv2.blur(img,(3,3))
cv_show('blur',blur)
运行结果:
高斯滤波
高斯滤波也是一种平滑滤波器,但它使用的是高斯权重矩阵,这样可以使滤波效果更加自然,对边缘信息的保留也更好。相当于选取一个像素点,其周围像素距离越近权重越高。高斯滤波在opencv中使用方法gaussian实现,其函数原型如下:
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst
参数说明
src
: 输入图像。ksize
: 滤波器窗口的大小,格式为(宽度, 高度)
。例如,(5, 5)
表示一个 5x5 的滤波器窗口。sigmaX
: 高斯核在 X 方向上的标准差。如果设置为 0,OpenCV 会根据ksize
自动计算。dst
: 输出图像。如果未指定,则默认与输入图像具有相同的类型和大小。sigmaY
: 高斯核在 Y 方向上的标准差。如果未指定,则默认等于sigmaX
。- borderType: 边界填充方式,默认为cv2.BORDER_DEFAULT。常见的边界填充方式有:
cv2.BORDER_CONSTANT
: 用常数值填充边界。cv2.BORDER_REFLECT
: 用镜像反射的方式填充边界。cv2.BORDER_REPLICATE
: 用边界像素值重复填充边界。cv2.BORDER_WRAP
: 用环绕方式填充边界。
#高斯滤波,相当于在均值滤波的基础上添加了权重,离中心点越近,权重越高,1 为标准差
gaussian = cv2.GaussianBlur(img,(5,5),1)
cv_show('gaussian',gaussian)
中值滤波
中值滤波是非线性的滤波方法,主要用于去除椒盐噪声。它的工作原理是用邻域内所有像素值的中位数替换中心像素值。中值滤波在opencv中使用medianBlur方法,其函数原型如下:
cv2.medianBlur(src, ksize[, dst]) -> dst
参数说明
src
: 输入图像。ksize
: 滤波器窗口的大小,必须是大于 1 的奇数。例如,5
表示一个 5x5 的滤波器窗口。dst
: 输出图像。如果未指定,则默认与输入图像具有相同的类型和大小。
# 中值滤波,围绕中心点的数据中从大到小排序,取中值
median = cv2.medianBlur(img,5)
cv_show('median',median)
上述三种方法各有不同,让我们将这些结果放到一起进行对比观察一下,因为opencv所有的图像信息都是numpy数组,在此处使用numpy进行拼接展示
# 对比展示所有图片
res = np.hstack((blur,gaussian,median))
cv_show("res",res)