【问题标题】:How to combine the phase of one image and magnitude of different image into 1 image by using python如何使用python将一张图像的相位和不同图像的大小组合成一张图像
【发布时间】:2019-02-18 02:11:18
【问题描述】:

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

我得到了图像 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 image transform fft


    【解决方案1】:

    以下是您需要修复的一些问题,您的代码才能按预期工作:

    • 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] 范围。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      相关资源
      最近更新 更多