您的位置:首页 > 运维架构

【OpenCV笔记 10】OpenCV线性滤波(均值滤波、方框滤波、高斯滤波)

2016-07-18 16:28 447 查看
本文将介绍三种常见的线性滤:均值滤波、方框滤波、高斯滤波

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:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息