Как рассчитывается вес гауссовского расстояния в этом коде двустороннего фильтра? - PullRequest
0 голосов
/ 28 сентября 2018

Я прочитал о двусторонней фильтрации из Википедии, все части которой я понимаю (я думаю).

Так что я пытаюсь понять реализацию в 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 матрицы 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);

Так что, в принципе, я не понимаю, как рассчитываются гауссовые веса расстояний.

1 Ответ

0 голосов
/ 28 сентября 2018

Двусторонний фильтр вычисляет средневзвешенное значение пикселей в окрестности каждого пикселя.Как и большинство других фильтров размытия.Разница с двусторонним фильтром заключается в том, что при взвешивании учитывается как пространственное расстояние , так и тональное (интенсивное) расстояние.

Например, обычное размытие по Гауссу взвешивает пиксели на основе пространственноготолько расстояниеПиксель, который находится на расстоянии r от начала координат, будет взвешен с exp(-0.5(r/s).^2), где s - параметр сигма (масштабирования) гауссиана.Важно, чтобы все веса составляли до одного, чтобы операция была усреднением.Это может быть реализовано следующим образом (изменено с Отправка файлового обмена, связанная с 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) - значение пикселя вцентр.Чем больше это значение, тем меньше вес, используемый для этого пикселя.

...