OpenCV中图像滤波函数:函数
方框滤波——boxblur函数
均值滤波(邻域平均滤波)——blur函数
高斯滤波——GaussianBlur函数
中值滤波——medianBlur函数
双边滤波——bilateralFilter函数
其中方框滤波,均值滤波和高斯滤波属于线性滤波,中值滤波和双边滤波属于非线性滤波ui
一、方框滤波boxblurspa
boxFilter(image, out, -1, Size(pos+1, pos+1));
二、均值滤波code
blur(*((Mat*)data), out, Size(pos+1, pos+1));
均值滤波是均一化后的方框滤波,OpenCV内部调用的也是方框滤波函数。string
三、高斯滤波it
//高斯滤波的size值必须为正数和奇数,所以要pos*2+1 GaussianBlur(*((Mat*)data), out, Size(pos*2+1, pos*2+1), 0, 0);
四、中值滤波opencv
//中值滤波的参数必须是大于1的奇数,好比:3,5,7,9 . medianBlur(*((Mat*)data), out, pos*2+3);
五、双边滤波class
bilateralFilter(*((Mat*)data), out, pos, pos*2, pos/2);
示例代码:gui
#include "opencv2/core/core.hpp" #include"opencv2/highgui/highgui.hpp" #include"opencv2/imgproc/imgproc.hpp" using namespace std; using namespace cv; const string wndboxblur = "方框滤波"; const string wndblur = "均值滤波"; const string wndgsblur = "高斯滤波"; const string wndmedian = "中值滤波"; const string wndbilateral = "双边滤波"; //方框滤波 void cvBoxBlur(const Mat& image) { auto fun = [](int pos, void* data){ Mat out; boxFilter(*((Mat*)data), out, -1, Size(pos+1, pos+1)); imshow(wndboxblur, out); }; int val = 5; namedWindow(wndboxblur); createTrackbar("核心大小", wndboxblur, &val, 30, fun, (void*)&image); fun(5, (void*)&image); } //均值滤波 void cvBlur(const Mat& image) { auto fun = [](int pos, void* data){ Mat out; blur(*((Mat*)data), out, Size(pos+1, pos+1)); imshow(wndblur, out); }; int val = 5; namedWindow(wndblur); createTrackbar("核心大小", wndblur, &val, 30, fun, (void*)&image); fun(5, (void*)&image); } //高斯滤波 void cvGsBlur(const Mat& image) { auto fun = [](int pos, void* data){ Mat out; //高斯滤波的size值必须为正数和奇数,所以要pos*2+1 GaussianBlur(*((Mat*)data), out, Size(pos*2+1, pos*2+1), 0, 0); imshow(wndgsblur, out); }; int val = 10; namedWindow(wndgsblur); createTrackbar("核心大小", wndgsblur, &val, 30, fun, (void*)&image); fun(1, (void*)&image); } //中值滤波 void cvMedianBlur(const Mat& image) { auto fun = [](int pos, void* data){ Mat out; //中值滤波的参数必须是大于1的奇数,好比:3,5,7,9 . medianBlur(*((Mat*)data), out, pos*2+3); imshow(wndmedian, out); }; int val = 10; namedWindow(wndmedian); createTrackbar("核心大小", wndmedian, &val, 30, fun, (void*)&image); fun(1, (void*)&image); } //双边滤波 void cvBilateralFilter(const Mat& image) { auto fun = [](int pos, void* data){ Mat out; bilateralFilter(*((Mat*)data), out, pos, pos*2, pos/2); imshow(wndbilateral, out); }; int val = 10; namedWindow(wndbilateral); createTrackbar("核心大小", wndbilateral, &val, 50, fun, (void*)&image); fun(1, (void*)&image); } int main( ) { Mat image=imread("mv.jpg"); //加载显示原图 imshow("原图", image); //cvBoxBlur(image); //cvBlur(image); //cvGsBlur(image); cvMedianBlur(image); cvBilateralFilter(image); waitKey(0 ); }