Opencv实现联合双边滤波

 更新时间:2021年10月11日 16:28:38   作者:时光碎了天  
这篇文章主要为大家详细介绍了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;
}

原图:

噪声图:

导向图片:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 基于C语言实现简单的12306火车售票系统

    基于C语言实现简单的12306火车售票系统

    火车售票系统给我们的出行带来了极大的方面,那么他基于编程是如何实现的呢?今天小编抽时间给大家分享一个使用C语言写的一个简单的火车票系统,感兴趣的朋友参考下
    2016-09-09
  • C++实现LeetCode(46.全排列)

    C++实现LeetCode(46.全排列)

    这篇文章主要介绍了C++实现LeetCode(46.全排列),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Qt5代码移植到Qt6的实现

    Qt5代码移植到Qt6的实现

    本文主要介绍了Qt5代码移植到Qt6的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 详解C语言初阶基础(2)

    详解C语言初阶基础(2)

    这篇文章主要介绍了C语言中的初阶基础,介绍了其相关概念,具有一定参考价值。需要的朋友可以了解下,希望能够给你带来帮助
    2021-11-11
  • C++实现LeetCode(159.最多有两个不同字符的最长子串)

    C++实现LeetCode(159.最多有两个不同字符的最长子串)

    这篇文章主要介绍了C++实现LeetCode(159.最多有两个不同字符的最长子串),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++静态成员函数不能调用非静态成员变量(详解)

    C++静态成员函数不能调用非静态成员变量(详解)

    下面小编就为大家带来一篇C++静态成员函数不能调用非静态成员变量(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Qt实现实时鼠标绘制图形

    Qt实现实时鼠标绘制图形

    这篇文章主要介绍了Qt中QGraphicsView架构下如何实现实时鼠标绘制图形,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-02-02
  • C++实现LeetCode(154.寻找旋转有序数组的最小值之二)

    C++实现LeetCode(154.寻找旋转有序数组的最小值之二)

    这篇文章主要介绍了C++实现LeetCode(154.寻找旋转有序数组的最小值之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++中function的实现原理详解

    C++中function的实现原理详解

    类模版std::function是一种通用、多态的函数封装。function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作。本文主要聊聊它的实现原理,需要的可以参考一下
    2022-12-12
  • C++实现简单BP神经网络

    C++实现简单BP神经网络

    这篇文章主要为大家详细介绍了C++实现简单BP神经网络,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05

最新评论