我一直在做一些使用 2D Scipy FFT 对图像进行反卷积的工作。然而,Matplotlib 无缘无故地反转了生成的 IFFT 数组的配色方案,即使 RGB 值是正确的。
import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
image = mpimg.imread("C:/Users/-----/Desktop/image.jpg")
freq = fftpack.fft2(image)
IFFT = fftpack.ifft2(freq)
IFFT = IFFT.astype('float32')
plt.figure(1)
plt.imshow(image)
plt.figure(2)
plt.imshow(IFFT)
plt.show()
根据 numpy.array_equal,IFFT 数组和图像数组是相等的,但第二个图形的颜色图总是反转的。请参阅所附图片。这些数组实际上是相同的,没有指定其他颜色图,但我不得不使用类似这样的方法手动反转所有内容:
for i in range(0, freq.shape[1]):
for j in range (0, freq.shape[0]):
for k in range(0,3):
freq[j,i,k] = 255-freq[j,i,k]
我想知道 astype 转换为 float32(或更早的 uint32)是否会改变某些东西,但由于数组是相同的,所以我不知道。
有什么想法吗?如果从数组中的每个条目中手动减去 255 是一种更有效的替代方法,我还想弄清楚如何反转整个 cmap。
最佳答案
plt.imshow() 需要整数。
但是,我注意到即使两个整数数组看起来相同,但它们可能具有不同类型的整数。
在我的例子中,当查看“正确”数组(即颜色正确显示的数组)中的整数类型时,我得到: 类“numpy.uint8”
而当查看 plt.imshow() 中颜色反转的数组中的整数类型时,我得到: 类'numpy.int64'
我需要做的就是将数组值转换为 uint8:
image = image.astype(np.uint8)
关于python - Matplotlib imshow 反转二维 IFFT 数组的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36137980/