1. 程式人生 > >0028-用OpenCV的函式bilateralFilter做雙邊濾波

0028-用OpenCV的函式bilateralFilter做雙邊濾波

前幾篇帖子提到的均值濾波、中值濾波和高斯濾波,都屬於各向同性濾波,它們對待噪聲和影象的邊緣資訊都採取一樣的態度,結果,噪聲被磨平的同時,影象中具有重要地位的邊緣、紋理和細節也同時被抹平了,這是我們所不希望看到的。為了解決這個問題,人們陸續提出了一些演算法來把影象邊緣和噪聲區別對待,比如雙邊濾波和導向濾波,本文介紹如何使用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