opencv学习笔记7——图像处理滤波

一、方框滤波

二、均值滤波


三、高斯滤波


四、中值滤波


五、双边滤波


代码:

#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_dstImage2, g_dstImage3,g_dstImage4,g_dstImage5;
int g_nBoxFilterValue = 3, g_nMeanBlurValue = 3, g_nGaussianBlurValue = 3,g_nMedianBlurValue=10,g_nBilateraFilterValue=10;
//轨迹条的回调函数
static void on_BoxFilter(int, void *)
{
	boxFilter(g_srcImage, g_dstImage1, -1, Size(g_nBoxFilterValue + 1, g_nBoxFilterValue + 1));
	imshow("<1>方框滤波", g_dstImage1);
}
static void on_MeanBlur(int, void*)
{
	blur(g_srcImage, g_dstImage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1),Point(-1,-1));
	imshow("<2>均值滤波", g_dstImage2);
}
static void on_GaussianBlur(int, void *)
{
	GaussianBlur(g_srcImage, g_dstImage3, Size(g_nGaussianBlurValue * 2 + 1, g_nGaussianBlurValue * 2 + 1),0,0);
	imshow("<3>高斯滤波", g_dstImage3);
}
static void on_MedianBlur(int,void*)
{
	medianBlur(g_srcImage, g_dstImage4, g_nMedianBlurValue * 2 + 1);
	imshow("<4>中值滤波", g_dstImage4);
}
static void on_BilateralFilter(int, void*)
{
	bilateralFilter(g_srcImage, g_dstImage5,
		g_nBilateraFilterValue, g_nBilateraFilterValue * 2, g_nBilateraFilterValue / 2);
	imshow("<5>双边滤波", g_dstImage5);
}


int main()
{
	system("color5E");
	g_srcImage = imread("lena.jpg", 1);
	if (!g_srcImage.data)
	{
		cout << "读取源图片失败\n";
		return false;
	}
	g_dstImage1 = g_srcImage.clone();
	g_dstImage2 = g_srcImage.clone();
	g_dstImage3 = g_srcImage.clone();
	namedWindow("<0>原图窗口", 1);
	imshow("<0>原图窗口", g_srcImage);
	//方框滤波,创建轨迹条
	namedWindow("<1>方框滤波", 1);
	createTrackbar("内核值:", "<1>方框滤波", &g_nBoxFilterValue, 40, on_BoxFilter);
	on_BoxFilter(g_nBoxFilterValue, 0);
	//均值滤波
	namedWindow("<2>均值滤波", 1);
	createTrackbar("内核值:", "<2>均值滤波", &g_nMeanBlurValue, 40, on_MeanBlur);
	on_MeanBlur(g_nMeanBlurValue, 0);
	//高斯滤波
	namedWindow("<3>高斯滤波", 1);
	createTrackbar("内核值:", "<3>高斯滤波", &g_nGaussianBlurValue, 40, on_GaussianBlur);
	on_GaussianBlur(g_nGaussianBlurValue, 0);
	//中值滤波
	namedWindow("<4>中值滤波", 1);
	createTrackbar("内核值:", "<4>中值滤波", &g_nMedianBlurValue, 50, on_MedianBlur);
	on_MedianBlur(g_nMedianBlurValue, 0);
	//双边滤波
	namedWindow("<5>双边滤波", 1);
	createTrackbar("内核值:", "<5>双边滤波", &g_nBilateraFilterValue, 50, on_BilateralFilter);
	on_BilateralFilter(g_nBilateraFilterValue, 0);


	cout << "请调整滚动条查看图像效果\n按下q键程序退出\n";
	while (char(waitKey(1))!='q'){}
	return 0;
}

运行效果:


三个线性看起来区别不大,不过跟非线性滤波比起来还是有一定区别的。

注意创建轨迹条之后要运行相应的函数。



猜你喜欢

转载自blog.csdn.net/qq_36718317/article/details/80294709