Opencv联合双边滤波 Opencv实现联合双边滤波

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Opencv联合双边滤波 Opencv实现联合双边滤波

时光碎了天   2021-10-11 我要评论
想了解Opencv实现联合双边滤波的相关内容吗,时光碎了天在本文为您仔细讲解Opencv联合双边滤波的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Opencv联合双边滤波,Opencv双边滤波,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;
}

原图:

噪声图:

导向图片:

结果图(去噪之后的图片和原图很接近呀)

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们