Зачем использовать метод величины для получения обработанного изображения? - PullRequest
0 голосов
/ 12 ноября 2018

Привет, ребята, я думаю над этим вопросом:

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

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

И учебник научил получать реальную часть обратного.

ОднакоКогда я прохожу учебник OpenCv , независимо от того, используете ли вы версию OpenCV или NumPy, в конечном итоге они используют magnitude (для OpenCV) или np.abs (для NumPy).

ДляOpenCV, обратный возвращает два канала, которые содержат действительные и мнимые компоненты.Когда я взял реальную часть инверсии, я получил совершенно странное изображение.

Пусть кто-то, кто знает смысл всего этого:

  1. Зачем использовать magnitude или abs чтобы получить обработанное изображение?

  2. Что не так с инструкцией из учебника (взять реальную часть обратного)?

1 Ответ

0 голосов
/ 12 ноября 2018

Учебник правильный, учебник неправильный.

Реальное изображение имеет комплексную сопряженную симметрию в области Фурье .Это означает, что БПФ изображения будет иметь определенную симметрию.Любая обработка, которую вы делаете, должна сохранять эту симметрию, если вы хотите, чтобы обратное преобразование оставалось действительным.Если вы выполните эту обработку неправильно, то обратное преобразование будет иметь комплексное значение и, возможно, не будет иметь смысл.

Если вы правильно сохраните симметрию в области Фурье, тогда мнимая составляющая обратного преобразования будетпочти ноль (вероятно, отличается от нуля из-за численной неточности).Отказ от этого мнимого компонента - правильная вещь.Вычисление величины даст тот же результат, за исключением того, что все отрицательные значения станут положительными (обратите внимание, что некоторые фильтры предназначены для получения отрицательных значений, таких как производные фильтры), и при увеличенных вычислительных затратах.

Например,свертка является умножением в области Фурье.Фильтр в области Фурье должен быть действительным и симметричным относительно начала координат.Часто люди путают, где источник находится в области Фурье, и умножаются на фильтр, который кажется симметричным, но на самом деле смещен относительно источника, делая его не симметричным.Этот сдвиг вводит изменение фазы обратного преобразования (см. Свойство сдвига преобразования Фурье ).На величину обратного преобразования не влияет изменение фазы, поэтому взятие величины этого обратного преобразования дает выход, который выглядит нормально, за исключением случаев, когда ожидают увидеть отрицательные значения в результате фильтра.Было бы лучше правильно понять алгоритм БПФ, создать правильно симметричный фильтр в области Фурье и просто сохранить действительную часть обратного преобразования.

Тем не менее, некоторые фильтры специально предназначены для нарушения симметриии получить комплексный выход фильтра.Например, фильтр Габора имеет четный (симметричный) компонент и нечетный (антисимметричный) компонент.Четный компонент дает действительный результат, нечетный компонент - мнимый результат.В данном случае интерес представляет величина комплексного значения.Аналогично, квадратурный фильтр специально предназначен для получения комплексного результата.На этом выходе аналитический сигнал (или его многомерное расширение, моногенный сигнал), как величина, так и фаза, представляют интерес, например, как используется в согласовании фаз метод обнаружения края.


Глядя на связанный учебник, это строка

fshift[crow-30:crow+30, ccol-30:ccol+30] = 0

, которая генерирует фильтр в области Фурье и применяет его к изображению (это эквивалентноумножение на фильтр с 1 и 0).Этот учебник правильно вычисляет происхождение домена Фурье (хотя для Python 3 вы бы использовали crow,ccol = rows//2 , cols//2, чтобы получить целочисленное деление).Но фильтр выше не является симметричным вокруг этого источника.В Python crow-30:crow+30 обозначает 30 пикселей слева от начала координат и только 29 пикселей справа (правая граница не включена!).Правильный фильтр будет выглядеть так:

fshift[crow-30:crow+30+1, ccol-30:ccol+30+1] = 0

С этим фильтром обратное преобразование является чисто вещественным (мнимый компонент имеет значения порядка 1e-13, что является числовыми ошибками).Таким образом, теперь возможно (и правильно) заменить img_back = np.abs(img_back) на img_back = np.real(img_back).

...