#include<iostream>
#include<opencv2/opencv.hpp>
#define window1 "【结果1】"
#define window "【原图 】"
#define window2 "【结果2】"
#define window3 "【结果3】"
#define window4 "【结果4】"
#define window5 "【结果5】"
using namespace std;
using namespace cv;
//2.3.
Mat src,dst;
int tbar = 1;
int maxtypebar = 4;//控制滤波类型。
int conttolbar = 3;
int maxctlbar = 40;//控制滤波效果,核的范围。
int x ;
void typeon(int,void*);
void ctlon(int,void*);
void process(void);
//用两个滑动条来控制滤波方式和滤波效果。
int main()
{
//1.读取原图。
src = imread("滤波图.jpg");
resize(src,src,Size(),0.4,0.4);
imshow(window,src);
//2.123分别控制方框滤波,均值滤波,高斯滤波。
//全局变量。
//3.核的范围最大40.
//4.创建process函数。
//5.创建滑动条和回调函数。
namedWindow(window1,1);
createTrackbar("类型控制",window1,&tbar,maxtypebar,typeon);
typeon(tbar,0);
createTrackbar("核大小控制",window1,&conttolbar,maxctlbar,ctlon);
ctlon(conttolbar,0);
waitKey();
return 0;
}
//4.
void process()
{
x = 2 * conttolbar + 1;
if (tbar == 0)
{
boxFilter(src,dst,-1,Size(x, x));//方形。
}
else if(tbar==1)
{
blur(src,dst,Size(x,x));//均值。
}
else if(tbar==2)
{
GaussianBlur(src,dst, Size(x, x),0,0);//高斯
}
else if (tbar == 3)
{
medianBlur(src,dst,x);//中值,也能较好的保护边缘,也能够去除噪声,但是效果却没有双边滤波效果好。
}
else
{
bilateralFilter(src,dst,x,x*2,x/2);//双边滤波器。较好的保护边缘效果,但是对于高频的噪声没法进行过滤。
}
imshow(window1,dst);
}
void typeon(int, void*)
{
process();
}
void ctlon(int,void*)
{
process();
}
双边滤波顾名思义,对边缘的保护很好。