本文实例为大家分享了OpenCV实现联合双边滤波的具体代码,供大家参考,具体内容如下 1.介绍 双边滤波是一种可以保边去噪的滤波器,主要是因为它的核比较特殊,公式(1)为它的调用公式
本文实例为大家分享了OpenCV实现联合双边滤波的具体代码,供大家参考,具体内容如下
双边滤波是一种可以保边去噪的滤波器,主要是因为它的核比较特殊,公式(1)为它的调用公式,公式(2)为它的核公式,其中,大括号左边公式为空间域小核,和高斯滤波器是一样的,而大括号右边公式为值域小核(f表示取其灰度值),而对于联合双边滤波与双边滤波的区别主要在于值域小核所用到的图片,如果所用到的图片是引入的另外一幅图像,那么就是在使用联合双边滤波。
(1)
(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;
}
原图:
噪声图:
导向图片:
结果图(去噪之后的图片和原图很接近呀)
--结束END--
本文标题: Opencv实现联合双边滤波
本文链接: https://lsjlt.com/news/137722.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0