opencv學習(二十三)之方框、均值、高斯、中值、雙邊濾波綜合比較
阿新 • • 發佈:2019-02-13
/*
*本程式的目的旨在對前面介紹的濾波器進行一個比較
*對比每種濾波器的濾波效果和耗時
*除雙邊濾波外其他濾波器kernel均是5*5或5
*對於雙邊濾波器取其直徑典型值30
*sigmaColor和sigmaSpace的值均由直徑計算而來
*/
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("lena.jpg");
if(srcImage.empty())
{
cout << "圖片載入失敗!" << endl;
return -1;
}
else
cout << "圖片載入成功!" << endl << endl;
namedWindow("原影象", WINDOW_AUTOSIZE);
imshow("原影象", srcImage);
/********************方框濾波*******************/
Mat dstImage_boxFilter;
double time_boxFilter = static_cast<double>(getTickCount());
boxFilter(srcImage, dstImage_boxFilter, -1, Size(5, 5));
time_boxFilter = ((double)getTickCount()-time_boxFilter)/getTickFrequency();
cout << "方框濾波耗時: " << time_boxFilter << " s" << endl;
namedWindow("方框濾波影象", WINDOW_AUTOSIZE);
imshow("方框濾波影象", dstImage_boxFilter);
/********************均值濾波*****************/
Mat dstImage_blur;
double time_blur = static_cast<double>(getTickCount());
blur(srcImage, dstImage_blur, Size(5, 5));
time_blur = ((double)getTickCount()-time_blur)/getTickFrequency();
cout << "均值濾波耗時: " << time_blur << " s" << endl;
namedWindow("均值濾波影象", WINDOW_AUTOSIZE);
imshow("均值濾波影象", dstImage_blur);
/********************高斯濾波******************/
Mat dstImage_GaussianBlur;
double time_GaussianBlur = static_cast<double>(getTickCount());
GaussianBlur(srcImage, dstImage_GaussianBlur, Size(5, 5), 0, 0);
time_GaussianBlur = ((double)getTickCount()-time_GaussianBlur)/getTickFrequency();
cout << "高斯濾波耗時: " << time_GaussianBlur << " s" << endl;
namedWindow("高斯濾波影象", WINDOW_AUTOSIZE);
imshow("高斯濾波影象", dstImage_GaussianBlur);
/*******************中值濾波*******************/
Mat dstImage_medianBlur;
double time_medianBlur=static_cast<double>(getTickCount());
medianBlur(srcImage, dstImage_medianBlur, 5);
time_medianBlur = ((double)getTickCount()-time_medianBlur)/getTickFrequency();
cout << "中值濾波耗時: " << time_medianBlur << " s" << endl;
namedWindow("中值濾波影象", WINDOW_AUTOSIZE);
imshow("中值濾波影象", dstImage_medianBlur);
/******************雙邊濾波******************/
Mat dstImage_bilateralFilter;
double time_bilateralFilter = static_cast<double>(getTickCount());
bilateralFilter(srcImage, dstImage_bilateralFilter, 30, 60, 15);
time_bilateralFilter=((double)getTickCount()-time_bilateralFilter)/getTickFrequency();
cout << "雙邊濾波耗時: " << time_bilateralFilter << " s" << endl;
namedWindow("雙邊濾波影象", WINDOW_AUTOSIZE);
imshow("雙邊濾波影象", dstImage_bilateralFilter);
waitKey(0);
return 0;
}
程式執行結果:
PS:程式執行時間與編譯環境和電腦硬體都有關係,本結果僅供參考,以自己實驗結果為準!!!