【Python】OpenCV图像滤波计算
在数字图像处理中,图像滤波是一项基础而重要的技术。它能够去除图像中的噪声、提升图像质量,或者是为图像分析和理解做准备。接下来,我们将深入了解图像滤波的概念、计算过程,并通过一个实际的代码示例来展示如何使用Python和OpenCV库执行图像滤波。
1 引言
在数字图像处理中,图像滤波是一项基础而重要的技术。它能够去除图像中的噪声、提升图像质量,或者是为图像分析和理解做准备。接下来,我们将深入了解图像滤波的概念、计算过程,并通过一个实际的代码示例来展示如何使用Python和OpenCV库执行图像滤波。
2 图像滤波的概念
图像滤波指的是对图像进行某种变换,以达到增强或抑制某些特征的目的。根据不同的需求,图像滤波可以用于平滑图像、去除噪声、锐化图像边缘等。
在数学上,滤波操作通常表示为原始图像与滤波核的卷积。根据滤波核的不同,可以实现各种不同的滤波效果,如中值滤波、均值滤波、高斯滤波等。
值得一提的是,卷积神经网络(CNN)在本质上也采用了滤波的思想来提取图像的特征模式。只不过传统滤波方法采用的是固定的滤波核,而卷积神经网络的滤波核(卷积核)参数在初始时是未知的,它们会通过海量数据的训练和网络的反向传播获得。
3 滤波计算
滤波的计算过程基本可以分为三个步骤:
1、定义滤波核:确定滤波类型及核的大小.常见的滤波类型有均值滤波、中值滤波、高斯滤波等,常见的核大小有3*3。
2、边缘处理:滤波计算需要在每个像素的一定邻域范围内进行,为了图像边缘像素能够正常计算,需要采用一定的方式对图像边缘像素进行填充。
3、遍历计算:将滤波核中心对准图像内的每一个像素点。对滤波核覆盖的每个区域,将核内各元素与其覆盖的图像像素值进行对计算,最终得到的数值将作为当前核中心位置像素的新值。直至整个图像遍历完毕。
计算过程示例
下面展示一个滤波计算的过程示例,我们对一个8∗88*88∗8的图像进行一次3∗33*33∗3中值滤波计算。左侧为原始图像,右侧为中值滤波计算结果。
在上述计算过程中,遵循了三步计算法则,
- 第一步:定义滤波核
这里采用的是3∗33*33∗3的中值滤波器。中值滤波器在计算方式为,对于每个邻域集合,将其中的像素值按升序或降序排列,根据排序后的像素值,确定中间位置的数值作为中值,并替换原始位置的像素值。 - 第二步:边缘处理
针对3∗33*33∗3大小的滤波核,图像的首行、末行、首列、末列的像素值在计算时没有足够的像素进行运算,此时需要对图像进行填充。
cv2中默认的填充方式为cv2.BORDER_REFLECT_101,即反射填充模式,它会根据图像内部的像素值以对称的方式对边界进行填充。我们以一个一维数组 [a, b, c, d, e] 为例,假设需要在数组的左右两侧各填充 2 个元素,经过填充后的数组变为 [c, b, a, b, c, d, e, d, c]。
上图为图像填充后的效果。
arr0 = np.random.randint(0, 255, size=(8, 8), dtype=np.uint8)
arr1 = cv2.copyMakeBorder(arr0, 1, 1, 1, 1, cv2.BORDER_REFLECT_101) # 边缘填充
- 第三步:遍历计算
针对边缘处理后的图像,再使用滤波核依次进行计算,获取每个核中心位置像素的值,例如在对原始图像第一行,第一列的像素进行计算时,首先以该像素为中心,获取3∗33*33∗3范围内的所有像素值,由于使用的是中值滤波器,将9个像素值进行排序,取中间位置的值作为计算结果。
排序前:[166, 117, 166, 10, 172, 10, 166, 117, 166]
排序后:[10, 10, 117, 117, 166, 166, 166, 166, 172]
获取中值为166。
4 不同滤波类型
上述示例展示了中值滤波的方法和效果,实际还包括其他的滤波计算方法,常见的有均值滤波、高斯滤波等。下面介绍每种滤波的方法及其优劣。
4.1 中值滤波
原理:中值滤波是一种基于排序统计的非线性滤波方法。
优点:高效抑制椒盐噪声:对脉冲噪声(如黑白噪点)。
缺点:在细节密集区域(如纹理)可能产生失真。
适用场景:如扫描文档、监控摄像头图像。
4.2 均值滤波
原理:均值滤波是一种基础的线性滤波方法,其核心思想是通过计算像素邻域内的平均值来平滑图像。
优点:计算简单、对椒盐噪声有一定抑制作用
缺点:易造成图像模糊,丢失边缘信息
适用场景:低噪声图像的初步平滑处理
4.3 高斯滤波
高斯滤波是一种加权均值滤波,通过高斯核赋予邻域像素不同权重。
优点:保留边缘信息、符合人眼视觉特性
缺点:计算复杂度较高
适用场景:图像降噪、边缘检测预处理(如 Canny 算法)
5 滤波效果对比

6 代码
in_path = r'./image.png'
image = cv2.imread(in_path)
# 均值滤波
mean_filtered = cv2.blur(image, (5, 5))
# 中值滤波
median_filtered = cv2.medianBlur(image, 5)
# 高斯滤波
gaussian_filtered = cv2.GaussianBlur(image, (5, 5), 0)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)