首先感谢@浅墨_毛星云,本篇博文是小武通过学习@浅墨_毛星云的博客以及书籍《opencv3.0编程入门》整理的笔记及疑问心得,小武水平有限,欢迎交流。
@浅墨_毛星云博文:https://blog.csdn.net/poem_qianmo/article/category/1923021
【1】方框滤波
方框滤波(box Filter)被封装在一个名为boxblur的函数中,即boxblur函数的作用是使用方框滤波器(box filter)来模糊一张图片,从src输入,从dst输出。
函数原型:
C++: void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize,
Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT )
参数详解:
该函数平滑图像所使用的内核:
【2】均值滤波
均值滤波是方框滤波归一化(normalized)后的特殊情况。
函数原型:
C++: void blur(InputArray src, OutputArray dst, Size ksize,
Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
参数详解:
该函数平滑图像所使用的内核:
【3】高斯滤波
gaussianBlur函数的作用是用高斯滤波器来模糊一张图片。
函数原型:
C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
参数详解:
代码实现
#include
#include
#include
using namespace std;
using namespace cv;
//主函数
int main ()
{
Mat lenna1=imread("lenna.jpg");
Mat Img_out;
//方框滤波
boxFilter(lenna1,Img_out,-1,Size(9 , 9));
imshow("【原图】方框滤波",lenna1);
imshow("【效果图】方框滤波",Img_out);
waitKey(0);
return 0;
}
效果:
<2>均值滤波
//添加头文件
#include
#include
#include
#include
using namespace std;
using namespace cv;
//主函数
int main ()
{
Mat lenna1=imread("lenna.jpg");
Mat Img_out;
//均值滤波
blur(lenna1,Img_out,Size(7 , 7));
imshow("【原图】均值滤波",lenna1);
imshow("【效果图】均值滤波",Img_out);
waitKey(0);
return 0;
}
效果:
<3>高斯滤波
//添加头文件
#include
#include
#include
#include
using namespace std;
using namespace cv;
//主函数
int main ()
{
Mat lenna1=imread("lenna.jpg");
Mat Img_out;
//高斯滤波
GaussianBlur(lenna1,Img_out,Size(9 , 9),0,0);
imshow("【原图】高斯滤波",lenna1);
imshow("【效果图】高斯滤波",Img_out);
waitKey(0);
return 0;
}
效果:
综合:
//添加头文件
#include
#include
#include
#include
using namespace std;
using namespace cv;
int kernel_box=3;
int kernel_mean=3;
int kernel_gaussian=3;
Mat Img_in,Img_out1, Img_out2,Img_out3;
void callback_box(int ,void*);
void callback_mean(int ,void*);
void callback_gaussian(int ,void*);
//主函数
int main ()
{
Img_in=imread("lenna.jpg");
/* Img_out1=Img_in.clone();
Img_out2=Img_in.clone();
Img_out3=Img_in.clone();
*/
imshow("【原图】",Img_in);
//加跟踪条
namedWindow("【方框滤波】");
createTrackbar("内核大小","【方框滤波】",&kernel_box,25,callback_box);
callback_box(kernel_box,0);
namedWindow("【均值滤波】");
createTrackbar("内核大小","【均值滤波】",&kernel_mean,25,callback_mean);
callback_mean(kernel_mean,0);
namedWindow("【高斯滤波】");
createTrackbar("内核大小","【高斯滤波】",&kernel_gaussian,25,callback_gaussian);
callback_gaussian(kernel_gaussian,0);
waitKey(0);
return 0;
}
//回调函数
void callback_box(int ,void*)
{
if (kernel_box%2 ==0)
kernel_box=kernel_box+1;
boxFilter(Img_in,Img_out1,-1,Size(kernel_box,kernel_box));
imshow("【方框滤波】",Img_out1);
}
void callback_mean(int ,void*)
{
if (kernel_mean%2 ==0)
kernel_mean=kernel_mean+1;
blur(Img_in,Img_out2,Size(kernel_mean,kernel_mean));
imshow("【均值滤波】", Img_out2);
}
void callback_gaussian(int ,void*)
{
if (kernel_gaussian%2 ==0)
kernel_gaussian=kernel_gaussian+1;
GaussianBlur(Img_in,Img_out3,Size(kernel_gaussian*2+1 , kernel_gaussian*2+1),0,0);
imshow("【高斯滤波】",Img_out3);
}