2016年3月25日 星期五

以下介紹 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);
}

沒有留言:

張貼留言