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;
}
原圖:
噪聲圖:
導向圖片:
結果圖(去噪之後的圖片和原圖很接近呀)