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

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

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

person user1482980    schedule 26.06.2012    source источник


Ответы (4)


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

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
person Junuxx    schedule 26.06.2012
comment
Я ожидал, что он вернет что-то вроде гуассовой кривой после plt.hist(g), но это наполовину предположение - person Moj; 12.12.2012
comment
Отличный, простой ответ! Всегда предпочтительнее избегать использования библиотек, когда это возможно, чтобы вы действительно понимали, что происходит в вашем коде :). В случае четного n нужно изменить только r = np.linspace(-int(n/2)+0.5,int(n/2)-0.5, n) . - person Tropilio; 05.07.2019

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

person IanVS    schedule 26.06.2012

Попробуй 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])
person quazgar    schedule 15.11.2013

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

person Dan Erez    schedule 26.04.2018