Matplotlib imshow反转2D IFFT数组的颜色

3

我一直在使用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)是否可能会改变一些东西,但由于数组相同,我不知道。
有什么想法吗?我还想弄清楚如何反转整个cmap,如果这是手动从数组中减去255的更有效的替代方法。

First image Second image


IFFT2的结果是否为虚数?如果是,请勿进行转换并尝试绘制IFFT的幅度(绝对值)。 - Suever
一些RGB值确实具有虚部,但即使使用np.absolute而不是类型转换,颜色仍然会反转。我之前没有考虑到这一点,所以谢谢你。一个奇怪的问题。 - JAustin
2个回答

7

plt.imshow() 函数要求传入整数类型。

然而,我注意到即使两个整数数组看起来相同,它们可能具有不同类型的整数。

在我的情况下,当查看“正确”数组(即颜色正常显示的那个)中的整数类型时,我得到了: class 'numpy.uint8'

而当查看在 plt.imshow() 中颜色反转的数组的整数类型时,我得到了: class 'numpy.int64'

我所需要做的就是将数组值转换为 uint8 类型:

image = image.astype(np.uint8)


1

完全不是。您正在处理numpy数组,因此您可以只需:

 freq = 255 - freq

所以你的代码应该是:

import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

image = mpimg.imread("EGZ68.jpg")
freq = fftpack.fft2(image)
freq = 255 - freq  # HERE IS THE CHANGE
IFFT = fftpack.ifft2(freq)
IFFT = IFFT.astype('float32')

plt.figure(1)
plt.imshow(image)

plt.figure(2)
plt.imshow(IFFT)

plt.show()

虽然我不确定为什么你首先会得到一个反转的色图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接