0028-用OpenCV的函式bilateralFilter做雙邊濾波
阿新 • • 發佈:2018-11-16
前幾篇帖子提到的均值濾波、中值濾波和高斯濾波,都屬於各向同性濾波,它們對待噪聲和影象的邊緣資訊都採取一樣的態度,結果,噪聲被磨平的同時,影象中具有重要地位的邊緣、紋理和細節也同時被抹平了,這是我們所不希望看到的。為了解決這個問題,人們陸續提出了一些演算法來把影象邊緣和噪聲區別對待,比如雙邊濾波和導向濾波,本文介紹如何使用opencv做影象的雙邊濾波。
關於雙邊濾波的原理,大家可以參考網頁:http://blog.163.com/yuyang_tech/blog/static/21605008320130242441886/(博主2018-11-15 14:09:49注:因163部落格已經關閉,所以這篇文章大家看不到了,抱歉
OpenCV提供了函式bilateralFilter來進行雙邊濾波,函式原型如下:
C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )
引數意義如下:
src:輸入影象
dst:輸出影象
d:濾波鄰域直徑。如果這個值設為負數,那麼這個值由引數sigmaColor計算出。
sigmaColor:濾波的色彩空間引數。這個值越大,代表濾波計算鄰域內有更多的色彩權重。
sigmaSpace :濾波的距離空間引數。這個值越大,代表當顏色距離相同時,會有更多的點被影響到。如果引數d>0,則鄰域大小由d指定,否則,d是sigmaSpace的一個比例結果。
示例程式碼如下
影象處理開發資料、影象處理開發需求、影象處理接私活掙零花錢,可以搜尋公眾號"qxsf321",並關注!
//opencv版本:OpenCV3.0 //VS版本:VS2013 //Author:qxsf321.net #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/imgproc/types_c.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/highgui/highgui_c.h> #include <time.h> #include <iostream> using namespace cv; using namespace std; int main() { //源影象 Mat img_input = imread("zhi_zhi_hua.jpg"); Mat img_output(img_input.size(), img_input.type()); Mat noise(img_input.size(), img_input.type()); /**建立一個噪聲矩陣*/ RNG rng(time(NULL)); rng.fill(noise, RNG::NORMAL, 10, 36); /**高斯分佈*/ cv::add(img_input, noise, img_output); imshow("原影象", img_input); //imshow("噪聲影象", noise); imshow("加上高斯噪聲後的影象", img_output); Mat dst; bilateralFilter(img_output,dst,9,40,8); imshow("雙邊濾波後的影象", dst); waitKey(0); return EXIT_SUCCESS; }
執行結果截圖如下:
從執行截圖來看,高斯濾波的效果是不如雙邊濾波,高斯濾波的效果大家可以參看博文https://blog.csdn.net/lehuoziyuan/article/details/84102935