Как применить скользящий медианный фильтр к временному ряду 2D-сканов в Matlab? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть огромный набор данных о временном интервале двухмерных лазерных сканирований волн, бегущих вверх и вниз по лестнице (см. рис.1 рис.2 рис.3 ). На снимках много шума, так как вода много брызгает. Теперь я хочу сгладить сканы.

У меня есть 2 вопроса:

  1. Как мне применить фильтр движущейся медианы (как рекомендовано в другом исследовании, посвященном аналогичной проблеме)? Я могу найти только инструкции для одного, например (x, y) или (t, y) графики, но не для значений x и y, которые изменяются во времени. Может быть, средний фильтр тоже это сделает, но я и понятия не имею об этом.

  2. Сканер находится в фиксированной точке (222 м), поэтому все всплески данных указывают на эту точку на потолке. Возможно или необходимо включить это в процесс сглаживания?

Это часть кода (надеюсь, этого достаточно, чтобы его получить):

% Plot data as real time profile
x1=data.x;y1=data.y;
t=data.t;
% add moving median filter here?
h1=plot(x1(1,:),y1(1,:));
axis([210 235 3 9]) 
ht=title('Scanner data');
for i=1:1:length(t);    
set(h1,'XData',x1(i,:),'YData',y1(i,:));set(ht,'String',sprintf('t = %5.2f 
s',data.t(i)));pause(.01);end

Значения data.x хранятся в матрице (mxn), в которой изменение во времени располагается вертикально, а значения x, то есть «лазерные точки» сканера, располагаются горизонтально. Data.y хранится таким же образом. Значения data.t хранятся в матрице (mx1).

Надеюсь, я все четко объяснил и что кто-то может мне помочь. Я уже очень отчаялся по этому поводу ... Если что-то упущено или запутано, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 05 июля 2018

Если вы пытаетесь применить медианный фильтр в плоскости 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 имя-значение.

...