Использование scipy.weave.inline для быстрой 2D медианной фильтрации

У меня есть узкое место в 2D-медианном фильтре (окно 3x3), которое я использую для очень большого набора изображений, и я хотел бы попробовать его оптимизировать. Я протестировал scipy.ndimage median_filter, а также PIL, scipy.signal и scikits-image. Однако, просматривая SO, я узнал, что в C есть быстрый медианный фильтр O (n) (медианная фильтрация в постоянное время, см. Алгоритм скользящей медианы в C), и мне стало интересно, могу ли я реализовать его на Python с помощью scipy.weave.inline? Есть предложения по альтернативному маршруту?


person bla    schedule 26.03.2012    source источник
comment
У меня есть оболочка cython для Perreault + Hebert, Median Filtering in Constant Time, где-то, но это было бы излишним для 3x3, лучше сделать сеть сортировки, 9 входов в 25 сравнениях. Входы 0..255 что ли?   -  person denis    schedule 26.03.2012
comment
Вы просто хотите обработать свой набор изображений? Является ли OpenCV альтернативным маршрутом? Возможно, medianBlure? У вас также есть реализации CUDA и OpenCl.   -  person mfrellum    schedule 27.05.2014
comment
большая часть фреймворка кода уже находится на python, мелкие части находятся в matlab, было бы лучше как-то реализовать эту часть кода на python.   -  person bla    schedule 28.05.2014
comment
@natan OpenCV имеет приятный интерфейс Python для большей части своей функциональности. Например. из документации: Python: cv2.medianBlur (src, ksize [, dst]) → dst   -  person mfrellum    schedule 30.05.2014
comment
Что 1 вы имеете в виду в O(1)? Я не думаю, что вы можете ожидать, что количество пикселей в вашем изображении будет менее линейным.   -  person eickenberg    schedule 30.05.2014
comment
спасибо @mfrellum, я проверю.   -  person bla    schedule 30.05.2014
comment
@eickenberg, я думаю, вы правы, и это означает линейный, так что O (n) - правильный способ написать это?   -  person bla    schedule 31.05.2014


Ответы (3)


Попробуйте следующее: Скользящая медиана в C - реализация Turlach

http://ideone.com/8VVEa

Использование:

Mediator* m = MediatorNew(9);
for (...)
{
      MediatorInsert(m, value);
      median = MediatorMedian(m);
}

Я считаю, что это то же самое, что и алгоритм R, но чище (на самом деле удивительно).

Вы можете обернуть это или перенести и использовать Numba (или Cython). Думаю, я бы порекомендовал Numba вместо Cython, хотя бы потому, что это простой старый код на Python.

Я предлагаю добавить это в scikits, если он уже работает быстрее, чем в scikits :)

person Alex I    schedule 01.06.2014
comment
спасибо Алекс, я еще не пробовал, но выглядит многообещающе. - person bla; 03.06.2014

Если вам все еще интересно, я бы попробовал numpy reshape и median:

a= some big array
a.reshape(N,3,3) #N being specific to your array
[numpy.median(m) for m in a]

Я не знаю, как это масштабируется по сравнению с вашими тестовыми методами, но если вы хотите оптимизировать с помощью C, вы можете закрепить цикл for в понимании списка ...

person BandGap    schedule 02.04.2012
comment
Это изящно, но, к сожалению, вычисляет медиану всех неперекрывающихся 3x3, а не всех возможных 3x3. - person Alex I; 01.06.2014

Я не знаю базовый алгоритм, но у scikits-image есть скользящий медианный фильтр.

В противном случае я бы порекомендовал написать его на Cython (язык pidgin C / Python). Обязательно ознакомьтесь с примером / руководством по свертке для работы с массивами numpy.

person matt    schedule 26.03.2012
comment
Спасибо, я разберусь. Кроме того, написав 3x3, я имел в виду, что средний размер окна составляет 3x3, фактическое изображение, в котором оно используется, имеет размер в мегапиксели. - person bla; 26.03.2012
comment
Что ж, кажется, что scikits даже медленнее, чем PIL и scipy.ndimage. К сожалению, изображения, над которыми я работаю, являются 16-битными, поэтому параметр 0..255 не имеет значения. Следующий Cython ... - person bla; 27.03.2012