三种线性滤波
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3 |
OpenCv下有三种线性滤波:
方框滤波:BoxFilter
均值滤波:Blur
这是由一个归一化卷积框完成的。他只是用卷积框覆盖区域所有像素的平均值来代替中心元素。可以使用函数 cv2.blur() 和 cv2.boxFilter() 来完这个任务。
高斯滤波:GaussianBlur
现在把卷积核换成高斯核(简单来说,方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包。原来的求平均数现在变成求加权平均数,全就是方框里的值)。实现的函数是 cv2.GaussianBlur()。我们需要指定高斯核的宽和高(必须是奇数)。以及高斯函数沿 X,Y方向的标准差。如果我们只指定了 X 方向的的标准差,Y 方向也会取相同值。如果两个标准差䪬是 0,那么函数会根据核函数的大小自己计算。高斯滤波可以有效的从图像中去除高斯噪音。如果你愿意的话,你也可以使用函数 cv2.getGaussianKernel() 自己构建一个高斯核。
三种滤波的执行效果如下:

C#版本代码
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
namespace demo
{
internal class Program
{
static void Main(string[] args)
{
// 载入原图
Mat image = Cv2.ImRead("../../../images/girl3.jpg");
// 显示原图
Cv2.ImShow("【原图】", image);
// 进行方框滤波操作
Mat out1 = new Mat();
Cv2.BoxFilter(image, out1, -1, new Size(5, 5));
// 进行均值滤波操作
Mat out2 = new Mat();
Cv2.Blur(image, out2, new Size(7, 7));
//进行高斯滤波操作
// sigmaX,表示高斯核函数在X方向的的标准偏差。
// sigmaY,表示高斯核函数在Y方向的的标准偏差。
// 若sigmaY为零,就将它设为sigmaX。
// 如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
Mat out3 = new Mat();
Cv2.GaussianBlur(image, out3, new Size(5, 5), 0, 0);
//显示效果图
Cv2.ImShow("方框滤波【效果图】", out1);
Cv2.ImShow("均值滤波【效果图】", out2);
Cv2.ImShow("高斯滤波【效果图】", out3);
Cv2.WaitKey(0);
}
}
}
C++版本代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
// 载入原图
Mat image = imread("../images/girl3.jpg");
// 创建窗口
namedWindow("【原图】");
namedWindow("方框滤波【效果图】");
namedWindow("均值滤波【效果图】");
namedWindow("高斯滤波【效果图】");
// 显示原图
imshow("【原图】", image);
// 进行方框滤波操作
Mat out1;
boxFilter(image, out1, -1, Size(5, 5));
// 进行均值滤波操作
Mat out2;
blur(image, out2, Size(7, 7));
//进行高斯滤波操作
// sigmaX,表示高斯核函数在X方向的的标准偏差。
// sigmaY,表示高斯核函数在Y方向的的标准偏差。
// 若sigmaY为零,就将它设为sigmaX。
// 如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
Mat out3;
GaussianBlur(image, out3, Size(5, 5), 0, 0);
//显示效果图
imshow("方框滤波【效果图】", out1);
imshow("均值滤波【效果图】", out2);
imshow("高斯滤波【效果图】", out3);
waitKey(0);
return 0;
}
Python版本代码
import cv2
# 载入原图
image=cv2.imread('../images/girl3.jpg')
# 显示原图
cv2.imshow('image',image)
# 进行方框滤波操作 BoxFilter
out1 = cv2.boxFilter(image, -1, (5,5))
# 进行均值滤波操作
out2 = cv2.blur(image, (7,7))
# 进行高斯滤波操作
out3 = cv2.GaussianBlur(image,(5,5), 0)
# 显示组合结果
cv2.imshow('boxFilter',out1)
cv2.imshow('blur',out2)
cv2.imshow('GaussianBlur',out3)
cv2.waitKey(0)
cv2.destroyAllWindows()