Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: blaОтветов: 3

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

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

pythonscipyfilteringmedianimage-processing

Ответы

Ответ 1 · рейтинг 3 · Alex I

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

Если вам все еще интересно, я бы попробовал 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 в понимании списка ...

Ответ 3 · рейтинг 1 · matt

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы