• 【C++】【Opencv】cv::GaussianBlur、cv::filter2D()函数详解和示例


    本文通过函数详解和运行示例对cv::GaussianBlur和cv::filter2D()两个函数进行解读,最后综合了两个函数的关系和区别,以帮助大家理解和使用。

    cv::GaussianBlur()

    函数详解

    cv::GaussianBlur 是 OpenCV 库中的一个函数,用于对图像进行高斯模糊。高斯模糊是一种常见的图像降噪技术,它通过使用高斯函数对图像进行卷积来减少噪声和细节。

    函数原型如下:

    void cv::GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY, int borderType)
    
    参数解释:
    
    src:输入图像。
    dst:输出图像。
    ksize:高斯核的大小。它必须是奇数,如 (3, 3), (5, 5), (7, 7) 等。
    sigmaX:X方向的标准差。这是高斯核在X方向上的宽度。
    sigmaY:Y方向的标准差。这是高斯核在Y方向上的宽度。如果sigmaY为0,则函数会自动根据kernel大小来计算sigmaY,如果sigmaX和sigmaY都为0,那么这两个参数都会被设置为cv::DBL_MAX。如果sigmaY不为0而sigmaX为0,那么sigmaX会被设置为等于sigmaY。
    borderType:像素外插法,有默认值。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行示例

    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main() {
        Mat image = imread("image.jpg", IMREAD_COLOR); // 读取输入图像
        if (image.empty()) {
            cout << "无法读取图像文件" << endl;
            return -1;
        }
        Mat blurredImage;
        GaussianBlur(image, blurredImage, Size(5, 5), 1.0, 1.0); // 对图像进行高斯模糊处理
        imshow("Original Image", image); // 显示原始图像
        imshow("Blurred Image", blurredImage); // 显示模糊后的图像
        waitKey(0); // 等待按键
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这个示例中,我们首先读取一个图像文件,然后使用 cv::GaussianBlur() 对其进行高斯模糊处理。注意,在调用 cv::GaussianBlur() 时,我们需要指定高斯核的大小和标准差参数。最后,我们使用 imshow() 来显示原始图像和模糊后的图像。
    在这里插入图片描述
    上面为原图,下面为滤波后图像。可以看出远处的高楼变得模糊了。可以调整核大小和偏差修改相应的效果。
    在这里插入图片描述

    filter2D()

    函数详解

    filter2D() 是 OpenCV 库中的一个函数,用于对图像进行线性滤波。它使用指定的核来对输入图像进行卷积,以实现平滑、锐化、边缘检测等效果。

    void cv::filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT)
    
    参数解释:
    
    src:输入图像。
    dst:输出图像。
    ddepth:输出图像的深度,通常为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。
    kernel:指定的滤波核。它是一个包含多个元素(至少为 3x3)的矩阵,用于定义滤波操作的性质。
    anchor:锚点。指定了卷积核相对于图像中心的偏移量。默认值为 Point(-1,-1),表示锚点在图像中心。
    delta:增量值。用于调整输出图像的像素值。
    borderType:像素外插法。指定了处理边界像素的方式。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行示例

    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main() {
        Mat image = imread("image.jpg", IMREAD_COLOR); // 读取输入图像
        if (image.empty()) {
            cout << "无法读取图像文件" << endl;
            return -1;
        }
        Mat blurredImage;
        int kernelSize = 5; // 高斯核大小
        double sigmaX = 1.0; // X方向标准差
        double sigmaY = 1.0; // Y方向标准差
        GaussianBlur(image, blurredImage, Size(kernelSize, kernelSize), sigmaX, sigmaY); // 对图像进行高斯模糊处理
        imwrite("output.jpg", blurredImage);
        Mat kernel = (Mat_<float>(3, 3) << 1, 4, 1, 4, 16, 4, 1, 4, 1); // 高斯滤波器
        filter2D(blurredImage, blurredImage, -1, kernel); // 应用滤波器
        imshow("Original Image", image); // 显示原始图像
        imshow("filter2D Image ", blurredImage); 
        imwrite("output1.jpg", blurredImage);
        waitKey(0); // 等待按键
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这个示例中,我首先使用 cv::GaussianBlur() 对图像进行高斯模糊处理。然后,我创建了一个高斯滤波器,并使用 cv::filter2D() 对模糊后的图像进行滤波处理。最后,我使用 imshow() 来显示原始图像和模糊后的图像。
    具体效果如下,下面是原图。
    在这里插入图片描述
    下面的是模糊处理后的效果图。
    在这里插入图片描述
    上面是模糊处理后的效果图,下面是经过filter2D函数处理后的效果图,可以通过调整核函数大小调整效果。
    在这里插入图片描述

    总结

    两个函数联系

    (1)cv::GaussianBlur()是使用高斯滤波器对图像进行模糊处理,而cv::filter2D()可以应用各种滤波器对图像进行滤波处理。

    (2)在使用cv::GaussianBlur()时,需要指定高斯核的大小和标准差参数;而在使用cv::filter2D()时,需要指定一个滤波器作为参数,该滤波器可以是一个自定义的滤波器,也可以是高斯滤波器。

    两个函数区别

    (1)cv::GaussianBlur()仅适用于高斯模糊处理,而cv::filter2D()可以应用于各种滤波器,包括高斯滤波器、中值滤波器、边缘检测滤波器等。
    (2)cv::GaussianBlur()函数需要提供滤波器中系数的数量作为函数的第3个参数,而cv::filter2D()函数不需要提供滤波器中系数的数量。
    (3)cv::GaussianBlur()函数仅支持对图像进行二维滤波处理,而cv::filter2D()函数可以支持对图像进行二维或三维滤波处理。

  • 相关阅读:
    内存逃逸分析
    AI模型精确解析果蝇行为,未来或可预测人类行为
    io多路复用之poll的详细执行过程
    sklearn机器学习——day03
    .md结尾的文件如何展示图片
    海外监管机构出手制裁DeFi,去中心化成伪命题了吗?波卡将何去何从?
    【vue】AntDV组件库中a-upload实现文件上传:
    阿里低代码Low Code Engine快速上手
    SpringBoot SpringBoot 原理篇 3 核心原理 3.2 启动流程【1】
    Oracle/PLSQL: Remainder Function
  • 原文地址:https://blog.csdn.net/qq_22734027/article/details/134449949