OpenCV图像滤波详解:均值、方框、高斯与中值滤波

白榆
白榆
发布时间:2026-10-14 | 2人浏览过
原创

本文深入解析OpenCV中四种基础图像滤波技术:均值、方框、高斯及中值滤波。详细阐述各算法原理,包括核大小、归一化参数及方差控制对图像处理效果的影响。通过Python代码示例,展示如何有效去除图像噪声并提取特征,适用于计算机视觉初学者及开发者参考。

图像滤波概述与目的

在图像处理流程中,滤波是至关重要的预处理步骤。

图像平滑化,亦称滤波,旨在消除图像中的噪声成分。通常情况下,信号或图像的能量主要分布在幅度谱的低频和中频段,而高频段往往被噪声所掩盖。因此,通过降低高频成分幅度的滤波器,可以有效减弱噪声干扰,提升图像质量。


图像滤波主要服务于两个目的:一是提取对象的特征,作为图像识别的特征模式;二是消除图像在数字化过程中混入的噪声,以满足后续图像处理的要求。

OpenCV滤波算法详解

接下来,我们将结合Python和OpenCV库,详细讲解几种常见的滤波方法。

均值滤波原理与实现

均值滤波是图像平滑处理中最基础的方法之一。

其核心思想是:若要处理图像中的某一点(如红色点),该点的新像素值等于其周围N×N邻域内所有像素值(包含自身)的平均值。这种处理方式通过平均化来平滑图像。


从数学表达式来看,均值滤波是对邻域像素求算术平均的过程。


将这一原理应用于整幅图像,即可实现全局的均值滤波效果。


在OpenCV中,实现均值滤波的方法是使用cv2.blur()函数。调用格式为:处理结果=cv2.blur(原始图像, 核大小)。

其中,核大小以(width, height)的元组形式指定。该滤波器的主要效果是使图像变得模糊,能够有效处理受到椒盐噪声攻击的照片,通过平均化降低噪声点的显著性。


import cv2
a=cv2.imread('lenacolor.png')#
b=cv2.blur(a,(8,8))
cv2.imshow('original',a)
cv2.imshow('result',b)
cv2.waitKey(0)
cv2.destroyAllWindows()

方框滤波与归一化控制

方框滤波是另一种常见的线性滤波方法,与均值滤波有相似之处但也有区别。

实现方框滤波需使用cv2.boxFilter()函数。调用格式为:处理结果=cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性)。

参数说明如下:目标图像深度为int类型,若设为-1则表示输出图像深度与原始图像一致;核大小同样为(width, height)元组;normalize属性决定了对目标图像是否进行归一化处理。当normalize为true时,方框滤波的效果与均值滤波相同;若为false,则输出像素值为周围像素值的直接求和,这可能导致数值溢出超过255的情况。


当设置normalize=1(即true)时,滤波过程包含归一化步骤。


import cv2
a=cv2.imread('lenacolor.png')#
b=cv2.boxFilter(a,-1,(5,5),normalize=1)
cv2.imshow('original',a)
cv2.imshow('result',b)
cv2.waitKey(0)
cv2.destroyAllWindows()

此时的处理结果图像看起来较为平滑,类似于均值滤波的效果。


若设置normalize=0(即false),由于未进行归一化,大多数点的像素值会因累加而达到最大值(白色),只有少数边缘点保持非白色状态。


若将核大小减小至(2,2)且保持normalize=0,图像中非白色的区域会进一步减少,显示出局部累加的效果。

高斯滤波与权重分布

高斯滤波是一种加权平均滤波,能更好地保留图像边缘信息。

其含义在于:中心点的权重最高,随着距离中心点越远,权重逐渐降低。这种分布符合高斯函数的特性,能更自然地模拟图像噪声的统计特性。


在OpenCV中,实现高斯滤波需使用cv2.GaussianBlur()函数。

调用格式为:处理结果=cv2.GaussianBlur(原始图像src, 核函数大小ksize, sigmaX)。

参数说明如下:核函数大小ksize需为(N, N)形式且N必须为奇数;sigmaX控制x方向的方差,进而控制权重分布。若sigmaX设为0,OpenCV会自动根据核大小计算方差;y轴方向的方差通常与x轴保持一致。


import cv2
a=cv2.imread('lenacolor.png')#
b=cv2.GaussianBlur(a,(3,3),0)
cv2.imshow('original',a)
cv2.imshow('result',b)
cv2.waitKey(0)
cv2.destroyAllWindows()

中值滤波与噪声去除

中值滤波是一种非线性滤波方法,特别适用于去除脉冲噪声。

其原理是用像素点邻域附近像素的中值来代替该点的像素值。通俗来说,即在当前像素的左侧选取五个像素点,右侧选取五个像素点,将这些像素值进行排序,取中间大小的值(中值)来替换原像素值。

中值滤波能有效去除斑点和椒盐噪声,但其计算效率较低,运算时间通常是均值滤波的五倍以上。


在OpenCV中,实现中值滤波需使用cv2.medianBlur()函数。调用格式为:目标图像=cv2.medianBlur(原始图像, intksize)。其中intksize为核函数大小,必须为奇数。


import cv2
a=cv2.imread('lenacolor.png')#
b=cv2.medianBlur(a,5)
cv2.imshow('original',a)
cv2.imshow('result',b)
cv2.waitKey(0)
cv2.destroyAllWindows()


至此,关于OpenCV图像滤波(均值、方框、高斯、中值)的介绍已完成。如需了解更多相关OpenCV图像滤波内容,建议搜索本站过往文章或继续浏览后续相关文章。感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表