7

現在、PIL と NumPy を使用しています。色付きのpng画像があり、次のことをしたい:

  1. グレースケールで読み込む
  2. NumPy配列に変換
  3. 配列で FFT を実行する
  4. 画像を表示する

これは私がしようとしていることです(--pylabフラグ付きのIPythonで):

In [1]: import Image

In [2]: img = Image.open('ping.png').convert('LA')

In [3]: img_as_np = np.asarray(img)

In [4]: img_as_np
Out[4]: array(<Image.Image image mode=LA size=1000x1000 at 0x105802950>, dtype=object)

In [5]: img_fft = fft.fft2(img_as_np) // IndexError: index out of range for array
4

3 に答える 3

4

convert()メソッドのパラメーターとして、「LA」ではなく「L」モードを使用する必要があります。「LA」がアルファチャネルを離れると、numpy.asarrayが意図したとおりに機能しなくなります。アルファチャネルが必要な場合は、numpy配列に変換するための別の方法が必要になります。それ以外の場合は、モード「L」を使用します。

于 2013-01-29T06:58:49.513 に答える
4

numpyImage. したがってimg_as_np、オブジェクトを含む1要素の配列として取得しているだけですImage(これがOut[4]表示されています)。

代わりに、 のようなことをする必要がありますnp.asarray(img.getdata())。これにより、0 から 255 までの整数の配列が得られますnum_pixels x num_channels(少なくとも、私が試した png の場合)。あなたはしたいかもしれません

img_as_np = np.asarray(img.getdata()).reshape(img.size[1], img.size[0], -1)

画像のように配置(転置)します。255 で割って 0 から 1 の間の float 値を取得することもできます (たとえば、matplotlib のようにimshow)。

于 2013-01-29T06:45:17.370 に答える
2

これを画像に使用する:

>>> from PIL import Image
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> Image.__version__
'1.1.7'
>>> img = Image.open('lena.png').convert('L')
>>> data = np.asarray(img.getdata()).reshape(img.size)
>>> fft = np.fft.fft2(data)
>>> fft[0, 0] = 0 # remove DC component for visualization
>>> plt.imshow(np.abs(np.fft.fftshift(fft)), interpolation='nearest')
<matplotlib.image.AxesImage object at 0x046012F0>
>>> plt.show()
>>> plt.imshow(np.abs(np.fft.fftshift(fft))[224:288, 224:288], interpolation='nearest')
<matplotlib.image.AxesImage object at 0x0476ED70>
>>> plt.show()

ここに画像の説明を入力してください

于 2013-01-29T17:05:47.747 に答える