我想将一幅图像的相位谱和另一幅图像的幅值谱合并为一幅图像。
我得到了图像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))
我希望我能像那样出来
最佳答案
为了使代码按预期工作,您需要修复以下几件事:
math.exp
函数支持标量求幂。对于逐元素矩阵求幂,应改为使用 numpy.exp
。 *
运算符将尝试执行矩阵乘法。在您的情况下,您想改为执行按元素乘法,可以使用 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')
请注意,
imgCombined
可能包含[0,1]
范围之外的值。然后,您需要确定如何重新缩放值以适合预期的[0,1]
范围。imgCombined = np.abs(imgCombined)
的绝对值