代码之家  ›  专栏  ›  技术社区  ›  momo

如何在这个双边滤波码中计算高斯距离权重?

  •  0
  • momo  · 技术社区  · 7 年前

    我从维基百科上读到了双边过滤的内容,我想我理解了其中的一部分。

    所以我试图理解Matlab的实现,并从 here . 我不明白以下部分:

    function B = bfltGray(A,w,sigma_d,sigma_r)
    
    % Pre-compute Gaussian distance weights.
    [X,Y] = meshgrid(-w:w,-w:w);
    G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
    

    我知道 meshgrid X Y -w w (其中 2w+1 是内核的窗口大小)。但我不明白什么 G = exp(-(X.^2+Y.^2)/(2*sigma_d^2)); 完成。因为对于(i,j)的空间权重,每个相邻像素(k,l)的贡献如下

    w(i,j,k,l) = exp(-((i-k)^2+(j-l)^2)/sigma_d^2)
    

    在代码中,我理解高斯强度权重是如何计算的,因为它是一次完成的,就像:

     % Compute Gaussian intensity weights.
     H = exp(-(I-A(i,j)).^2/(2*sigma_r^2));
    

    而对于高斯距离权重,再次进行一些计算:

    % Calculate bilateral filter response.
    F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);
    

    所以基本上,我不明白高斯距离权重是如何计算的。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Cris Luengo    7 年前

    称重时考虑的音调(强度)距离。

    例如,普通高斯模糊仅基于空间距离对像素进行加权。远处的像素 r 从原点算起 exp(-0.5(r/s).^2) s 是高斯函数的sigma(缩放)参数。重要的是,所有的权重加起来就是一个操作的平均值。这可以实现如下(从 the File Exchange submission linked in the OP -- A 是输入图像):

    [X,Y] = meshgrid(-w:w,-w:w);
    G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
    
    dim = size(A);
    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 = A(iMin:iMax,jMin:jMax);
        % Calculate Gaussian filter response.
        F = G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);
        B(i,j) = sum(F(:).*I(:))/sum(F(:));
      end
    end
    

    这个 r^2 X.^2+Y.^2 . meshgrid 已创建数组 X Y 包含从中间像素到沿两个轴的每个像素的距离。代码只是将这些权重相乘 G 用当地社区的图像值 I 除以重量之和。代码的复杂性来自于处理靠近图像边界的像素。因此,在边境附近, F G ,和 G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1) 简单的裁剪就是在图像边缘附近获得合适大小的邻域。

    双边滤波器现在根据色调距离(即灰度值图像的强度差)添加权重。内核 将其乘以:

    H = exp(-(I-A(i,j)).^2/(2*sigma_r^2));
    

    现在的距离是 I-A(i,j) -- 是邻域中的像素值,并且 A(i,j)