• OpenCV(二十二):均值滤波、方框滤波和高斯滤波


    目录

    1.均值滤波

    2.方框滤波

    3.高斯滤波


    1.均值滤波

           OpenCV中的均值滤波(Mean Filter)是一种简单的滤波技术,用于平滑图像并减少噪声。它的原理非常简单:对于每个像素,将其与其周围邻域内像素的平均值作为新的像素值。

    具体的均值滤波原理如下:

    1. 定义滤波器大小:均值滤波器是一个正方形的卷积核,具有固定大小。该大小决定了每个像素使用多少邻域像素进行平均计算。
    2. 遍历图像像素:对于图像中的每个像素,将其与滤波器大小内的邻域像素进行平均计算。
    3. 计算新的像素值:将邻域像素的值相加,然后除以邻域内像素的数量,即可得到新的像素值。
    4. 更新图像:将每个像素的值更新为其对应的新像素值。

    均值滤波函数blur()

    void cv::blur ( InputArray  src,

    OutputArray dst,

    Size     ksize,

    Point       anchor = Point(-1,-1),

    int           borderType = BORDER_DEFAULT

    )

    • src:待均值滤波的图像,图像的数据类型必须是CV 8U、CV 16U、CV 16S、CV 32F和CV 64F这五种数据类型之一。
    • dst: 均值滤波后的图像,与输入图像具有相同的尺寸和数据类型。
    • ksize:卷积核尺寸。
    • anchor:内核的基准点(锚点),其默认值为(-l,-1)代表内核基准点位于kernel的中心位置。
    • borderType:像素外推法选择标志。

    以下是使用OpenCV进行均值滤波的示例代码:

    1. //均值滤波
    2. blur(image,image,Size(5,5));

    在这个示例代码中,我们加载一张图像image,并定义了一个5x5的滤波器大小。然后,我们调用cv::blur函数对图像进行均值滤波。

    cv::blur函数将输入图像作为第一个参数,并使用指定的滤波器大小对其进行平滑处理,然后将结果保存在输出图像中。在这个例子中,我们将图像本身作为输出参数,所以原始图像将会被修改。

    结论:均值滤波的卷积核越大,图片的失真越明显,图片会更模糊,如果设置核的大小为(1,1),则结果是原始图像。

    2.方框滤波

           方框滤波和均值滤波核基本上是一致的,主要的区别是要不要归一化处理,如果使用归一化处理,方框滤波就是均值滤波。

    方框滤波函数boxFilter()

    void cv::boxFilter ( InputArray   src,

    OutputArray dst,

    int  ddepth,

    Size    ksize,

    Point    anchor = Point(-1,-1),

    bool      normalize = true,

    int         borderType = BORDER_DEFAULT

    • src:输入图像。
    • dst: 输出图像,与输入图像具有相同的尺寸和通道数。
    • ddepth: 输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围。
    • ksize:卷积核尺寸。
    • anchor:内核的基准点(锚点),其默认值为(-1-1)代表内核基准点位于kernel的中心位置。
    • normalize:是否将卷积核进行归一化的标志,默认参数为true,表示进行归一化。
    • borderType:像素外推法选择标志。

    示例代码:

    1. //方框滤波boxFilter()
    2. Mat result;
    3. boxFilter(image,result,-1,Size(3,3),Point(-1,-1),false);//不进行归一化

    3.高斯滤波

            高斯滤波通过使用高斯函数计算像素点的权重,对周围邻域像素进行加权平均,以达到图像平滑的效果。由于高斯函数在中心点附近权重较大,而在离中心点越远的像素权重越小,它能够保留图像的整体结构,并且相对于其他平滑滤波器,它对细节的保留更好。

       高斯函数是一个连续的概率分布函数,它的形状是一个钟形曲线,中心点最高,两边逐渐变低。

    高斯滤波的原理如下:

    1. 定义滤波器大小和标准差:在使用高斯滤波之前,需要确定滤波器的大小(窗口大小)和标准差。窗口大小决定了滤波器覆盖的像素范围,标准差决定了高斯函数的形状。

    2. 构建高斯滤波器:根据定义的窗口大小和标准差,构建一个高斯函数或者高斯核矩阵。高斯函数是一个二维正态分布曲线,用于计算滤波器中每个像素的权重。

    3. 遍历图像像素:对于图像中的每个像素,高斯滤波器会考虑其周围邻域像素的值。

    4. 计算加权平均:对于每个像素,在滤波器邻域内,根据高斯函数计算相应像素的权重。权重越大表示该像素对平均值的贡献越大。然后将邻域内像素值与相应权重相乘,得到加权和。

    5. 更新图像:将每个像素的值更新为加权和,得到平滑后的图像。

    例如

    一个3X3的卷积核是:

    计算相应像素的权重

    将邻域内像素值与相应权重相乘,得到加权和,将像素的值更新为加权和。

    OpenCV中提供了高斯滤波函数cv2.GaussianBlur()来实现高斯滤波。

    void cv::GaussianBlur (InputArray  src,

    OutputArray dst,

    Size   ksize,

    double  sigmaX,  

    double   sigmaY = 0,

    int   borderType = BORDER DEFAULT

    )

    • src:待高斯滤波图像,数据类型必须为CV 8U,CV 16U,CV 16S,CV 32F或CV 64F。
    • dst:输出图像,与输入图像src具有相同的尺寸、通道数和数据类型。
    • ksize: 高斯滤波器的尺寸,滤波器可以不为正方形,但是必须是正奇数。如果尺寸为0,则由标准偏差计算尺寸。
    • sigmaX:X方向的高斯滤波器标准偏差。
    • sigmayY:Y方向的高斯滤波器标准偏差: 如果输入量为0,则将其设置为等于sigmax,如果两个轴的标差均为0,则根据输入的高斯滤波器尺寸计算标准偏差。
    • borderType:像素外推法选择标志。

    示例代码:

    1. //调用高斯滤波函数GaussianBlur()进行滤波
    2. GaussianBlur(image,image,Size(5,5),10,20);

    注意:在高斯滤波当中,核的宽度和高度可以不相同,但都要是奇数。

  • 相关阅读:
    机器学习(三十二):Apriori 算法进行关联规则挖掘(原理与实战)
    LeetCode 【算法专栏】 【图】
    四足步行机器人的结构设计及仿真
    Go语言高并发编程——互斥锁、条件变量
    java 身份证号码验证
    播放器事件/与JS交互
    flask vue跨域问题
    大数据-Storm流式框架(三)--Storm搭建教程
    金融行业数据安全法律法规清单
    深度强化学习——DQN算法原理
  • 原文地址:https://blog.csdn.net/weixin_63357306/article/details/132712885