【问题标题】:How is the Gaussian distance weight being calculated in this bilateral filter code?在这个双边滤波器代码中,高斯距离权重是如何计算的?
【发布时间】:2019-03-04 12:08:08
【问题描述】:

我从 Wikipedia 阅读了双边过滤,我理解了其中的所有部分(我认为)。

所以我试图了解 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 函数将为我们提供 2 个矩阵 XY,它们一起将给我所有可能的 x 和 y 坐标组合,范围从 -ww(其中 @987654328 @ 是内核的窗口大小)。但我不明白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);

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

【问题讨论】:

  • 我到底是什么? (在 H 公式中) i 用于 w 哪里?
  • 这只是计算本地邻域的空间权重。我认为它已被所有社区重复使用,因此 i 和 j 不是必需的。
  • @PabloJeken I 是原始图像,(i,j) 是我们要过滤的像素,(k,l) 是相邻像素
  • 你所说的对我来说实际上是有道理的,但我不太明白什么是空间权重以及它们的用途..任何指针? @CrisLuengo

标签: matlab image-processing filtering


【解决方案1】:

双边滤波器计算每个像素附近像素的加权平均值。就像大多数其他模糊滤镜一样。与双边滤波器的不同之处在于它在称重时同时考虑了空间距离色调(强度)距离。

例如,正常的高斯模糊仅根据空间距离对像素进行加权。距离原点r 的像素将使用exp(-0.5(r/s).^2) 加权,其中s 是高斯的sigma(缩放)参数。重要的是,所有权重总和为 1 以使操作成为平均。这可以实现如下(修改自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 创建数组 XY 包含从中间像素到沿两个轴的每个像素的距离。代码只是将这些权重 G 与本地邻域中的图像值 I 相乘,然后除以权重之和。代码中的复杂性来自处理靠近图像边界的像素。因此,在边界附近,FG 的裁剪版本,并且I 也被提取以避免越界索引。 “计算”G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1) 就是这种裁剪,以在图像边缘附近获得正确大小的邻域。

双边滤镜现在添加了基于色调距离(即灰度值图像的强度差异)的权重。内核F通过乘以修改:

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

现在的距离是I-A(i,j) -- I 是邻域的像素值,A(i,j) 是中心的像素值。该值越大,用于该像素的权重越低。

【讨论】:

  • 我错过了一点,即使内核在整个图像上移动,相邻像素与中心像素的距离始终保持不变。非常感谢您花时间好好解释。
猜你喜欢
  • 2018-04-02
  • 1970-01-01
  • 2019-05-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多