• opencv图像卷积操作和常用的图像滤波函数


    opencv图像卷积操作原理,opencv中常用的图像滤波函数

    一、图像卷积操作原理:

    卷积是图像处理中常用的操作之一,它通过在图像上滑动一个滤波器(也称为卷积核)来实现对图像的处理,每个滤波器(卷积核)都是一个小的矩阵,它包含一组权重值;

    1、卷积操作原理图:
    • 将滤波器(卷积核)与图像的一个小区域相乘;
    • 将得到的乘积相加,得到一个新的像素值;
    • 通过不断滑动滤波器(卷积核),对整幅图像进行处理,从而得到一幅经过卷积操作的图像;
      在这里插入图片描述
      计算过程图:
      在这里插入图片描述

    二、opencv常用的图像滤波函数:这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声,使图像变得更加平滑);

    1、cv::blur()函数:英文全拼blur

    均值滤波器(平均滤波器),用于图像模糊(平滑)处理的函数,它将图像中的每个像素值替换为其周围像素值的平均值,从而实现图像的模糊效果;

    (1)函数原型:
    void cv::blur(
    	InputArray src, 
    	OutputArray dst, 
    	Size ksize, 
    	Point anchor = Point(-1,-1), 
    	int borderType = BORDER_DEFAULT
    );
    
    参数解释:
    src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
    dst:输出图像;
    ksize:卷积核,用cv::Size(width, height)来指定,例如(3,3)表示一个3x3的卷积核,通常使用奇数大小的核;
    anchor:锚点,默认为卷积核的中心,默认值Point(-1, -1);
    borderType:图像边缘处的像素填充方式(
    	cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;
    	cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;
    	cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    (2)代码示例:
    #include 
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main() {
    
    	// 读取彩色图像
    	cv::Mat image = cv::imread("C:\\cpp\\image\\suzy1.jpg");
    
    	if (image.empty()) {
    		std::cerr << "Error: 无法读取图像文件." << std::endl;
    		return -1;
    	}
    
    	cv::Mat outputImage;
    	cv::Size kernelSize(5, 5);
    
    	cv::blur(image, outputImage, kernelSize);
    
    	cv::imshow("Input Image", image);
    	cv::imshow("Blurred Image", outputImage);
    
    	cv::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
    • 27
    • 28
    • 29
    • 30

    运行结果:
    在这里插入图片描述

    2、cv::boxFilter()函数:

    方框滤波器(均值滤波器的一种变体),方框滤波器与均值滤波器类似,通过计算图像中每个像素周围邻域像素的加权平均值来减少噪声,但相比 cv::blur()cv::boxFilter()可以指定不同的归一化方式;

    (1)函数原型:
    void cv::boxFilter(
        cv::InputArray src,
        cv::OutputArray dst,
        int ddepth,
        cv::Size ksize,
        cv::Point anchor = cv::Point(-1,-1),
        bool normalize = true,
        int borderType = cv::BORDER_DEFAULT
    );
    
    参数解释:
    src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
    dst:输出图像,与输入图像具有相同的尺寸和通道数;
    ddepth:输出图像的深度,通常使用-1表示与输入相同;
    ksize:卷积核,用cv::Size(width, height)来指定,例如(3,3)表示一个3x3的卷积核,通常使用奇数大小的核;
    anchor:锚点,默认为卷积核的中心,默认值Point(-1, -1);
    normalize:是否对结果进行归一化,默认为true;
    borderType:图像边缘处的像素填充方式(
    	cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;
    	cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;
    	cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    (2)cv.blur() 均值滤波器与cv.boxFilter() 方框滤波器的区别:

    cv::blur()cv::boxFilter() 都是用于图像平滑处理的滤波器,它们的核心目的是减少图像中的噪声,使图像变得更加平滑;

    核的定义:
    • cv::blur() 的核是一个归一化的平均核,也就是说核内所有元素的和为1(这表示在滤波过程中,像素值被取平均值);
    • cv::boxFilter() 的核不一定是归一化的,可以通过 normalize 参数控制是否归一化(这使得方框滤波器可以对像素进行加权平均);
    参数不同:
    • cv::blur() 接受一个 cv::Size 参数作为核的大小,通常使用奇数大小的核;
    • cv::boxFilter() 接受一个整数参数作为核的大小,可以使用偶数大小的核;
    功能略有差异:
    • 由于 cv::boxFilter() 可以选择是否归一化,因此它可以用于一些特殊情况下的平滑处理,比如图像锐化;
    • cv::blur() 更适合通用的平滑处理;
    总结:

    总的来说,这两个函数都可以用于图像平滑处理,选择使用哪个取决于你的具体需求以及想要实现的效果,如果你只是需要一个简单的平滑处理,通常使用 cv::blur() 就足够了,如果你需要更多的控制,或者想要尝试一些特殊的滤波效果,可以考虑使用 cv::boxFilter()

    (3)代码示例:
    #include 
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main() {
    
    	// 读取彩色图像
    	cv::Mat image = cv::imread("C:\\cpp\\image\\suzy1.jpg");
    
    	if (image.empty()) {
    		std::cerr << "Error: 无法读取图像文件." << std::endl;
    		return -1;
    	}
    
    	cv::Mat outputImage;
    	cv::Size kernelSize(5, 5);
    
    	cv::boxFilter(image, outputImage, -1, kernelSize);
    
    	cv::imshow("Input Image", image);
    	cv::imshow("Box Filtered Image", outputImage);
    
    	cv::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
    • 27
    • 28
    • 29

    运行结果:
    在这里插入图片描述

    3、cv::GuassianBlur()函数:

    高斯滤波器,对输入图像中的每个像素施加一个高斯函数作为权重,从而实现平滑处理,通过应用高斯滤波器来减少图像中的噪声,会较明显地模糊边缘;

    (1)函数原型:
    void cv::GaussianBlur(
        cv::InputArray src,  
        cv::OutputArray dst,  
        cv::Size ksize,  
        double sigmaX,  
        double sigmaY = 0,   
        int borderType = cv::BORDER_DEFAULT
    );
    
    参数解释:
    src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
    dst:输出图像,与输入图像具有相同的尺寸和通道数;
    ksize:卷积核,用cv::Size(width, height)来指定,例如(3,3)表示一个3x3的卷积核,通常使用奇数大小的核;
    sigmaX:X方向的高斯核标准差;
    sigmaY:Y方向的高斯核标准差,如果为零则默认与sigmaX相同;
    borderType:图像边缘处的像素填充方式(
    	cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;
    	cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;
    	cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    (2)代码示例:
    #include 
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main() {
    
    	// 读取彩色图像
    	cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");
    
    	if (inputImage.empty()) {
    		std::cerr << "Error: 无法读取图像文件." << std::endl;
    		return -1;
    	}
    
    	cv::Mat outputImage;
    	cv::Size kernelSize(5, 5);
    	double sigmaX = 1.5;
    
    	cv::GaussianBlur(inputImage, outputImage, kernelSize, sigmaX);
    
    	cv::imshow("Input Image", inputImage);
    	cv::imshow("Gaussian Blurred Image", outputImage);
    
    	cv::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
    • 27
    • 28
    • 29
    • 30
    • 31

    运行结果:
    在这里插入图片描述

    4、cv::medianBlur()函数:

    中值滤波器,对输入图像进行平滑处理,通过用邻域像素的中值来替代当前像素的值,从而减少图像中的噪声,是一种常用于去除图像中的椒盐噪声(salt-and-pepper noise)的非线性滤波器;

    (1)函数原型:
    void cv::medianBlur(
        cv::InputArray src,         
        cv::OutputArray dst,        
        int ksize                   
    );
    
    参数解释:
    src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
    dst:输出图像,与输入图像具有相同的尺寸和通道数;
    ksize:卷积核,通常为奇数,用cv::Size(width, height)来指定,通常使用奇数大小的核;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    (2)代码示例:
    #include 
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main() {
    
    	// 读取彩色图像
    	cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");
    
    	if (inputImage.empty()) {
    		std::cerr << "Error: 无法读取图像文件." << std::endl;
    		return -1;
    	}
    
    
    	cv::Mat outputImage;
    	int kernelSize = 5; // 选择一个奇数大小的核
    
    	cv::medianBlur(inputImage, outputImage, kernelSize);
    
    	cv::imshow("Input Image", inputImage);
    	cv::imshow("Median Blurred Image", outputImage);
    
    	cv::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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    运行结果:
    在这里插入图片描述

    5、cv::bilateralFilter()函数:

    双边滤波器,双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存;

    (1)函数原型:
    void cv::bilateralFilter(
        cv::InputArray src,         
        cv::OutputArray dst,        
        int d,                      
        double sigmaColor,          
        double sigmaSpace,         
        int borderType = cv::BORDER_DEFAULT  
    );
    
    参数解释:
    
    src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
    dst:输出图像,与输入图像具有相同的尺寸和通道数;
    d:控制在颜色空间中滤波器的直径,通常在3-5之间;
    sigmaColor:控制颜色相似性的标准差,值越大,颜色差异越大;
    sigmaSpace:控制空间相似性的标准差,值越大,范围内像素权重越大;
    borderType:图像边缘处的像素填充方式(
    	cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;
    	cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;
    	cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    (2)代码示例:
    #include 
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main() {
    
    	// 读取彩色图像
    	cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");
    
    	if (inputImage.empty()) {
    		std::cerr << "Error: 无法读取图像文件." << std::endl;
    		return -1;
    	}
    
    	cv::Mat outputImage;
    
    	int d = 9; // 直径
    	double sigmaColor = 75; // 颜色相似性标准差
    	double sigmaSpace = 75; // 空间相似性标准差
    
    	cv::bilateralFilter(inputImage, outputImage, d, sigmaColor, sigmaSpace);
    
    	cv::imshow("Input Image", inputImage);
    	cv::imshow("Bilateral Filtered Image", outputImage);
    
    	cv::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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    运行结果:
    在这里插入图片描述

    6、cv2::filter2D()函数:

    对输入图像进行二维卷积操作,通过将一个核应用于图像的每个像素,从而实现特定的图像处理效果,如边缘检测、模糊等;

    (1)函数原型:
    void cv::filter2D(
        cv::InputArray src,       
        cv::OutputArray dst,  
        int ddepth,          
        cv::InputArray kernel,  
        cv::Point anchor = cv::Point(-1,-1),
        double delta = 0,   
        int borderType = cv::BORDER_DEFAULT  
    );
    
    参数解释:
    src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
    dst:输出图像,与输入图像具有相同的尺寸和通道数;
    ddepth:输出图像的深度,通常使用-1表示与输入相同;
    kernel:卷积核,用于定义卷积操作的权重矩阵;
    anchor:锚点,默认为卷积核的中心,默认值Point(-1, -1);
    delta:可选参数,用于调节卷积结果的偏移值,默认为0;
    borderType:图像边缘处的像素填充方式(
    	cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;
    	cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;
    	cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
    )
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    (2)代码示例:
    #include 
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main() {
    
    	// 读取彩色图像
    	cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");
    
    	if (inputImage.empty()) {
    		std::cerr << "Error: 无法读取图像文件." << std::endl;
    		return -1;
    	}
    
    	cv::Mat kernel = (cv::Mat_<float>(3, 3) <<
    		0, -1, 0,
    		-1, 5, -1,
    		0, -1, 0);
    
    	cv::Mat outputImage;
    	cv::filter2D(inputImage, outputImage, -1, kernel);
    
    	cv::imshow("Input Image", inputImage);
    	cv::imshow("Filtered Image", outputImage);
    
    	cv::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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    运行结果:
    在这里插入图片描述

  • 相关阅读:
    Java学习笔记3.8.4 内部类 - 匿名内部类
    寻找最长回文串算法题解(力扣第5题)
    发布Android库至MavenCentral详解
    大学四年如何有效的使用『牛客』平台
    制作游戏demo的心得
    DRM全解析 —— ADD_FB2(5)
    Web2.0架构与Web3.0架构
    MySQL导入sql文件的三种方法
    TPC-C 、TPC-H、TPC-DS和SSB测试基准(Benchmark)介绍
    github 中的java前后端项目整合到本地运行
  • 原文地址:https://blog.csdn.net/qq_33867131/article/details/133761663