我想将一幅图像的相位谱和不同图像的幅度谱组合成一幅图像。
我得到了图像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))
我希望我能就这样出来
为了使代码按预期工作,您需要修复以下几件事:
- The math.exp https://docs.python.org/2/library/math.html#math.exp函数支持标量求幂。对于逐元素矩阵求幂,您应该使用numpy.exp https://docs.scipy.org/doc/numpy/reference/generated/numpy.exp.html反而。
- 类似地,
*
运算符将尝试执行矩阵乘法。在您的情况下,您想要执行逐元素乘法,这可以通过np.multiply https://docs.scipy.org/doc/numpy/reference/generated/numpy.multiply.html
通过这些修复,您应该得到频域组合矩阵,如下所示:
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]
range.
- 默认缩放(如上图所示)是线性缩放值,使得最小值设置为 0,最大值设置为 0。
- 另一种方法可能是将值限制在该范围内(即将所有负值强制为 0,将所有大于 1 的值强制为 1)。
- 最后,另一种方法似乎提供的结果更接近所提供的屏幕截图,即采用以下绝对值
imgCombined = np.abs(imgCombined)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)