Вот несколько вещей, которые вам нужно исправить, чтобы ваш код работал так, как задумано:
- Функция
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](https://i.stack.imgur.com/lfXwl.png)
Обратите внимание, что imgCombined
может содержать значения вне [0,1]
спектр.Затем вам нужно будет решить, как вы хотите изменить масштаб значений, чтобы соответствовать ожидаемому диапазону [0,1]
.
- Масштабирование по умолчанию (в результате на изображении, показанном выше) заключается в линейном масштабировании значений таким образом, чтобы минимальное значение было равно 0, а максимальное значение равно 0.
- Другой способ может заключаться в том, чтобы ограничить значения этим диапазоном (т. Е. Заставить все отрицательные значения равными 0, а все значения больше 1 - 1).
- Наконец, другой подход, который, по-видимому, дает результат, более близкий к предоставленному скриншоту, состоит в том, чтобы взять абсолютное значение с
imgCombined = np.abs(imgCombined)
![enter image description here](https://i.stack.imgur.com/4FLba.png)