2016-03-21 9 views
2

私は2D Scipy FFTで画像のデコンボリューションを行っています。しかし、Matplotlibは明らかな理由がなく、RGB値が正しいとしても、生成されたIFFT配列の配色を反転しています。Matplotlibは2D IFFT配列の色を反転します

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() 

IFFTアレイと画像アレイはnumpy.array_equalによると等しく、さらに2番目の図のカラーマップは常に反転します。添付の画像を参照してください。配列は、文字通り同一であり、他のカラーマップが指定されていない、まだ私はこのような何か使用して手動で反転すべてに強制しています:astypeののfloat32への変換(またはそれ以前UINT32)が何かを変える可能性がある場合、私は疑問に思う

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] 

をしかし、配列は同じなので、わかりません。

アイデア?また、配列内のすべてのエントリから手動で255を引くより効率的な代替方法である場合は、cmap全体を逆にする方法も理解したいと思います。

First image Second image

+0

ifft2 imaginaryの結果ですか?もしそうなら、それをキャストして、IFFTの大きさ(絶対値)をプロットしてみてください。 – Suever

+0

一部のRGB値は虚数成分を持ちますが、タイプ変換の代わりにnp.absoluteを使用しても、色は反転します。私はそれを考慮しなかったので、ありがとう。奇妙な問題。 – JAustin

答えて

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() 

私はあなたが最初に反転カラーマップを取得している理由はわからないが、場所。

5

plt.imshow()は整数を想定しています。

しかし、整数の2つの配列が同じに見えても、異なる型の整数を持つ可能性があることに気付きました。私の場合は

、「右」配列に整数型を見たときに(つまり、色が正しく表示1)私が得た:整数を見たときに クラスのnumpy.uint8 "一方

を色がplt.imshowで反転されている配列のタイプ()私が得た: クラスのnumpy.int64 "

を私が行うために必要なすべてがUINT8に配列の値を変換することでした:

image = image.astype(np.uint8)

関連する問題