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

news/2024/7/21 7:47:10 标签: opencv, c++, 计算机视觉, 人工智能, 图像处理

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

目录

  • cv::GaussianBlur()
    • 函数详解
    • 运行示例
  • 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:像素外插法,有默认值。

运行示例

#include <opencv2/opencv.hpp>
#include <iostream>

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;
}

在这个示例中,我们首先读取一个图像文件,然后使用 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:像素外插法。指定了处理边界像素的方式。

运行示例

#include <opencv2/opencv.hpp>
#include <iostream>

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;
}

在这个示例中,我首先使用 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()函数可以支持对图像进行二维或三维滤波处理。


http://www.niftyadmin.cn/n/5186579.html

相关文章

【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷A

单选题 1、2019年是己亥猪年&#xff0c;下一个己亥猪年是&#xff08;&#xff09; A、2031年 B、2043年 C、2079年 D、2091年 答案&#xff1a;C 2、有4枚外表完全相同的硬币&#xff0c;其中有3枚真币和1枚假币。假币与真币的重量不同&#xff0c;但不知道比真币更轻还…

LabVIEW关于USRPRIO的示例代码

LabVIEW关于USRPRIO的示例代码 USRPRIO 通常以两种方式使用&#xff1a; 1 基于 FPGA 的编程 对于希望修改USRP上的底层FPGA代码以添加自定义DSP模块的应用&#xff0c;请使用USRP示例项目。它可作为构建 USRP RIO 流式处理应用程序的起点&#xff0c;可从“创建项目”对话框…

vscode文件夹折叠问题

今天发现一个vscode的文件夹显示的问题&#xff0c;首先是这样的&#xff0c;就是我的文件夹里又一个子文件夹&#xff0c;子文件夹里有一些文件&#xff0c;但是我发现无法折叠起这个子文件夹&#xff0c;总是显示全部的文件&#xff0c;这让我备份很难&#xff0c;具体参考 h…

002 OpenCV dft 傅里叶变换

目录 一、傅里叶变换 1.1 傅里叶变换概念 1.2 opencv中傅里叶变换 二、实验代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、傅里叶变换 2.1 傅里叶变换概念 傅里叶变换&#xff08;Fourier Transform&#xff09;是一种…

Mysql 执行 sql 文件导入数据时报错: Got a packet bigger than ‘max_allowed_packet‘ bytes

MySQL数据插入报错&#xff1a;Got a packet bigger thanmax_allowed_packetbytes的问题 这是因为插入输入过大造成 可通过命令,查看当前值&#xff1a; show VARIABLES like %max_allowed_packet%; 可以有2个解决方法&#xff1a; 1.临时修改&#xff0c;重启失效&#xff1…

ElementPlus el-switch开关页面初始化时,change事件自动触发

解决方案&#xff1a; //在el-switch外层包一个盒子 不使用el-switch自带的 change 事件 //盒子上面添加一个 click 点击事件&#xff0c;通过点击事件来改变el-switch的状态 <div click"switchChange"><el-switch v-model"value1" /> </d…

【Spring】bean的基础配置

bean的别名 当在Spring config文件中定义name作为别名后&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

打破内卷宿命,电商只能出海,必须出海!

历史社会学家黄宗智把中国华北小农经济中的“过密化增长”、边际收益递减等现象称之为“内卷”&#xff1a;即在有限空间内的激烈零和式竞争现象&#xff1b;内卷产生的根源是有限且封闭的空间&#xff0c;竞争规则是“排他性”的零和博弈。 空间有限下的零和博弈&#xff0c;正…