У меня есть узкое место в 2D-медианном фильтре (окно 3x3), которое я использую для очень большого набора изображений, и я хотел бы попробовать его оптимизировать. Я протестировал scipy.ndimage
median_filter, а также PIL
, scipy.signal
и scikits-image
. Однако, просматривая SO, я узнал, что в C есть быстрый медианный фильтр O (n) (медианная фильтрация в постоянное время, см. Алгоритм скользящей медианы в C), и мне стало интересно, могу ли я реализовать его на Python с помощью scipy.weave.inline? Есть предложения по альтернативному маршруту?
Использование scipy.weave.inline для быстрой 2D медианной фильтрации
Ответы (3)
Попробуйте следующее: Скользящая медиана в C - реализация Turlach
Использование:
Mediator* m = MediatorNew(9);
for (...)
{
MediatorInsert(m, value);
median = MediatorMedian(m);
}
Я считаю, что это то же самое, что и алгоритм R, но чище (на самом деле удивительно).
Вы можете обернуть это или перенести и использовать Numba (или Cython). Думаю, я бы порекомендовал Numba вместо Cython, хотя бы потому, что это простой старый код на Python.
Я предлагаю добавить это в scikits, если он уже работает быстрее, чем в scikits :)
Если вам все еще интересно, я бы попробовал 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 в понимании списка ...
Я не знаю базовый алгоритм, но у scikits-image есть скользящий медианный фильтр.
В противном случае я бы порекомендовал написать его на Cython (язык pidgin C / Python). Обязательно ознакомьтесь с примером / руководством по свертке для работы с массивами numpy.
O(1)
? Я не думаю, что вы можете ожидать, что количество пикселей в вашем изображении будет менее линейным. - person eickenberg   schedule 30.05.2014