利用OpenCV的函数GaussianBlur()对图像进行高斯滤波

Posted 昊虹算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用OpenCV的函数GaussianBlur()对图像进行高斯滤波相关的知识,希望对你有一定的参考价值。

高斯滤波是常见的滤波处理方法。

高斯滤波器本质上是一个低通滤波器,所以对图像进行高斯滤波运算后,图像的高频分量会被滤除,体现出来的效果是图像被模糊化处理了。

OpenCV提供了函数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方向上的标准差。

sigmaY---高斯核在Y方向上的标准差,如果这个参数的值为0,那么sigmaY=sigmaX。如果sigmaY=sigmaX=0,则根据高斯核的尺寸来自动计算两个方向上的标准差。为了更好地控制这个滤波过程,建议大家对参数ksize、sigmaX、sigmaY都进行填写。

borderType---边界扩展处理方式。有关图像边界扩展方式可以参考我写的另一篇博文,链接 https://blog.csdn.net/wenhao_ir/article/details/12417798

据说高斯滤波器对服从高斯分布的噪声滤除效果还不错,所以本文的示例代码就用高斯滤波器来对按高斯分布产生的随机噪声图像进行滤波处理。

代码如下:

//博主微信/QQ 2487872782
//有问题可以联系博主交流
//有图像处理需求也可联系博主
//图像处理技术交流QQ群 271891601

//OpenCV版本:3.0
//VS版本:2012

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/imgproc/imgproc.hpp>


#include <time.h>  
#include <iostream>
 
using namespace cv;
using namespace std;
 
int main()

        //生成按高斯分布的噪声图像
		Mat image_gaussian_noise( cv::Size(400,300), CV_8UC3, cv::Scalar(0,0,0) );
        RNG rng(time(NULL));
        rng.fill(image_gaussian_noise, RNG::NORMAL, 0, 30);  /*用高斯分布随机数填充图像*/
 
        imshow("原噪声图像", image_gaussian_noise);
 
        Mat dst;
        GaussianBlur(image_gaussian_noise, dst, Size(3, 3),0, 0);
        imshow("3*3高斯核滤波后的图像", dst);
		GaussianBlur(image_gaussian_noise, dst, Size(5, 5),0, 0);
		imshow("5*5高斯核滤波后的图像", dst);
		GaussianBlur(image_gaussian_noise, dst, Size(9, 9),0, 0);
		imshow("9*9高斯核滤波后的图像", dst);
 
        waitKey(0);
        return EXIT_SUCCESS;

运行结果如下图所示:

可见,滤波效果还是不错的,大家在使用中可根据实际的图像去调整相应的参数以达到最优效果。不过要注意的是,由于高斯噪声的频谱几乎是均匀分布的,详情参考我的另一篇博文:https://blog.csdn.net/wenhao_ir/article/details/124566310  所以要想完全滤除高斯噪声也是不现实的。

上面代码中用到了类RNG来产生高斯噪声,它的用法可以参考我的另一篇博文,链接:https://blog.csdn.net/wenhao_ir/article/details/51698089

以上是关于利用OpenCV的函数GaussianBlur()对图像进行高斯滤波的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-高斯滤波cv::GaussianBlur

OpenCV:在 QImage 上使用 GaussianBlur 或 Sobel 导数

手撕OpenCV源码之filter2D

OpenCV基础API函数三

FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)

Python-OpenCV中的图像模糊