Гауссово размытие с использованием БПФ


Я реализую метод, который размывает изображение с помощью гауссовского типа:

- image I , size = WxH
- kernel K , size = MxM
- padded the kernel PD to the size of the image
  i.e for an image 5x5 and a kernel 3x3 after padding the kernel looks like:
    0 0 0 0 0
    0 x x x 0
    0 x x x 0
    0 x x x 0
    0 0 0 0 0 
where X is the value from the original kernel
- performed 2d fft on the padded kernel PD (FFT_K)
- performed 2d fft on the image I (FFT_I)
- multiplied FFT_I * FFT_K (FFT_RES)
- perfomed fft on FFT_RES
- shifted the FFT_RES (RESULT)

Результат содержит некоторое сглаживание по краям.

Вот результат:

Введите описание изображения здесь

Если вы обратите внимание на правильное изображение, вы увидите, что оно имеет псевдонимы в обоих измерениях.

Верен ли приведенный выше алгоритм?

Реализация осуществляется с помощью C++ и fftw3.

1 2

1 ответ:

Ваш приведенный выше алгоритм верен с небольшой кавычкой.

Когда вы заполняете изображение нулями, эти нули фактически используются в свертке. В пространстве FFT это добавит огромные компоненты высокой частоты по краям изображения. В пространстве, отличном от FFT, это означает, что до 1-размера ядра на краю, 0 свернуты, что даст вам странные результаты на краю. Люди обычно справляются с этим двумя способами:

  1. просто выбросьте 1 границу размера ядра вокруг изображения после свертки.
  2. зеркало края в колодку вместо заполнения его нулями.

Для получения наилучших результатов я часто делаю и 1, и 2 (чтобы получить реальное изображение и устранить высокочастотный край в пространстве Фурье).