本文将介绍三种常见的线性滤:均值滤波、方框滤波、高斯滤波
1.均值滤波
blur()函数原型
void cv::blur | ( | InputArray | src, //输入 |
OutputArray | dst,//输出 | ||
Size | ksize,//模板大小3x3,5x5等,Size(3,3),Size(5,5) | ||
Point | anchor = Point(-1,-1) ,//默认为Point(-1,-1),则为3x3模板的中心点 | ||
int | borderType = BORDER_DEFAULT //用于推断外部边界像素的某种模式 | ||
| ) | |
注:
blur(src, dst, ksize, anchor, borderType)
等价于boxFilter(src, dst, src.type(), anchor, true, borderType)
2.方框滤波:用来模糊一张图片
boxFilter()函数原型
void cv::boxFilter | ( | InputArray | src,//输入 |
OutputArray | dst,//输出 | ||
int | ddepth,//输出图像的深度,-1表示原图深度 | ||
Size | ksize,//模板大小3x3,5x5等,Size(3,3),Size(5,5) | ||
Point | anchor = Point(-1,-1) , //默认为Point(-1,-1),则为3x3模板的中心点 | ||
bool | normalize = true , //默认为true,表示其内核是否其区域归一化 | ||
int | borderType = BORDER_DEFAULT //此参数可以不用设置 | ||
) |
3.高斯滤波:将原图像和指定的高斯核函数做卷积运算,以消除高斯噪声
GaussianBlur()函数原型
void cv::GaussianBlur | ( | InputArray | src, //输入 |
OutputArray | dst, //输出 | ||
Size | ksize,//模板(内核)大小 | ||
double | sigmaX,//高斯内核函数在x方向偏差 | ||
double | sigmaY = 0 ,//高斯内核函数在x方向偏差 | ||
int | borderType = BORDER_DEFAULT //此参数可不用设置 | ||
) |
4.代码示例
//三种常见的线性滤综合运用示例:
//均值滤波blur()、方框滤波boxFilter() , 高斯滤波 GaussianBlur()
//使用到的其它函数回调函数、创建滑动条createTrackbar()
//头文件、命名空间
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//全局变量声明
Mat g_srcImage, g_dstImage1, g_dstImage3, g_dstImage2;
int g_nBoxFilterValue = 3;//方框滤波参数值
int g_nBlurValue = 3;
int g_nGaussianFilterValue=3;
//全局函数声明部分,轨迹条的回调函数
static void on_BoxFilter(int, void *);
static void on_Blur(int, void*);
static void on_Gaussian(int, void*);
//main()函数部分
int main()
{
system("color E0");//改变控制台颜色,背景为黄色,字体为黑色
g_srcImage = imread("623.jpg",1);
if (!g_srcImage.data)
{
printf("读取srcImage错误!\n");
return false;
}
imshow("【0】原图", g_srcImage);
g_dstImage1 = g_srcImage.clone();
g_dstImage2 = g_srcImage.clone();
g_dstImage3 = g_srcImage.clone();
//****************均值滤波***************
namedWindow("【1】均值滤波", 1);//创建滑动条,该句不可少
createTrackbar("内核值", "【1】均值滤波", &g_nBlurValue, 20, on_Blur);//滑动条最大位置为20+1,on_Blur为函数名,此处以指针形式作为参数
on_Blur(g_nBlurValue, 0);//回调函数
//**************方框滤波****************
namedWindow("【2】方框滤波",CV_WINDOW_AUTOSIZE);
createTrackbar("内核值", "【2】方框滤波", &g_nBoxFilterValue, 20, on_BoxFilter);
on_BoxFilter(g_nBoxFilterValue, 0);
//***************高斯滤波***************
namedWindow("【3】高斯滤波", 1);
createTrackbar("内核值", "【3】高斯滤波", &g_nGaussianFilterValue, 15, on_Gaussian);
on_Gaussian(g_nBlurValue, 0);
cout << "\t请拖动滚动条观察图像效果!\n";
cout << "\t按下q键退出\n" << endl;
while (char (waitKey(1))!= 'q') { }
return 0;
}
//自定义回调函数
static void on_Blur(int , void*)
{
blur(g_srcImage, g_dstImage1, Size(g_nBlurValue+1, g_nBlurValue+1), Point(-1, -1));
imshow("【1】均值滤波", g_dstImage1);
}
static void on_BoxFilter(int, void*)
{
boxFilter(g_srcImage, g_dstImage2, -1, Size(g_nBoxFilterValue+1, g_nBoxFilterValue+1), Point(-1, -1), true, 4);
imshow("【2】方框滤波", g_dstImage2);
}
static void on_Gaussian(int, void*)
{
GaussianBlur(g_srcImage, g_dstImage3, Size(2 * g_nGaussianFilterValue + 1, 2 * g_nGaussianFilterValue+1), 0, 0, 4);
imshow("【3】高斯滤波", g_dstImage3);
}
**********************************
5.运行结果
控制台:
原图:
均值滤波,内核值为7+1:
方框滤波,内核值为7+1:
高斯滤波,内核值为2x7+1: