python - Matplotlib imshow 反转二维 IFFT 数组的颜色

标签 python numpy matplotlib scipy fft

我一直在做一些使用 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。

First image Second image

最佳答案

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/

相关文章:

matplotlib - savefig 错误

python - ValueError : view limit minimum -0. 001 小于 1 并且是无效的 Matplotlib 日期值

python - 有没有办法在不调用 __init__ 的情况下实例化一个类?

python - 理解 Python 中的元类和继承

python - python中两个numpy数组之间的区别

python - 向量和数组的 np array 点积

python - 仅绘制某些日子的 Pandas 数据框

python - 在列表理解中使用 sum() 时出错

Python - 如何沿给定轴寻址数组?

python - 根据权重从python列表列表中随机选择列表