Двусторонний фильтр вычисляет средневзвешенное значение пикселей в окрестности каждого пикселя.Как и большинство других фильтров размытия.Разница с двусторонним фильтром заключается в том, что при взвешивании учитывается как пространственное расстояние , так и тональное (интенсивное) расстояние.
Например, обычное размытие по Гауссу взвешивает пиксели на основе пространственноготолько расстояниеПиксель, который находится на расстоянии 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)
- значение пикселя вцентр.Чем больше это значение, тем меньше вес, используемый для этого пикселя.