Медианный фильтр является нелинейным цифровой фильтрацией техник, часто используются для удаления шума из изображения или сигнала. Такое шумоподавление является типичным этапом предварительной обработки для улучшения результатов последующей обработки (например, обнаружения краев на изображении). Медианная фильтрация очень широко используется в обработке цифровых изображений, потому что при определенных условиях она сохраняет края при удалении шума (но см. Обсуждение ниже), а также имеет приложения в обработке сигналов.
Основная идея медианного фильтра состоит в том, чтобы проходить по каждой записи сигнала, заменяя каждую запись медианой соседних записей. Шаблон соседей называется «окном», которое скользит, вход за входом, по всему сигналу. Для одномерных сигналов наиболее очевидным окном являются только несколько первых предшествующих и последующих записей, тогда как для двумерных (или многомерных) данных окно должно включать все записи в пределах заданного радиуса или эллипсоидальной области (т. Е. Медианный фильтр не является отделяемым фильтром ).
Чтобы продемонстрировать, используя размер окна три с одной записью, непосредственно предшествующей и следующей за каждой записью, медианный фильтр будет применен к следующему простому одномерному сигналу:
Итак, медианный отфильтрованный выходной сигнал y будет:
т.е. y = (3, 6, 6, 3).
В приведенном выше примере, поскольку нет записи, предшествующей первому значению, первое значение повторяется, как и последнее значение, чтобы получить достаточно записей для заполнения окна. Это один из способов обработки пропущенных оконных записей на границах сигнала, но есть и другие схемы, которые имеют другие свойства, которые могут быть предпочтительнее в определенных обстоятельствах:
Код для простого двумерного алгоритма медианного фильтра может выглядеть так:
1. allocate outputPixelValue[image width][image height] 2. allocate window[window width × window height] 3. edgex := (window width / 2) rounded down 4. edgey := (window height / 2) rounded down for x from edgex to image width - edgex do for y from edgey to image height - edgey do i = 0 for fx from 0 to window width do for fy from 0 to window height do window[i] := inputPixelValue[x + fx - edgex][y + fy - edgey] i := i + 1 sort entries in window[] outputPixelValue[x][y] := window[window width * window height / 2]
Этот алгоритм:
Как правило, большая часть вычислительных усилий и времени тратится на вычисление медианы каждого окна. Поскольку фильтр должен обрабатывать каждую запись в сигнале, для больших сигналов, таких как изображения, эффективность этого вычисления медианы является критическим фактором при определении того, насколько быстро может работать алгоритм. Наивная реализация, описанная выше, сортирует каждую запись в окне, чтобы найти медиану; однако, поскольку требуется только среднее значение в списке чисел, алгоритмы выбора могут быть гораздо более эффективными. Кроме того, в некоторых типах сигналов (очень часто в случае изображений) используются представления целых чисел: в этих случаях медианы гистограммы могут быть гораздо более эффективными, потому что гистограмму просто обновлять от окна к окну и находить медиану гистограммы. не особо обременительный.
Медианная фильтрация - это один из методов сглаживания, как и линейная гауссова фильтрация. Все методы сглаживания эффективны при удалении шума на гладких участках или гладких участках сигнала, но отрицательно влияют на края. Однако часто одновременно с уменьшением шума в сигнале важно сохранить края. Например, края имеют решающее значение для внешнего вида изображений. Для малых и средних уровней гауссовского шума медианный фильтр явно лучше, чем размытие по Гауссу, при удалении шума при сохранении краев для заданного фиксированного размера окна. Однако его производительность не намного лучше, чем гауссовское размытие для высоких уровней шума, тогда как для спекла шума и соли с перцем шума (импульсный шум), он является особенно эффективным. Из-за этого медианная фильтрация очень широко используется в цифровой обработке изображений.