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语言详解函数与指针的使用

    C语言详解函数与指针的使用

    C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对函数和指针的掌握是非常重要的,本文将具体针对函数和指针的关系做详尽的介绍
    2022-04-04
  • C语言实现简单航班管理系统

    C语言实现简单航班管理系统

    这篇文章主要为大家详细介绍了C语言实现简单航班管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C++实现归并排序(MergeSort)

    C++实现归并排序(MergeSort)

    这篇文章主要为大家详细介绍了C++实现归并排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C语言 while for do while循环体详解用法

    C语言 while for do while循环体详解用法

    在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件
    2021-10-10
  • C语言实现数字雨效果

    C语言实现数字雨效果

    这篇文章主要为大家详细介绍了C语言实现数字雨效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C BlowFish对称加密算法详解

    C BlowFish对称加密算法详解

    这篇文章主要介绍了C BlowFish对称加密算法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++ OpenCV制作黑客帝国风格的照片

    C++ OpenCV制作黑客帝国风格的照片

    这篇文章主要介绍了如何通过C++ OpenCV制作出黑客帝国风格的照片,文中的示例代码讲解详细,对我们学习OpenCV有一定帮助,需要的可以参考一下
    2022-01-01
  • c语言内存泄漏严重的解决方法

    c语言内存泄漏严重的解决方法

    这篇文章主要介绍了c语言内存泄漏的解决方法,帮助大家更好的理解和使用c语言开发,感兴趣的朋友可以了解下
    2020-09-09
  • C语言实现数组移位、前移、后移与整体移动实例代码

    C语言实现数组移位、前移、后移与整体移动实例代码

    C语言中通常可以使用循环语句实现数组的移动,下面这篇文章主要给大家介绍了关于C语言实现数组移位、前移、后移与整体移动的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • C++实现通讯录系统项目实战

    C++实现通讯录系统项目实战

    这篇文章主要为大家详细介绍了C++实现通讯录系统项目实战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论