Я работаю над приложением для обработки изображений, которое использует дискретное преобразование Фурье для реализации размытия / повышения резкости. Приложение более или менее работает, но кое-что о механике все еще смущает меня.
В частности, так происходит процесс центрирования нулевых частот.
Пример, который я видел, предварительно обрабатывает входное изображение (с интенсивностью оттенков серого), умножая его на матрицу с размером, равным входному изображению, значения которого , где x - строка, y - столбец, поэтому шаблон чередуется 1 и - 1
Согласно примечаниям, это эквивалентно замене квадрантов матрицы путем переворота по осям и y .
Я понимаю, почему это сделано, и я хотел бы подчеркнуть, что я понимаю, что мой код / Фурье работает, я просто не понимаю, почему умножение входной матрицы на 1 / -1 приводит к центрированию нулевой частоты вокруг 0.
Спасибо
источник
Ответы:
Ой! Какой классный трюк! Это работает из-за теоремы о свертке (то есть умножение в пространственной / временной области эквивалентно свертке в частотной области.)
Вот тестовое изображение: . Это преобразование Фурье выглядит так:
Если взять преобразование Фурье переменного изображения ( ), это приводит к одной точке в самом центре преобразования Фурье: . (Вспомните, что мы еще не сделали вращение, поэтому центр преобразования Фурье - это высокие частоты, а низкие частоты по-прежнему находятся в углах.) Но это «ядро вращения!» Свертывание с этим вращением ядра перемещает все вниз и вправо (но вещи, которые падают внизу справа, вращаются в верхнем левом углу).
Свертка исходного изображения с вращением ядра (в области изображения) дает вам: , в то время как свертку преобразованию Фурье изображений с ядром вращения (в частотной области) дает вам: .
И мы можем проверить , что умножение testimage на шахматной доске в области графических изображений дает , что имеет преобразование Фурье: .
источник
fftshift
-подобной функции? Разве в вычислительном отношении не дешевле просто переставить 4 квадранта напрямую?fftshift
это не очень дорого, но этот трюк может иметь лучшее поведение кеша. Пиксельное умножение на самом деле просто переворачивает знак каждого второго пикселя. Такая простая векторизация, что запись чтения-изменения-записи является гарантированным попаданием в кэш, и процессору легко выполнить предварительную выборку операций чтения.Ответ Wandering Logic является правильным и подробным. Просто подумал, что вы захотите увидеть математику вместо картинок:
В результате нулевая частота - которая раньше была с индексом 0 - теперь равна половине ширины изображения (или высоты, в зависимости от того, умножаете ли вы столбцы или строки).
источник