如何利用python将一幅图像的相位和不同图像的幅度合成一幅图像

2024-06-09 09:51:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把一幅图像的相位谱和不同图像的幅度谱合成一幅图像。在

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

我想弄明白,但还是不知道该怎么做。在

下面是我的测试代码。在

^{pr2}$

我希望我能像那样出来

enter image description here


Tags: 图像fftlognpabsf2angle幅度
1条回答
网友
1楼 · 发布于 2024-06-09 09:51:18

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

  • ^{}函数支持标量求幂。对于元素矩阵求幂,应该使用^{}。在
  • 类似地,*运算符将尝试执行矩阵乘法。在您的例子中,您希望执行元素级乘法,这可以用^{}完成

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

combined = np.multiply(np.abs(f), np.exp(1j*np.angle(f2)))

为了获得相应的空间域图像,您需要计算反变换(由于数值误差,可能会有剩余的小虚部,所以取实部):

^{pr2}$

最后,结果可显示为:

import matplotlib.pyplot as plt
plt.imshow(imgCombined, cmap='gray')

enter image description here

请注意,imgCombined可能包含[0,1]范围之外的值。然后,您需要决定如何重新缩放值以适应预期的[0,1]范围。在

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

enter image description here

相关问题 更多 >