Может ли кто-нибудь предложить, какая библиотека поддерживает создание гауссового фильтра требуемой длины и сигмы? В основном мне нужна эквивалентная функция для приведенной ниже функции Matlab:
fltr = fspecial('gaussian',[1 n],sd)
Может ли кто-нибудь предложить, какая библиотека поддерживает создание гауссового фильтра требуемой длины и сигмы? В основном мне нужна эквивалентная функция для приведенной ниже функции Matlab:
fltr = fspecial('gaussian',[1 n],sd)
Вам не нужна библиотека для простого одномерного гауссова.
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
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
Попробуй 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])
Если важна скорость выполнения, я настоятельно рекомендую создать фильтр один раз, а затем использовать его на каждой итерации. Оптимизации производятся постоянно, но пару лет назад это значительно ускорило написанный мною код. (Приведенные выше ответы показывают, как создать фильтр).