Если вы пытаетесь применить медианный фильтр в плоскости x-y, рассмотрите возможность использования medfilt2
из панели инструментов обработки изображений. Обратите внимание, что эта функция принимает только двумерные входы, поэтому вам придется перебрать третье измерение.
Также обратите внимание, что medfilt2
предполагает, что данные x и y расположены равномерно, поэтому, если ваши данные x и y не попадают в равномерно распределенную сетку, вам, возможно, придется вручную зацикливать индексы, извлекать соответствующие патчи, и вычислите медиану.
Если вы можете / хотите применить усредняющий фильтр вместо медианного фильтра и если у вас есть равномерно распределенные данные, вы можете использовать convn
для вычисления k x k
скользящего среднего, выполнив:
y = convn(x, ones(k,k)/(k*k), 'same');
Обратите внимание, что вы получите некоторый уклон на границах, потому что технически вы пытаетесь вычислить в среднем k^2
пикселей, когда у вас меньше этого числа доступных значений.
В качестве альтернативы, вы можете использовать вложенные вызовы к movmean
, поскольку операция усреднения отделима:
y = movmean(movmean(x, k, 2), k, 1);
Если ваша сетка является отделимой, но не однородной, вы все равно можете использовать movmean
, просто используйте SamplePoints
пару имя-значение:
y = movmean(movmean(x, k, 2, 'SamplePoints', yv), k, 1, 'SamplePoints', xv);
Вы также можете управлять обработкой конечной точки в movmean
с помощью пары Endpoints
имя-значение.