我想将一幅图像的相位谱和另一幅图​​像的幅值谱合并为一幅图像。

我得到了图像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))

我希望我能像那样出来

python - 如何使用python将一幅图像的相位和另一幅图​​像的幅值合并为一张图像-LMLPHP

最佳答案

为了使代码按预期工作,您需要修复以下几件事:

  • 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')
    

    python - 如何使用python将一幅图像的相位和另一幅图​​像的幅值合并为一张图像-LMLPHP

    请注意,imgCombined可能包含[0,1]范围之外的值。然后,您需要确定如何重新缩放值以适合预期的[0,1]范围。
  • 默认缩放比例(结果如上图所示)是线性缩放值,以使最小值设置为0,最大值设置为0。
  • 另一种方法可能是将值限制在该范围内(即,将所有负值强制为0,并且将所有大于1的值强制为1)。
  • 最后,另一种方法似乎提供的结果更接近所提供的屏幕截图,那就是使用imgCombined = np.abs(imgCombined)的绝对值

  • python - 如何使用python将一幅图像的相位和另一幅图​​像的幅值合并为一张图像-LMLPHP

    10-07 16:01
    查看更多