以下介紹 OpenCV 提供的五種濾波器
OpenCV 3.0 Box Filter, Mean Blur, Gaussian Blur, Median Blur, Bilateral filter:
(OpenCV 3.0 方框濾波、平均值模糊、高斯模糊、中間值模糊、雙邊模糊)
程式執行範例:
原圖
中間值濾波過後
如果環境中存在許多"極端"雜訊,使用中間值濾波器能得到很好的效果。
如果要做的事情是減少自然界常態雜訊或減少細節層次,會選擇高斯濾波。
如果希望運算快速,使用 Box Filter。
如果想保留邊緣資訊,又想要減少雜訊或做模糊的效果,使用雙邊濾波。
所以說根據不同的需求,選擇不同的濾波器,才能達到最好的效果。
範例專案檔:
程式範例專案檔Google下載空間 (請選擇 64bit 編譯或調整環境變數)
範例程式碼:
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace cv;
using namespace std;
//全域變數宣告------------------------------------------
Mat srcImg, dstImg_box, dstImg_mean, dstImg_gauss, dstImg_median, dstImg_bilateral;
int boxValue = 6; //方框濾波
int meanValue = 10; //平均值濾波
int gaussValue = 6; //高斯濾波
int medianValue = 10;//中間值濾波
int bilateralValue = 10;//雙邊濾波
//function 宣告----------------------------------------
static void on_box(int, void*);
static void on_mean(int, void*);
static void on_gauss(int, void*);
static void on_median(int, void*);
static void on_bilater(int, void*);
int main()
{
//原圖讀取
srcImg = imread("testImg.jpg", 1); //使用範例時請更改圖片路徑
imshow("srcImg", srcImg);
//將所有圖片copy 一份給 destination圖片
dstImg_box = srcImg.clone();
dstImg_mean = srcImg.clone();
dstImg_gauss = srcImg.clone();
dstImg_median = srcImg.clone();
dstImg_bilateral = srcImg.clone();
//----------1. 方框濾波-----------
namedWindow("1.Box");
createTrackbar("核心值:", "1.Box", &boxValue, 50, on_box);
on_box(boxValue,0);
imshow("1.Box",dstImg_box);
//----------2. 平均值濾波---------
namedWindow("2.Mean");
createTrackbar("核心值:", "2.Mean", &meanValue, 50, on_mean);
on_mean(meanValue, 0);
imshow("2.Mean", dstImg_mean);
//----------3. 高斯濾波-----------
namedWindow("3.Gauss");
createTrackbar("參數:","3.Gauss",&gaussValue,50,on_gauss);
on_gauss(gaussValue,0);
imshow("3.Gauss", dstImg_gauss);
//----------4. 中值濾波------------
namedWindow("4.Median");
createTrackbar("遮罩參數:", "4.Median", &medianValue, 50, on_median);
on_median(medianValue, 0);
imshow("4.Median", dstImg_median);
//----------5. 雙邊濾波------------
namedWindow("5.Bilateral");
createTrackbar("參數:", "5.Bilateral", &bilateralValue, 50, on_bilater);
on_bilater(bilateralValue, 0);
imshow("5.Bilateral", dstImg_bilateral);
waitKey(0);
return 0;
}
static void on_box(int, void*)//
{
boxFilter(srcImg, dstImg_box, -1, Size(boxValue + 1, boxValue + 1));
imshow("1.Box", dstImg_box);
}
static void on_mean(int, void*)
{
blur(srcImg, dstImg_mean, Size(meanValue + 1, meanValue + 1),Point(-1,-1));
imshow("2.Mean", dstImg_mean);
}
static void on_gauss(int, void*)
{
GaussianBlur(srcImg, dstImg_gauss, Size(gaussValue*2 + 1, gaussValue*2 + 1),0,0);
imshow("3.Gauss", dstImg_gauss);
}
static void on_median(int, void*)
{
medianBlur(srcImg, dstImg_median,medianValue*2+1);
imshow("4.Median", dstImg_median);
}
static void on_bilater(int, void*)
{
bilateralFilter(srcImg, dstImg_bilateral, bilateralValue , bilateralValue * 2 , bilateralValue/2);
imshow("5.Bilateral", dstImg_bilateral);
}