OpenCV blur()函数的用法(附带实例)
归一化方框滤波器(Normalized Box Filter)是很简单的滤波器,输出像素值是核窗口内像素值的均值(所有像素加权系数相等)。其核(Kernel,用 K 表示)如下图所示:
方框滤波和均值滤波的核基本上是一致的,主要区别是要不要归一化处理。如果使用归一化处理,方框滤波就是均值滤波,实际上均值滤波是方框滤波归一化后的特殊情况。注意,均值滤波不能很好地保护细节。
OpenCV 提供了 blur() 函数来实现均值滤波操作,该函数声明如下:
【实例】实现均值滤波。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。
2) 在工程中打开 main.cpp,输入如下代码:
3) 保存工程并运行,结果如下图所示:

方框滤波和均值滤波的核基本上是一致的,主要区别是要不要归一化处理。如果使用归一化处理,方框滤波就是均值滤波,实际上均值滤波是方框滤波归一化后的特殊情况。注意,均值滤波不能很好地保护细节。
OpenCV 提供了 blur() 函数来实现均值滤波操作,该函数声明如下:
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1, -1), int borderType=BORDER_DEFA);各个参数的含义如下:
- src 表示输入图像,可以是 Mat 类型,图像深度是 CV_8U、CV_16U、CV_16S、CV_32F 以及 CV_64F 其中的一个;
- dst 表示输出图像,深度和类型与输入图像一致;
- ksize 表示滤波模板核的尺寸,一般使用 Size(w,h) 来指定,如 Size(3,3);
- anchor 表示锚点,也就是处理的像素位于核的什么位置,默认值为 (-1, -1),即位于核的中心点,如果没有特殊需要,就不需要更改;
- borderType 用于推断图像外部像素的某种边界模式,默认值为 BORDER_DEFAULT。
【实例】实现均值滤波。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。
2) 在工程中打开 main.cpp,输入如下代码:
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <stdio.h> using namespace std; using namespace cv; // 定义全局变量 Mat g_srcImage; // 定义输入图像 Mat g_dstImage; // 定义目标图像 const int g_nTrackbarMaxValue = 9; // 定义轨迹条最大值 int g_nTrackbarValue; int g_nKernelValue; void on_kernelTrackbar(int, void*); // 定义回调函数 int main() { g_srcImage = imread("cat.png"); // 判断图像是否加载成功 if (g_srcImage.empty()) { cout << "Fail to open file." << endl; return -1; } namedWindow("src", WINDOW_AUTOSIZE); // 定义窗口显示属性 imshow("src", g_srcImage); g_nTrackbarValue = 1; namedWindow("Mean filtering", WINDOW_AUTOSIZE); // 定义滤波后图像显示窗口属性 // 定义轨迹条名称和最大值 char kernelName[20]; sprintf(kernelName, "kernel size: %d", g_nTrackbarMaxValue); // 创建轨迹条 createTrackbar(kernelName, "Mean filtering", &g_nTrackbarValue, g_nTrackbarMaxValue, on_kernelTrackbar); on_kernelTrackbar(g_nTrackbarValue, 0); waitKey(0); return 0; } void on_kernelTrackbar(int, void*) { // 根据输入值重新计算 kernel 尺寸 g_nKernelValue = g_nTrackbarValue * 2 + 1; // 均值滤波函数 blur(g_srcImage, g_dstImage, Size(g_nKernelValue, g_nKernelValue)); imshow("Mean filtering", g_dstImage);// 显示均值滤波结果图 }
3) 保存工程并运行,结果如下图所示:
