OpenCV--图像滤波(共5种)

本文主要描述了利用OpenCV的库函数实现滤波的过程

可分为以下两大类:

一、线性滤波

1、方框滤波 boxFilter()

2、均值滤波blur()

3、高斯滤波GaussianBlur()

二、非线性滤波

1、中值滤波medianBlur()--当滤波核尺寸大于5时,输入图像只能是CV_8U格式的。

2、双边滤波bilateralFilter()

实验结果如下图所示:



主程序如下所示:

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

//声名全局变量

Mat g_scrImage,g_dstImage1,g_dstImage2,g_dstImage3,g_dstImage4,g_dstImage5;

//滤波核大小的初始值
int g_nBoxFilterValue=6;//方块滤波的内核值
int g_nMeanBlurValue=10;//均值滤波内核值
int g_nGaussianBlurValue=6;//高斯滤波内核值
int g_nMedianBlurValue=10;//中值滤波参数
int g_nBilateralFilterValue=10;//双边滤波参数

//声名滚动条回调函数
static void on_BoxFilter(int,void*);//方框
static void on_MeanBlur(int,void*);//均值
static void on_GaussianBlur(int,void*);//高斯
static void on_MedianBlur(int,void*);//中值
static void on_BilateralFilter(int,void*);//双边

int main()
{
	g_scrImage=imread("1.jpg");

	if (!g_scrImage.data)
	{
		printf("载入失败");
		return -1;
	}

	g_dstImage1=g_scrImage.clone();
	g_dstImage2=g_scrImage.clone();
	g_dstImage3=g_scrImage.clone();
	g_dstImage4=g_scrImage.clone();
	g_dstImage5=g_scrImage.clone();

	//显示原图
	namedWindow("0原图");
	imshow("0原图",g_scrImage);

	//方框滤波
	namedWindow("1方框滤波");//创建窗口
	//创建滚动条
	createTrackbar("内核值","1方框滤波",&g_nBoxFilterValue,50,on_BoxFilter);
	on_BoxFilter(g_nBoxFilterValue,0);
	//imshow("1方框滤波",g_dstImage1);

	//均值滤波
	namedWindow("2均值滤波");//创建窗口
	createTrackbar("内核值","2均值滤波",&g_nMeanBlurValue,50,on_MeanBlur);
	on_MeanBlur(g_nMeanBlurValue,0);

	//高斯滤波
	namedWindow("3高斯滤波");//创建窗口
	createTrackbar("内核值","3高斯滤波",&g_nGaussianBlurValue,50,on_GaussianBlur);
	on_GaussianBlur(g_nGaussianBlurValue,0);

	//中值滤波
	namedWindow("4中值滤波");//创建窗口
	createTrackbar("内核值","4中值滤波",&g_nMedianBlurValue,50,on_MedianBlur);
	on_MedianBlur(g_nMedianBlurValue,0);

	//双边滤波
	namedWindow("5双边滤波");//创建窗口
	createTrackbar("内核值","5双边滤波",&g_nBilateralFilterValue,50,on_BilateralFilter);
	on_BilateralFilter(g_nBilateralFilterValue,0);

	waitKey();
	return 0;
}

//回调函数

//方框回调函数
static void on_BoxFilter(int,void*)
{
	//方框滤波操作
	boxFilter(g_scrImage,g_dstImage1,-1,Size(g_nBoxFilterValue+1,g_nBoxFilterValue+1));//尺寸加1 表示核的最小值为1

	//显示
	imshow("1方框滤波",g_dstImage1);	
}

//均值回调函数
static void on_MeanBlur(int,void*)
{
	blur(g_scrImage,g_dstImage2,Size(g_nMeanBlurValue+1,g_nMeanBlurValue+1),Point(-1,-1));
	imshow("2均值滤波",g_dstImage2);
}

//高斯滤波回调函数
static void on_GaussianBlur(int,void*)
{
	GaussianBlur(g_scrImage,g_dstImage3,Size(g_nGaussianBlurValue*2+1,g_nGaussianBlurValue*2+1),0,0);//乘2加1 表示核的尺寸需要时奇数
	imshow("3高斯滤波",g_dstImage3);
}

//中值滤波回调函数
static void on_MedianBlur(int,void*)
{
	medianBlur(g_scrImage,g_dstImage4,g_nMedianBlurValue*2+1);
	imshow("4中值滤波",g_dstImage4);
}

//双边滤波回调函数
static void on_BilateralFilter(int,void*)
{
	bilateralFilter(g_scrImage,g_dstImage5,g_nBilateralFilterValue,g_nBilateralFilterValue*2,g_nBilateralFilterValue);
	imshow("5双边滤波",g_dstImage5);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值