绘制图像的傅里叶变换时出现问题。 "ValueError: x and y can be no greater than 2-D, but have shapes (2592,) and (2592,



我试图获得图像的fft,然后使用matplotlib绘制该fft的fraq。但是,此错误消息:

"ValueError:x和y不能大于2-D,但具有形状(2592,)和(2592、1、3)"。

我试图像这样重塑我的np.array:

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import tkinter
from scipy.fftpack import fft, fft2, fftshift
resim = Image.open(r'yeni.jpg')
resim_data = np.asarray(resim)
fourier = fft2(resim_data)
#psd2D = np.abs(fourier)**2

plt.figure()
plt.semilogy(abs(fourier).astype(np.uint8))
plt.title('fourier transform fraq')
plt.show()

错误消息溢出:

Traceback(最后一次调用):

中的文件"myfrouier.py",第21行

plt.semology(abs(傅立叶).astype(np.uint8))文件

"/home/aybarsyildiz/.local/lib/python3.6/site packages/matplotlb/pyplot.py",

行2878,在半逻辑中return gca().semilogy(*args,**kwargs)
文件"/home/aybarsyildiz/.local/lib/python3.6/site packages/matplotlib/aaxs/_axes.py",行1844,在半逻辑中l=self.plot(*args,**kwargs)文件"/home/aybarsyildiz/.local/lib/python3.6/site packages/matplotlib/init.py",行1810,在内部return func(ax,*args,**kwargs)
文件"/home/aybarsyildiz/.local/lib/python3.6/site packages/matplotlib/aaxs/_axes.py",第1611行,在绘图中为自己的线路_get_lines(*args,**kwargs):
文件"/home/aybarsyildiz/.local/lib/python3.6/site packages/matplotlib/aaxes/_base.py",第393行,在_grab_next_args中自我屈服_plot_args(this,kwargs)文件"/home/aybarsyildiz/.local/lib/python3.6/site packages/matplotlib/aaxes/\ubase.py",第370行,在_plot_args中x、 y=自我_xy_from_xy(x,y)文件"/home/aybarsyildiz/.local/lib/python3.6/site packages/matplotlib/aaxes/\ubase.py",第234行,在_xy_from_xy中"形状{}和{}".format(x.shape,y.shape)ValueError:x和y不能大于2-D,但具有形状(2592,)和(2592、1,3)

您似乎没有必要的2d数组,但有一个额外的三维数组。你必须选择你想用这个维度做什么:

  • 如果你只需要一个通道的信息,你可以选择只保留第三维度的第n个值:

    n = 1
    resim_data = resim_data[:, :, n]
    
  • 计算三维所有值的平均值

    resim_data = resim_data.mean(axis=-1)
    
  • 为三维的所有值选择最大值

    resim_data = resim_data.max(axis=-1)
    
  • 。。。


示例:

我将您的代码用于244x244像素的示例图像,并得到了与您类似的错误:

ValueError:x和y不能大于2-D,但具有形状(244,)和(244,244,4)

我只对第一个通道感兴趣,所以我从第三个维度删除了所有其他不必要的值:

resim_data = np.asarray(resim)
print(resim_data.shape)
n = 0
resim_data = resim_data[:, :, n]
print(resim_data.shape)

打印:

(244, 244, 4)
(244, 244)

正如您所看到的,resim_data不再具有第三维度。之后没有任何错误。

最新更新