Я пытаюсь сконструировать гауссов фильтр нарезки в Python, чтобы удалить периоди c шум. Я попытался реализовать следующую формулу:
Гауссов фильтр нарезки
А вот код:
import numpy as np
def gaussian_bandpass_filter(image):
image_array = np.array(image)
#Fourier Transform
fourier_transform = np.fft.fftshift(np.fft.fft2(image_array))
#Size of Image
m = np.shape(fourier_transform)[0]
n = np.shape(fourier_transform)[1]
u = np.arange(m)
v = np.arange(n)
# Find the center
u0 = int(m/2)
v0 = int(n/2)
# Bandwidth
D0 = 10
gaussian_filter = np.zeros(np.shape(fourier_transform))
for x in u:
for y in v:
D1 = math.sqrt((x-m/2-u0)**2 + (y-n/2-v0)**2)
D2 = math.sqrt((x-m/2+u0)**2 + (y-n/2+v0)**2)
gaussian_filter[x][y] = 1 - math.exp(-0.5 * D1*D2/(D0**2))
#Apply the filter
fourier_transform = fourier_transform + gaussian_filter
image_array = np.fft.ifft2(np.fft.ifftshift(fourier_transform))
return image_array
предполагается, что эта функция применяет к изображению фильтр Гаусса для меток и возвращает отфильтрованное изображение, но, похоже, оно не работает. Я не знаю, где я ошибся (возможно, я не правильно понял формулу?), Поэтому, если кто-нибудь сможет мне помочь, я буду очень признателен.
Редактировать:
В качестве примера приведем зашумленное изображение . Используя существующую функцию gaussian_filter в библиотеке scipy.ndimage, я получаю this , что приемлемо. Но моя функция возвращает это . (Я использую функцию PIL.Image.fromarray для преобразования массива в изображение)