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

Вопрос

Создание фильтра Гаусса необходимой длины в python

Автор вопроса: user1482980Ответов: 4

Может ли кто-нибудь предложить, какая библиотека поддерживает создание гауссового фильтра требуемой длины и сигмы? В основном мне нужна эквивалентная функция для приведенной ниже функции Matlab:

fltr = fspecial('gaussian',[1 n],sd)

pythonscipy

Ответы

Ответ 1 · рейтинг 13 · Junuxx

Вам не нужна библиотека для простого одномерного гауссова.

from math import pi, sqrt, exp

def gauss(n=11,sigma=1):
    r = range(-int(n/2),int(n/2)+1)
    return [1 / (sigma * sqrt(2*pi)) * exp(-float(x)**2/(2*sigma**2)) for x in r]

Примечание. Это всегда будет возвращать список нечетной длины с центром вокруг 0. Я полагаю, что могут быть ситуации, когда вам понадобится гауссиана четной длины со значениями для x = [..., -1,5, -0,5, 0,5, 1,5, ...], но в этом случае вам понадобится немного другая формула, и я оставлю это вам;)

Пример вывода со значениями по умолчанию n = 11, sigma = 1:

>>> g = gauss()
1.48671951473e-06
0.000133830225765
0.00443184841194
0.0539909665132
0.241970724519
0.398942280401
0.241970724519
0.0539909665132
0.00443184841194
0.000133830225765
1.48671951473e-06

>>> sum(g)
0.99999999318053079

Ответ 2 · рейтинг 6 · IanVS

Возможно scipy.ndimage.filters.gaussian_filter? Я никогда не использовал его, но документация находится по адресу: https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.ndimage.filters.gaussian_filter.html

Ответ 3 · рейтинг 3 · quazgar

Попробуй scipy.ndimage.gaussian_filter, а ты точно ядро ​​хочешь или еще и применить? (В этом случае вы можете просто использовать эту функцию.) В первом случае примените фильтр к массиву, который равен 0 везде, но с 1 в центре. Для более легкого для написания случая 1d это будет, например:

>>> ndimage.gaussian_filter1d(np.float_([0,0,0,0,1,0,0,0,0]), 1)
array([  1.33830625e-04,   4.43186162e-03,   5.39911274e-02,
         2.41971446e-01,   3.98943469e-01,   2.41971446e-01,
         5.39911274e-02,   4.43186162e-03,   1.33830625e-04])

Ответ 4 · Dan Erez

Если важна скорость выполнения, я настоятельно рекомендую создать фильтр один раз, а затем использовать его на каждой итерации. Оптимизации производятся постоянно, но пару лет назад это значительно ускорило написанный мною код. (Приведенные выше ответы показывают, как создать фильтр).

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

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