首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用python将一幅图像的相位和不同图像的幅值组合成1幅图像

如何利用python将一幅图像的相位和不同图像的幅值组合成1幅图像
EN

Stack Overflow用户
提问于 2018-09-13 10:45:38
回答 1查看 6.3K关注 0票数 8

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

我得到了图像A和图像B的相位谱和幅值谱。

这是密码。

代码语言:javascript
复制
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))

我想弄清楚,但我还是不知道该怎么做。

下面是我的测试代码。

代码语言:javascript
复制
imgCombined = abs(f) * math.exp(1j*np.angle(f2))

我真希望我能这样出来

EN

回答 1

Stack Overflow用户

发布于 2018-09-14 18:21:35

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

  • math.exp函数支持标量指数。对于按元素计算的矩阵指数,您应该使用numpy.exp代替。
  • 类似地,*算子将尝试执行矩阵乘法。在您的例子中,您希望执行按元素方向的乘法,这可以用np.multiply来完成。

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

代码语言:javascript
复制
combined = np.multiply(np.abs(f), np.exp(1j*np.angle(f2)))

要获得相应的空域图像,则需要计算反变换(并取实数部分,因为存在数值误差导致的残差小虚部):

代码语言:javascript
复制
imgCombined = np.real(np.fft.ifft2(combined))

最后,可以用以下方法显示结果:

代码语言:javascript
复制
import matplotlib.pyplot as plt
plt.imshow(imgCombined, cmap='gray')

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52312053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档