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

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

Ответы [ 3 ]

3 голосов
/ 01 июня 2014

Попробуйте: Скользящая медиана в 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:)

2 голосов
/ 02 апреля 2012

Если вы все еще заинтересованы, я бы попробовал изменить форму и медиану numpy:

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

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

1 голос
/ 26 марта 2012

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

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

...