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

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

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


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


image.png

image.png

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

再看JBF,如(2)所示,


image.png

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

JBF的原理图,如图(1)所示。

image.png

图(1)JBF原理图

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


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

function B = jbfltGray(D,C,w,sigma_d,sigma_r)
%    D should be a double precision matrix of size NxMx1 (i.e., grayscale)  with normalized values in the 
%    closed interval [0,1]. 
%    C should be similar to D, from which the weights are calculated, with normalized values in the
%   closed interval [0,1]. 
% Pre-compute Gaussian distance weights.
[X,Y] = meshgrid(-w:w,-w:w);
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
% Apply bilateral filter.
dim = size(D);
B = zeros(dim);
for i = 1:dim(1)
   for j = 1:dim(2)      
         % Extract local region.
         iMin = max(i-w,1);
         iMax = min(i+w,dim(1));
         jMin = max(j-w,1);
         jMax = min(j+w,dim(2));
         I = D(iMin:iMax,jMin:jMax); 
         % To compute weights from the color image
         J = C(iMin:iMax,jMin:jMax);
         % Compute Gaussian intensity weights according to the color image
         H = exp(-(J-C(i,j)).^2/(2*sigma_r^2));
         % Calculate bilateral filter response.
         F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);
         B(i,j) = sum(F(:).*I(:))/sum(F(:));   
   end
end

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



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

 


image.png

image.png


OpenCV的代码:

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <ximgproc.hpp>
int main()
{
  cv::Mat src = cv::imread("data/dp.png", 1); // 原始带噪声的深度图
  cv::Mat joint = cv::imread("data/teddy.png", 0);
  cv::Mat dst;
  int64 begin = cvGetTickCount();
  cv::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);
  cv::waitKey(0);
    return 0;
}

效果如图:

image.png


延伸阅读: 导向滤波器(Guided Filter)

目录
相关文章
|
C++ 计算机视觉
OpenCV-巴特沃斯低通&高通滤波器(C++)
OpenCV-巴特沃斯低通&高通滤波器(C++)
364 0
|
7月前
|
算法 计算机视觉 Python
OpenCV高斯滤波器、双边滤波器的讲解与实战(附Python源码)
OpenCV高斯滤波器、双边滤波器的讲解与实战(附Python源码)
333 0
|
C++ 计算机视觉
OpenCV-高斯低通&高通滤波器(C++)
OpenCV-高斯低通&高通滤波器(C++)
313 0
|
资源调度 计算机视觉
【OpenCV图像处理6】滤波器(上)
【OpenCV图像处理6】滤波器(上)
147 1
|
资源调度 算法 计算机视觉
【OpenCV图像处理6】滤波器(下)
【OpenCV图像处理6】滤波器(下)
160 0
【OpenCV图像处理6】滤波器(下)
|
资源调度 API 计算机视觉
OpenCV(图像处理)-基于Oython-滤波器(低通、高通滤波器的使用方法)
OpenCV(图像处理)-基于Oython-滤波器(低通、高通滤波器的使用方法)
170 0
|
计算机视觉
Scharr与Laplacian滤波器---OpenCV-Python开发指南(21)
Scharr与Laplacian滤波器---OpenCV-Python开发指南(21)
212 0
Scharr与Laplacian滤波器---OpenCV-Python开发指南(21)
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
559 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
3月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
56 4
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制