0

我从维基百科阅读了双边过滤,我理解所有部分(我认为)。

所以我试图理解 Matlab 中的实现,并从这里获取代码。我不明白以下部分:

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 范围从-ww2w+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);

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

4

1 回答 1

1

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

例如,正常的高斯模糊仅根据空间距离对像素进行加权。与原点相距一定距离的像素r将使用 加权exp(-0.5(r/s).^2),其中s是高斯的 sigma(缩放)参数。重要的是,所有权重总和为 1 以使操作成为平均。这可以按如下方式实现(从OP 中链接的 File Exchange 提交修改-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.^2meshgrid创建数组XY包含从中间像素到沿两个轴的每个像素的距离。该代码只是将这些权重G与本地邻域中的图像值相乘,I然后除以权重之和。代码中的复杂性来自处理靠近图像边界的像素。因此,在边界附近,F是 的裁剪版本G,并且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-09-28T15:33:25.150 回答