一、方框滤波
二、均值滤波
三、高斯滤波
四、中值滤波
五、双边滤波
代码:
#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;
}
运行效果:
三个线性看起来区别不大,不过跟非线性滤波比起来还是有一定区别的。
注意创建轨迹条之后要运行相应的函数。