Как объединить фазу одного изображения и величину другого изображения в 1 изображение с помощью Python - PullRequest
0 голосов
/ 13 сентября 2018

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

У меня есть фазовый спектр и спектр величин изображения A и изображения B.

Вот код.

f = np.fft.fft2(grayA)
fshift1 = np.fft.fftshift(f)
phase_spectrumA = np.angle(fshift1)
magnitude_spectrumB = 20*np.log(np.abs(fshift1))

f2 = np.fft.fft2(grayB)
fshift2 = np.fft.fftshift(f2)
phase_spectrumB = np.angle(fshift2)
magnitude_spectrumB = 20*np.log(np.abs(fshift2))

Я пытаюсь понять, но все же я не знаю, как это сделать.

Ниже приведен мой тестовый код.

imgCombined = abs(f) * math.exp(1j*np.angle(f2))

Хотел бы я выйти таким же образом

enter image description here

1 Ответ

0 голосов
/ 14 сентября 2018

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

  • Функция math.exp поддерживает скалярное возведение в степень.Для поэлементного возведения в степень матрицы вы должны использовать numpy.exp.
  • Similary, оператор * попытается выполнить умножение матриц.В вашем случае вы хотите вместо этого выполнить поэлементное умножение, которое можно выполнить с помощью np.multiply

С этими исправлениями вы должны получить комбинированную матрицу частотной области следующим образом:

combined = np.multiply(np.abs(f), np.exp(1j*np.angle(f2)))

Чтобы получить соответствующее изображение в пространственной области, вам нужно будет вычислить обратное преобразование (и взять действительную часть, поскольку могут быть остаточные маленькие мнимые части из-за числовых ошибок) с:

imgCombined = np.real(np.fft.ifft2(combined))

Наконец, результат может быть показан с помощью:

import matplotlib.pyplot as plt
plt.imshow(imgCombined, cmap='gray')

enter image description here

Обратите внимание, что imgCombined может содержать значения вне [0,1] спектр.Затем вам нужно будет решить, как вы хотите изменить масштаб значений, чтобы соответствовать ожидаемому диапазону [0,1].

  • Масштабирование по умолчанию (в результате на изображении, показанном выше) заключается в линейном масштабировании значений таким образом, чтобы минимальное значение было равно 0, а максимальное значение равно 0.
  • Другой способ может заключаться в том, чтобы ограничить значения этим диапазоном (т. Е. Заставить все отрицательные значения равными 0, а все значения больше 1 - 1).
  • Наконец, другой подход, который, по-видимому, дает результат, более близкий к предоставленному скриншоту, состоит в том, чтобы взять абсолютное значение с imgCombined = np.abs(imgCombined)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...