如何使用python将一张图像的相位和不同图像的幅度合并为一张图像

DEN*_* LI 6 python image fft transform

我想将一张图像的相位谱和不同图像的幅度谱组合成一张图像。

我已经得到了图像 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))
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚,但我仍然不知道该怎么做。

下面是我的测试代码。

imgCombined = abs(f) * math.exp(1j*np.angle(f2))
Run Code Online (Sandbox Code Playgroud)

我希望我能像那样出来

在此处输入图片说明

Sle*_*Eye 6

为了让代码按预期工作,您需要修复以下几点:

  • math.exp函数支持标量求幂。对于逐元素矩阵求幂,您应该numpy.exp改用。
  • 类似地,*操作员会尝试执行矩阵乘法。在您的情况下,您想要执行元素乘法,这可以通过np.multiply

通过这些修复,您应该得到如下频域组合矩阵:

combined = np.multiply(np.abs(f), np.exp(1j*np.angle(f2)))
Run Code Online (Sandbox Code Playgroud)

要获得相应的空间域图像,您需要使用以下方法计算逆变换(并取实部,因为由于数值误差,我有剩余的小虚部):

imgCombined = np.real(np.fft.ifft2(combined))
Run Code Online (Sandbox Code Playgroud)

最后,结果可以显示为:

import matplotlib.pyplot as plt
plt.imshow(imgCombined, cmap='gray')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

请注意,imgCombined可能包含超出[0,1]范围的值。然后,您需要决定如何重新调整值以适应预期[0,1]范围。

  • 默认缩放(如上图所示)是线性缩放值,使得最小值设置为 0,最大值设置为 0。
  • 另一种方法是将值限制在该范围内(即强制所有负值为 0,所有大于 1 的值都为 1)。
  • 最后,另一种方法似乎提供了更接近于提供的屏幕截图的结果,将采用绝对值 imgCombined = np.abs(imgCombined)

在此处输入图片说明