У меня есть узкое место в 2D-медианном фильтре (окно 3x3), которое я использую для очень большого набора изображений, и я хотел бы попробовать его оптимизировать. Я протестировал scipy.ndimage median_filter, а также PIL, scipy.signal и scikits-image. Однако, просматривая SO, я узнал, что в C есть быстрый медианный фильтр O (n) (медианная фильтрация в постоянное время, см. Алгоритм скользящей медианы в C), и мне стало интересно, могу ли я реализовать его на Python с помощью scipy.weave.inline? Есть предложения по альтернативному маршруту?
Вопрос
Использование scipy.weave.inline для быстрой 2D медианной фильтрации
- У меня есть оболочка 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
Ответы
Ответ 1 · рейтинг 3 · Alex I
Попробуйте следующее: Скользящая медиана в C - реализация Turlach
Использование:
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.
Похожие материалы
- Изучение гиперболоида двух листов: путешествие по трехмерной геометрии
- Включайте и выключайте свет с помощью бота Telegram, используя Python и Heroku
- Освоение Python для анализа данных в цифровом маркетинге
- Принимая мою страсть: путь к тому, чтобы стать младшим разработчиком Python
- Интерполяция с помощью matplotlib pcolor
- Вычислить внешнее произведение массивов с произвольными размерами