Гауссово размытие с использованием БПФ
Я реализую метод, который размывает изображение с помощью гауссовского типа:
- 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 ответ:
Ваш приведенный выше алгоритм верен с небольшой кавычкой.
Когда вы заполняете изображение нулями, эти нули фактически используются в свертке. В пространстве FFT это добавит огромные компоненты высокой частоты по краям изображения. В пространстве, отличном от FFT, это означает, что до 1-размера ядра на краю, 0 свернуты, что даст вам странные результаты на краю. Люди обычно справляются с этим двумя способами:
- просто выбросьте 1 границу размера ядра вокруг изображения после свертки.
- зеркало края в колодку вместо заполнения его нулями.
Для получения наилучших результатов я часто делаю и 1, и 2 (чтобы получить реальное изображение и устранить высокочастотный край в пространстве Фурье).