opencv基础篇 ——(八)图像平滑滤波

32 篇文章 1 订阅

均值滤波blur

        用于对图像进行均值滤波(Mean Filtering)的函数。它通过对图像中每个像素点邻域内所有像素值求平均来计算新的像素值,以此达到平滑图像、降低噪声和消除细节的目的

函数原型:

void cv::blur(
    InputArray src,
    OutputArray dst,
    Size ksize,
    Point anchor = Point(-1, -1),
    int borderType = BORDER_DEFAULT
);

参数说明:

  1. InputArray src

    • 类型:InputArray
    • 描述:输入图像,通常为 cv::Mat 类型。可以是单通道或多通道(如彩色图像)的,支持各种深度(如 8-bit、16-bit、浮点型等)。
  2. OutputArray dst

    • 类型:OutputArray
    • 描述:输出图像,与输入图像 src 具有相同的尺寸和类型。存储经过均值滤波处理后的结果。
  3. Size ksize

    • 类型:Size
    • 描述:滤波器的大小,即卷积核尺寸。它是一个包含宽度(水平方向上的像素数)和高度(垂直方向上的像素数)的结构体。例如,Size(5, 5) 表示一个 5x5 的方形滤波器。ksize 必须为正奇数,以保证滤波器中心有一个明确的位置。
  4. Point anchor

    • 类型:Point
    • 描述:滤波器的锚点(中心点)。默认值为 Point(-1, -1),表示滤波器的中心将被自动设置为 (ksize.width / 2, ksize.height / 2)。用户可以指定其他位置作为锚点,但通常情况下保持默认值即可。
  5. int borderType

    • 类型:int

    • 描述:边界填充方式。定义了如何处理图像边缘像素(当滤波器的一部分落在图像外部时)。可选值包括:

      • BORDER_CONSTANT: 填充常数值,默认为 0。
      • BORDER_REPLICATE: 复制边缘像素值。
      • BORDER_REFLECT: 反射图像边缘像素(如同镜面反射)。
      • BORDER_WRAP: 将超出边界的像素值“环绕”到另一边。
      • BORDER_REFLECT_101 或 BORDER_DEFAULT: 类似于 BORDER_REFLECT,但在边缘处进行一次额外的翻转以避免边界像素值相同。
      • 其他边界模式,如 BORDER_TRANSPARENT 或基于高级插值的方法。

    默认值为 BORDER_DEFAULT,在 OpenCV 3.x 中通常等同于 BORDER_REFLECT_101

功能与应用:

  • 平滑图像:均值滤波是一种最简单的线性滤波方法,通过计算邻域内像素的平均值来替换原像素值,能够有效减少图像中的随机噪声,使图像看起来更平滑。

  • 降噪:对于具有高斯分布的噪声(如椒盐噪声或高斯噪声),均值滤波能够有效地降低其强度,但可能会导致图像细节的损失。

  • 预处理:在进行更复杂图像分析或特征提取之前,可能先使用 cv::blur() 对图像进行预处理,以简化后续算法的输入数据。

使用示例:

cv::Mat inputImage, outputImage;
// ... (加载或处理 inputImage)

cv::Size kernelSize(3, 3); // 定义 3x3 的滤波器大小
cv::blur(inputImage, outputImage, kernelSize);

中值滤波medianBlur

        用于对图像进行中值滤波(Median Filtering)的函数。中值滤波是一种非线性的图像平滑技术,它通过取给定邻域内像素值的中位数(而不是平均值)来替代当前像素值,从而有效地抑制椒盐噪声和脉冲噪声,同时保留图像边缘和细节相较于均值滤波更为清晰。

函数原型:

void cv::medianBlur(
    InputArray src,
    OutputArray dst,
    int ksize
);

参数说明:

  1. InputArray src

    • 类型:InputArray
    • 描述:输入图像,通常为 cv::Mat 类型。可以是单通道或多通道(如彩色图像)的,但对通道数和图像深度有一定的限制(见下文说明)。
  2. OutputArray dst

    • 类型:OutputArray
    • 描述:输出图像,与输入图像 src 具有相同的尺寸和类型。存储经过中值滤波处理后的结果。
  3. int ksize

    • 类型:int
    • 描述:滤波器的大小,即卷积核尺寸。它表示邻域窗口的宽度和高度,必须为正奇数,且通常较小(如 3、5、7 等),以保持运算效率。较大的 ksize 可能会提供更强的噪声抑制能力,但也会增加计算时间和可能导致更多细节损失。

功能与特性:

  • 抗噪声:中值滤波特别擅长去除椒盐噪声和脉冲噪声,因为它直接使用中位数代替像素值,使得单个或少数离群值(如噪声像素)对结果影响较小。

  • 保持边缘:由于中值滤波不依赖于像素值的平均,所以在处理图像边缘和细节丰富的区域时,相比于均值滤波,它更能保持边缘的锐利度和细节的完整性。

  • 通道和深度限制

    • 通道数:支持单通道图像和三通道彩色图像。
    • 图像深度:当 ksize 为 3 或 5 时,图像深度应为 CV_8U(8-bit unsigned integer)、CV_16U(16-bit unsigned integer)或 CV_32F(32-bit floating-point)。对于其他 ksize 值,支持的图像深度可能有所不同,具体请查阅最新的 OpenCV 文档或源码。

使用示例:

cv::Mat inputImage, outputImage;
// ... (加载或处理 inputImage)

int kernelSize = 5; // 定义 5x5 的滤波器大小
cv::medianBlur(inputImage, outputImage, kernelSize);

高斯模糊GaussianBlur

        用于对图像进行高斯模糊(Gaussian Blurring)的函数。高斯模糊是一种常见的图像平滑技术,它通过使用高斯核(Gaussian Kernel)对图像进行卷积来减少噪声和细节。高斯核是以高斯函数为基础的权重分布,其中距离中心像素越远的邻域像素对中心像素新值的贡献越小,从而实现平滑效果。

函数原型:

void cv::GaussianBlur(
    InputArray src,
    OutputArray dst,
    Size ksize,
    double sigmaX,
    double sigmaY = 0,
    int borderType = BORDER_DEFAULT
);

参数说明:

  1. InputArray src

    • 类型:InputArray
    • 描述:输入图像,通常为 cv::Mat 类型。可以是单通道或多通道(如彩色图像)的,支持各种深度(如 8-bit、16-bit、浮点型等)。
  2. OutputArray dst

    • 类型:OutputArray
    • 描述:输出图像,与输入图像 src 具有相同的尺寸和类型。存储经过高斯模糊处理后的结果。
  3. Size ksize

    • 类型:Size
    • 描述:高斯核的大小,即卷积核尺寸。它是一个包含宽度(水平方向上的像素数)和高度(垂直方向上的像素数)的结构体。例如,Size(5, 5) 表示一个 5x5 的方形高斯核。ksize 必须为正数且可以是偶数,此时高斯核会被对称地填充到指定尺寸;也可以是奇数,此时高斯核的中心有一个明确的位置。
  4. double sigmaX

    • 类型:double
    • 描述:沿 X 轴(水平方向)的高斯核标准偏差。该值决定了高斯函数在水平方向上的扩散程度。若为 0,则由 ksize.width 自动计算得出一个适当的值。
  5. double sigmaY

    • 类型:double
    • 描述:沿 Y 轴(垂直方向)的高斯核标准偏差。与 sigmaX 类似,用于控制高斯函数在垂直方向上的扩散程度。若为 0,则默认等于 sigmaX,即假设高斯核在两个方向上具有相同的扩散程度。
  6. int borderType

    • 类型:int
    • 描述:边界填充方式。定义了如何处理图像边缘像素(当高斯核的一部分落在图像外部时)。可选值与 cv::blur() 和 cv::medianBlur() 中的 borderType 参数相同,包括 BORDER_CONSTANTBORDER_REPLICATEBORDER_REFLECTBORDER_WRAPBORDER_REFLECT_101 等。

功能与应用:

  • 平滑图像:高斯模糊通过使用高斯核对图像进行卷积,有效地平滑图像,降低噪声和消除细节,使图像看起来更柔和。

  • 预处理:在进行图像分析、特征提取、物体识别等任务前,经常使用高斯模糊作为预处理步骤,以减少图像中的高频噪声对后续算法的影响。

  • 模拟景深效果:在计算机图形学中,高斯模糊可以用来模拟景深效果,即远处的物体看起来比近处的物体更模糊。

使用示例:

cv::Mat inputImage, outputImage;
// ... (加载或处理 inputImage)

cv::Size kernelSize(5, 5); // 定义 5x5 的高斯核大小
double sigma = 1.0; // 设置高斯核的标准偏差(这里仅需指定一个值,因为 sigmaX 和 sigmaY 相同)
cv::GaussianBlur(inputImage, outputImage, kernelSize, sigma);

双边滤波bilateralFilter

        用于执行双边滤波(Bilateral Filtering)的函数。双边滤波是一种非线性滤波方法,它结合了图像的空间邻近性和像素值相似性两个因素来进行滤波。这种滤波器特别适合于保留边缘的同时去除颜色和亮度噪声。

函数原型:

void cv::bilateralFilter(
    InputArray src,
    OutputArray dst,
    int d,
    double sigmaColor,
    double sigmaSpace,
    int borderType = BORDER_DEFAULT
);

参数说明:

  1. InputArray src

    • 类型:InputArray
    • 描述:输入图像,通常为 cv::Mat 类型。可以是单通道或多通道(如彩色图像)的,支持各种深度(如 8-bit、16-bit、浮点型等)。
  2. OutputArray dst

    • 类型:OutputArray
    • 描述:输出图像,与输入图像 src 具有相同的尺寸和类型。存储经过双边滤波处理后的结果。
  3. int d

    • 类型:int
    • 描述:滤波器的直径,必须为正数且通常为奇数。它决定了邻域窗口的大小,直接影响着滤波的效果和计算复杂度。
  4. double sigmaColor

    • 类型:double
    • 描述:控制颜色相似性权重的参数。它决定了像素值差异对滤波结果的影响程度。较大的 sigmaColor 值允许更大的颜色差异,意味着滤波器对颜色变化更加不敏感,可能导致更多的平滑效果;较小的值则更注重保持颜色差异,有助于保留图像的细节和边缘。
  5. double sigmaSpace

    • 类型:double
    • 描述:控制空间邻近性权重的参数。它决定了像素位置差异对滤波结果的影响程度。较大的 sigmaSpace 值允许更大的空间距离,意味着滤波器对像素位置的变化更加不敏感,可能导致更多的平滑效果;较小的值则更注重保持空间上的连续性,有助于保留图像的边缘和细节。
  6. int borderType

    • 类型:int
    • 描述:边界填充方式。定义了如何处理图像边缘像素(当滤波器的一部分落在图像外部时)。可选值与 cv::blur() 和 cv::medianBlur() 中的 borderType 参数相同,包括 BORDER_CONSTANTBORDER_REPLICATEBORDER_REFLECTBORDER_WRAPBORDER_REFLECT_101 等。

功能与应用:

  • 边缘保持:双边滤波由于同时考虑了空间邻近性和像素值相似性,能够在平滑图像的同时较好地保持边缘信息,避免边缘被模糊或消失。

  • 去噪:对于具有颜色和亮度噪声的图像,双边滤波能够有效地去除这些噪声,同时保持图像的整体结构和细节。

  • 图像增强与预处理:在图像增强、风格迁移、图像融合等应用中,双边滤波可以作为一种预处理手段,用于平滑图像并保持边缘,为后续处理提供更高质量的输入。

使用示例:

cv::Mat inputImage, outputImage;
// ... (加载或处理 inputImage)

int diameter = 5; // 定义滤波器的直径为 5
double colorSigma = .jpg; // 控制颜色相似性权重的参数
double spaceSigma = 7.0; // 控制空间邻近性权重的参数
cv::bilateralFilter(inputImage, outputImage, diameter, colorSigma, spaceSigma);

二维卷积filter2D

        用于对图像进行二维卷积(2D Convolution)的函数。二维卷积是图像处理中的基础操作之一,它通过将一个固定大小的滤波器(Kernel)与输入图像中的每个像素及其邻域进行乘法和加权求和,生成新的像素值,以此实现图像平滑、边缘检测、锐化、特征提取等多种图像变换。

函数原型:        

void cv::filter2D(
    InputArray src,
    OutputArray dst,
    int ddepth,
    InputArray kernel,
    Point anchor = Point(-1, -1),
    double delta = 0,
    int borderType = BORDER_DEFAULT
);

参数说明:

  1. InputArray src

    • 类型:InputArray
    • 描述:输入图像,通常为 cv::Mat 类型。可以是单通道或多通道(如彩色图像)的,支持各种深度(如 8-bit、16-bit、浮点型等)。
  2. OutputArray dst

    • 类型:OutputArray
    • 描述:输出图像,与输入图像 src 具有相同的尺寸,但可以指定不同的深度(见 ddepth 参数)。存储经过二维卷积处理后的结果。
  3. int ddepth

    • 类型:int
    • 描述:输出图像的深度。可以选择与输入图像相同的深度,或者指定为不同的深度。常见的深度值如 CV_8UCV_16UCV_32F 等。若设置为 -1,表示输出图像具有与输入图像相同的深度。
  4. InputArray kernel

    • 类型:InputArray
    • 描述:二维卷积核。通常为 cv::Mat 类型,表示一个二维数组,包含了卷积过程中应用于每个像素邻域的权重。它可以是单通道的,也可以是多通道的(对应于输入图像的通道数),且其元素通常是对称分布的。
  5. Point anchor

    • 类型:Point
    • 描述:卷积核的锚点(中心点)。默认值为 Point(-1, -1),表示卷积核的中心将被自动设置为 (kernel.cols / 2, kernel.rows / 2)。用户可以指定其他位置作为锚点,但通常情况下保持默认值即可。
  6. double delta

    • 类型:double
    • 描述:添加到每个像素点滤波结果的常数值。可用于调整输出图像的整体亮度或其他属性。
  7. int borderType

    • 类型:int
    • 描述:边界填充方式。定义了如何处理图像边缘像素(当卷积核的一部分落在图像外部时)。可选值与 cv::blur() 和 cv::medianBlur() 中的 borderType 参数相同,包括 BORDER_CONSTANTBORDER_REPLICATEBORDER_REFLECTBORDER_WRAPBORDER_REFLECT_101 等。

功能与应用:

  • 通用卷积操作cv::filter2D() 函数提供了对图像进行任意二维卷积的能力,适用于各种自定义滤波器或预定义的滤波器(如 Sobel、Laplacian、Gaussian 等)。

  • 图像平滑、锐化、边缘检测:根据提供的卷积核,cv::filter2D() 可以实现图像平滑(如使用高斯核)、锐化(如使用拉普拉斯核)、边缘检测(如使用 Sobel 或 Prewitt 核)等多种图像处理任务。

  • 特征提取:在计算机视觉和机器学习中,卷积操作是许多特征提取算法(如传统的模板匹配、现代的卷积神经网络)的核心组成部分。cv::filter2D() 可以用于实现这些算法的基本卷积层。

使用示例:

cv::Mat inputImage, convKernel, outputImage;
// ... (加载或创建 inputImage, convKernel)

cv::filter2D(inputImage, outputImage, -1, convKernel);

可分离线性滤波sepFilter2D

        用于对图像进行可分离线性滤波(Separable Linear Filtering)的函数。可分离线性滤波是一种优化的图像卷积技术,它将一个二维卷积操作分解为两个一维卷积操作,分别沿水平和垂直方向进行。这种方法极大地减少了计算量,特别是在使用大型滤波核时,可以显著提高处理速度。

函数原型:

void cv::sepFilter2D(
    InputArray src,
    OutputArray dst,
    int ddepth,
    InputArray kernelX,
    InputArray kernelY,
    Point anchor = Point(-1, -1),
    double delta = 0,
    int borderType = BORDER_DEFAULT
);

功能与应用:

  • 高效滤波:可分离线性滤波通过两次一维卷积代替一次二维卷积,大大减少了计算量。特别适合于使用大尺寸滤波核(如高斯滤波器)时,能够显著提升处理速度。

  • 广泛适用:支持各种线性滤波器,如高斯滤波、拉普拉斯滤波、Sobel 导数算子等。只需提供相应的水平和垂直方向的一维卷积核即可。

  • 图像平滑、锐化、边缘检测:根据提供的卷积核,cv::sepFilter2D() 可以实现图像平滑、锐化、边缘检测等多种图像处理任务。

盒式滤波boxFilter

        用于对图像进行盒式滤波(Box Filter)的函数。盒式滤波是一种简单的线性滤波技术,它通过对图像中每个像素周围的一个矩形区域内的像素值进行平均,来计算该像素的新值。盒式滤波常用于图像平滑、噪声减少等任务。

void cv::boxFilter(
    InputArray src,
    OutputArray dst,
    int ddepth,
    Size ksize,
    Point anchor = Point(-1, -1),
    bool normalize = true,
    int borderType = BORDER_DEFAULT
);

功能与应用:

  • 图像平滑:盒式滤波通过对图像中每个像素周围区域进行平均,能够有效地平滑图像,减少噪声和消除细节,使图像看起来更柔和。

  • 简单滤波器:盒式滤波器结构简单,计算速度快,适用于对计算资源有限或者需要快速响应的应用场景。

  • 预处理:在进行图像分析、特征提取、物体识别等任务前,盒式滤波可以作为预处理步骤,以减少图像中的高频噪声对后续算法的影响。

平方盒式滤波sqrBoxFilter 

        用于对图像进行平方盒式滤波(Squared Box Filter)的函数。平方盒式滤波与常规盒式滤波(cv::boxFilter())类似,都是基于一个矩形区域内的像素值进行运算,但不同之处在于,平方盒式滤波是对该区域内像素值的平方进行平均,而不是直接取像素值的平均。这种滤波方法常用于计算图像的局部方差、能量或者其他与像素值平方相关的特性。

void cv::sqrBoxFilter(
    InputArray src,
    OutputArray dst,
    int ddepth,
    Size ksize,
    Point anchor = Point(-1, -1),
    bool normalize = true,
    int borderType = BORDER_DEFAULT
);

功能与应用:

  • 局部方差计算:平方盒式滤波可以直接用来计算图像的局部方差,这是许多图像处理和计算机视觉任务中的重要特征。将平方盒式滤波的结果减去盒式滤波(cv::boxFilter())结果的平方,即可得到局部方差图像。

  • 能量计算:在某些应用中,需要评估图像中某区域的能量,即该区域内像素值的平方之和。平方盒式滤波可以快速给出这些区域的能量值。

  • 预处理:在进行图像分析、特征提取、物体识别等任务前,平方盒式滤波可以作为预处理步骤,用于计算与像素值平方相关的特性,这些特性可能对后续算法有重要意义。

效果展示

均值滤波

高斯滤波

二维卷积filter2D

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值