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

27 篇文章 0 订阅

本文将介绍三种常见的线性滤:均值滤波、方框滤波、高斯滤波

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:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值