联合双边滤波器(joint bilateral filter)【OpenCV】

举报
ShaderJoy 发表于 2021/12/30 00:34:38 2021/12/30
【摘要】 前面介绍了双边滤波器(bilateral filter,LBF),然而BF的权值是不稳定的,因此在边缘附近会出现一些翻转。此外BF计算复杂度是O(r^2);为了改善BF权值的稳定性,引入了联合双边滤波器(joint bilateral filter ,LBF)。两者之间的差别就是JBF用了一个导向图作为值域权重的计算依据。下面我们...


前面介绍了双边滤波器(bilateral filter,LBF),然而BF的权值是不稳定的,因此在边缘附近会出现一些翻转。此外BF计算复杂度是O(r^2);为了改善BF权值的稳定性,引入了联合双边滤波器(joint bilateral filter ,LBF)。两者之间的差别就是JBF用了一个导向图作为值域权重的计算依据。下面我们通过数学公式展示二者的不同:

先看BF的,如(1)所示,

再次解释一下公式中的符号意义,其中I表示输入图像,p、q表示像素在图像中的坐标,Ip表示对应位置的像素值,J表示输出, f、g是权重分布函数,一般为高斯函数。这种滤波的结果就是周边像素的权值不仅和距离有关还和那个位置的像素值有关。
再看JBF,如(2)所示,

如果在值域的权重计算过程引入另外一幅图像,如下式,则称之为联合双边滤波。 ~I 就是引入的另外一幅图像。该图像 必须与待处理的图像相似。
JBF的原理图,如图(1)所示。

图(1)JBF原理图
 
联合双边滤波上采样技术也很简单,一种便于理解的也便于写代码的方式就是把下采样并进行处理过后的小图按照最近邻插值的方式放大到原图大小,然后再用原图的数据和这个放大的结果进行联合双边滤波处理  。

下面粘贴了JBF的matlab代码供大家学习参考。

   
  1. function B = jbfltGray(D,C,w,sigma_d,sigma_r)
  2. % D should be a double precision matrix of size NxMx1 (i.e., grayscale) with normalized values in the
  3. % closed interval [0,1].
  4. % C should be similar to D, from which the weights are calculated, with normalized values in the
  5. % closed interval [0,1].
  6. % Pre-compute Gaussian distance weights.
  7. [X,Y] = meshgrid(-w:w,-w:w);
  8. G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
  9. % Apply bilateral filter.
  10. dim = size(D);
  11. B = zeros(dim);
  12. for i = 1:dim(1)
  13. for j = 1:dim(2)
  14. % Extract local region.
  15. iMin = max(i-w,1);
  16. iMax = min(i+w,dim(1));
  17. jMin = max(j-w,1);
  18. jMax = min(j+w,dim(2));
  19. I = D(iMin:iMax,jMin:jMax);
  20. % To compute weights from the color image
  21. J = C(iMin:iMax,jMin:jMax);
  22. % Compute Gaussian intensity weights according to the color image
  23. H = exp(-(J-C(i,j)).^2/(2*sigma_r^2));
  24. % Calculate bilateral filter response.
  25. F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);
  26. B(i,j) = sum(F(:).*I(:))/sum(F(:));
  27. end
  28. end

----------------------------------------------以上原理转载自: pplong的博客----------------------------------------------


OpenCV 3.x.x的扩展模块(ximgproc. Extended Image Processing) 也添加了JBF的 API  :
 




OpenCV的代码:


   
  1. #include "stdafx.h"
  2. #include <opencv2/opencv.hpp>
  3. #include <ximgproc.hpp>
  4. int main()
  5. {
  6. cv::Mat src = cv::imread("data/dp.png", 1); // 原始带噪声的深度图
  7. cv::Mat joint = cv::imread("data/teddy.png", 0);
  8. cv::Mat dst;
  9. int64 begin = cvGetTickCount();
  10. cv::ximgproc::jointBilateralFilter(joint, src, dst, -1, 3, 9);
  11. int64 end = cvGetTickCount();
  12. float time = (end - begin) / (cvGetTickFrequency() * 1000.);
  13. printf("time = %fms\n", time);
  14. imshow("src", src);
  15. imshow("joint", joint);
  16. imshow("jointBilateralFilter", dst);
  17. cv::waitKey(0);
  18. return 0;
  19. }

效果如图:









文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/52839205

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。