Размытие по Гауссу и БПФ

Я пытаюсь реализовать размытие по Гауссу для школьного проекта. Мне нужно сделать как CPU, так и GPU, чтобы сравнить производительность.

Я не совсем уверен, что понимаю, как работает размытие по Гауссу. Итак, один из моих вопросов - правильно ли я это понял?

Вот что я делаю сейчас: я использую уравнение из википедии http://en.wikipedia.org/wiki/Gaussian_blur для расчета фильтра. Для 2d я беру RGB каждого пикселя изображения и применяю к нему фильтр, умножая RGB пикселя и окружающих пикселей на соответствующую позицию фильтра. Затем они суммируются, чтобы получить новые значения RGB пикселя. Для 1d я применяю фильтр сначала по горизонтали, а затем по вертикали, что должно дать тот же результат, если я правильно понимаю. Это точно такой же результат, как и при применении 2-мерного фильтра?

Другой вопрос, который у меня есть, касается того, как можно оптимизировать алгоритм. Я читал, что быстрое преобразование Фурье применимо к размытию по Гауссу. Но я не могу понять, как это связать. Может кто подскажет в правильном направлении?

Спасибо.


person Steffen    schedule 14.10.2011    source источник


Ответы (1)


Да, ядро ​​2D Gaussian является разделяемым, поэтому вы можете просто примените его как два ядра 1D. Обратите внимание, что вы не можете применять эти операции «на месте» - вам нужен хотя бы один временный буфер для хранения результата первого прохода 1D.

Свертка на основе БПФ - полезная оптимизация, когда у вас большие ядра - это применимо к любому типу фильтра, а не только к гауссову. Насколько велик будет «большой», зависит от вашей архитектуры, но вы, вероятно, не захотите беспокоиться об использовании подхода на основе БПФ для чего-то меньшего, чем, скажем, ядро ​​49x49. Общий подход:

  • БПФ изображение
  • БПФ ядро, дополненное до размера изображения
  • умножьте два в частотной области (эквивалент свертки в пространственной области)
  • IFFT (обратное БПФ) результат

Обратите внимание, что если вы применяете один и тот же фильтр к нескольким изображениям, вам нужно только один раз выполнить БПФ заполненного ядра. Тем не менее, у вас все еще есть как минимум два БПФ для выполнения для каждого изображения (одно прямое и одно обратное), поэтому этот метод становится вычислительным выигрышем только для больших ядер.

person Paul R    schedule 14.10.2011
comment
При использовании быстрой свертки с помощью БПФ вам может потребоваться дополнить изображение и ядро ​​до размера изображения + ядра, иначе вы можете получить круговые артефакты обертывания по краям. - person hotpaw2; 14.10.2011
comment
Один из способов избежать этого - установить режим адресации сэмплера так, чтобы он отражал текстуру. - person Mathew Kurian; 06.03.2014
comment
Обратите внимание, что заполнение выполняется до применения БПФ, а умножение - это комплексное умножение. - person Kaaf; 07.03.2021