我从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个矩阵X
和Y
,它们共同为我提供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);
所以基本上,我不理解如何计算高斯距离权重。
答案 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
创建了数组X
和Y
,其中包含沿两个轴从中间像素到每个像素的距离。代码仅将这些权重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)
是中心的像素值。该值越大,用于该像素的权重越低。