1 引言

在数字图像处理中,图像滤波是一项基础而重要的技术。它能够去除图像中的噪声、提升图像质量,或者是为图像分析和理解做准备。接下来,我们将深入了解图像滤波的概念、计算过程,并通过一个实际的代码示例来展示如何使用Python和OpenCV库执行图像滤波。

2 图像滤波的概念

图像滤波指的是对图像进行某种变换,以达到增强或抑制某些特征的目的。根据不同的需求,图像滤波可以用于平滑图像、去除噪声、锐化图像边缘等。
在数学上,滤波操作通常表示为原始图像与滤波核的卷积。根据滤波核的不同,可以实现各种不同的滤波效果,如中值滤波、均值滤波、高斯滤波等。
值得一提的是,卷积神经网络(CNN)在本质上也采用了滤波的思想来提取图像的特征模式。只不过传统滤波方法采用的是固定的滤波核,而卷积神经网络的滤波核(卷积核)参数在初始时是未知的,它们会通过海量数据的训练和网络的反向传播获得。

3 滤波计算

滤波的计算过程基本可以分为三个步骤:
1、定义滤波核:确定滤波类型及核的大小.常见的滤波类型有均值滤波、中值滤波、高斯滤波等,常见的核大小有3*3。
2、边缘处理:滤波计算需要在每个像素的一定邻域范围内进行,为了图像边缘像素能够正常计算,需要采用一定的方式对图像边缘像素进行填充。
3、遍历计算:将滤波核中心对准图像内的每一个像素点。对滤波核覆盖的每个区域,将核内各元素与其覆盖的图像像素值进行对计算,最终得到的数值将作为当前核中心位置像素的新值。直至整个图像遍历完毕。

计算过程示例

下面展示一个滤波计算的过程示例,我们对一个8∗88*888的图像进行一次3∗33*333中值滤波计算。左侧为原始图像,右侧为中值滤波计算结果。
在这里插入图片描述
在上述计算过程中,遵循了三步计算法则,

  • 第一步:定义滤波核
    这里采用的是3∗33*333的中值滤波器。中值滤波器在计算方式为,对于每个邻域集合,将其中的像素值按升序或降序排列,根据排序后的像素值,确定中间位置的数值作为中值,并替换原始位置的像素值。
  • 第二步:边缘处理
    针对3∗33*333大小的滤波核,图像的首行、末行、首列、末列的像素值在计算时没有足够的像素进行运算,此时需要对图像进行填充。
    在这里插入图片描述
    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*333范围内的所有像素值,由于使用的是中值滤波器,将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)
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐