方框滤波
通过滤波器核K内每个像素值的平均值得到
API boxFilter()
函数原型:
void boxFilter(
InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor=Point(-1,-1),
bool normalize=true,
int borderType=BORDER_DEFAULT
);
参数:
-
src: 输入图像,可以是Mat类型 -
dst: 经滤波后输出图像 -
ddepth: 目标图像的深度,若设置为-1,则深度与原图像深度相同 -
ksize: Size类型,内核的大小,一般用Size(w, h)表示,如Size(3, 3)表示kernel窗口大小为3x3 -
anchor= Point(-1,-1): 进行滤波操作的点,如果是默认值(-1, -1)说明对上述窗口中心点所对应的像素点进行操作 -
normalize= true: 内核是否被归一化处理,有默认值true -
borderType= BORDER_DEFAULT: 用于腿短图像外部像素的某种便捷模式,有默认值BORDER_DEFAULT.
代码示例:
下面效果用到了OpenCV 中的 Trackbar ,Trackbar 相关介绍可以参考我的另一篇博文:javascript:void(0)
效果展示:
代码如下:
#include <iostream>
#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
const int g_nTrackBarMaxValue = 9; //轨迹条最大值
int g_nTrackBarValue; //轨迹条初始值
Mat g_srcImage, g_dstImage; //定义图像全局变量
int g_nKernelTrackbarValue; //定义轨迹条的值
void on_kernelTrackbar(int, void*);
int main()
{
g_srcImage = imread("./test2.jpg");
//判断图像是否加载成功
if (g_srcImage.empty())
{
cout << "图像加载失败!" << endl;
return -1;
}
else
cout << "图像加载成功!" << endl << endl;
namedWindow("原图像", WINDOW_AUTOSIZE);
imshow("原图像", g_srcImage); //显示原图像
g_nTrackBarValue = 1; //初始化轨迹条初始值
namedWindow("方框滤波", WINDOW_AUTOSIZE); //轨迹条依附窗口
char kernelName[20];
sprintf(kernelName, "滤波kernel %d", g_nTrackBarMaxValue);
//创建轨迹条
createTrackbar(kernelName, "方框滤波", &g_nTrackBarValue, g_nTrackBarMaxValue, on_kernelTrackbar);
on_kernelTrackbar(g_nTrackBarValue, 0);
waitKey(0);
return 0;
}
void on_kernelTrackbar(int, void*)
{
//根据输入值重新计算kernel尺寸,见程序详解
g_nKernelTrackbarValue = g_nTrackBarValue * 2 + 3;
//方框滤波函数
boxFilter(g_srcImage, g_dstImage, -1, Size(g_nKernelTrackbarValue, g_nKernelTrackbarValue));
imshow("方框滤波", g_dstImage);
}
















