Opencv之聯合雙邊濾波

1.介紹

    雙邊濾波是一種可以保邊去噪的濾波器,主要是因爲它的核比較特殊,公式(1)爲它的調用公式,公式(2)爲它的核公式,其中,大括號左邊公式爲空間域小核,和高斯濾波器是一樣的,而大括號右邊公式爲值域小核(f表示取其灰度值),而對於聯合雙邊濾波與雙邊濾波的區別主要在於值域小核所用到的圖片,如果所用到的圖片是引入的另外一幅圖像,那麼就是在使用聯合雙邊濾波。

                                           (1)

                          (2)

2.代碼

    此代碼就是用聯合雙邊濾波簡單去一個噪聲

#include<opencv2/opencv.hpp>
#include<ximgproc.hpp>

using namespace cv;


Mat addSaltNoise(const Mat srcImage, int n)
{
	Mat dstImage = srcImage.clone();
	for (int k = 0; k < n; k++)
	{
		//隨機取值行列
		int i = rand() % dstImage.rows;
		int j = rand() % dstImage.cols;
		//圖像通道判定
		if (dstImage.channels() == 1)
		{
			dstImage.at<uchar>(i, j) = 255;		//鹽噪聲
		}
		else
		{
			dstImage.at<Vec3b>(i, j)[0] = 255;
			dstImage.at<Vec3b>(i, j)[1] = 255;
			dstImage.at<Vec3b>(i, j)[2] = 255;
		}
	}
	for (int k = 0; k < n; k++)
	{
		//隨機取值行列
		int i = rand() % dstImage.rows;
		int j = rand() % dstImage.cols;
		//圖像通道判定
		if (dstImage.channels() == 1)
		{
			dstImage.at<uchar>(i, j) = 0;		//椒噪聲
		}
		else
		{
			dstImage.at<Vec3b>(i, j)[0] = 0;
			dstImage.at<Vec3b>(i, j)[1] = 0;
			dstImage.at<Vec3b>(i, j)[2] = 0;
		}
	}
	return dstImage;
}


int main() {
	Mat src = imread("test.png", 1);
	src = addSaltNoise(src, 3000);

	Mat joint = imread("test.png", 0);

	Mat dst;
	int64 begin = cvGetTickCount();
	ximgproc::jointBilateralFilter(joint, src, dst, -1, 3, 9);
	int64 end = cvGetTickCount();

	float time = (end - begin) / (cvGetTickFrequency() * 1000.);
	printf("time= %fms\n", time);


	imshow("src", src);
	imshow("joint", joint);
	imshow("jointBilateralFilter", dst);
	waitKey(0);

	return 0;
}

    原圖:

    噪聲圖:

    導向圖片:

    結果圖(去噪之後的圖片和原圖很接近呀)

 

 

 

發佈了137 篇原創文章 · 獲贊 140 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章