在此双边滤波器代码中如何计算高斯距离权重?

时间:2018-09-28 13:16:19

标签: matlab image-processing filtering

我从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(其中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 个答案:

答案 0 :(得分:1)

双边滤波器计算每个像素附近的像素的加权平均值。就像大多数其他模糊滤镜一样。与双边过滤器的区别在于,称量时会同时考虑空间距离音调(强度)距离。

例如,正常的高斯模糊仅基于空间距离对像素加权。与原点距离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创建了数组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)是中心的像素值。该值越大,用于该像素的权重越低。