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 ); }