本文实例为大家分享了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;
}
原图:
噪声图:
导向图片:
结果图(去噪之后的图片和原图很接近呀)