2016-08-04 2 views
1

私は、フレームを60フレーム(TIFFファイル)で実行し、ノイズ除去フィルター(Median)を適用してフレームをビットを分析前に使用します。しかし、私のプログラム(それはフレームごとにフレームを取る)は、単一フレームのtiffを出力します。何故ですか?どのように私はそれを世話することができますか?Tiffメジアンフィルターを1つのフレームとしてエクスポートするOpenCV Python

from PIL import Image 
import cv2 
import numpy as np 

im = Image.open('example_recording.tif').convert('L') 
im.save('greyscale_example.tif') #converts to greyscale 

width,height = im.size 
image_lookup = 0 

class ImageSequence: 
    def __init__(self, im): 
     self.im = im 
    def __getitem__(self, ix): 
     try: 
      if ix: 
       self.im.seek(ix) 
      return self.im 
     except EOFError: 
     raise IndexError # if end of sequence 

for frame in ImageSequence(im): 
     imarray = np.array(frame) 
     Blur = cv2.medianBlur(imarray,5) 
     frame = Image.fromarray(Blur) 

im.save('corrected.tif') 
+0

あなたはサンプルファイルを持っていますか? 1つのファイル内のすべての画像の中央値である1つの画像を求めたいのですか? –

+0

いいえ、私は短い映画からのノイズをフィルタリングするために、すべてのフレームにメディアンフィルタを適用しようとしています。私はサンプルファイルを持っていますが、どこにでもアップロードするには、とにかくフォーマット変換が必要です。気になるものはほぼ600 MBです(しかし、助けがあればできます)。最終的な結果は、60フレームの単一のファイルtiffシーケンスでなければならず、すべての単一フレームにメディアンフィルタが適用されます。 –

答えて

1

私はあなたの最後のスタックが正しく(上記図示していない?)を再構成し、単一のフレーム(最終フレーム)に保存されていないと思いますか?

代替は、OpenCVのを見送るとscipyのダウンロードを使用することです:

import numpy 
import scipy 
from scipy import ndimage 

a = numpy.random.randint(0,255,(100,100,60)) 
a.shape 
#(100L, 100L, 60L) 

b = scipy.ndimage.filters.generic_filter(a, numpy.median, 5) 
b.shape 
#(100L, 100L, 60L) 
+0

ええ、最終的なスタックバックをどのように再構成するかについては完全にはわかりませんが、frame = image.fromarrayがフレームごとに変換し、シーケンスの構造をそのままにしておくことを望んでいました。 scipyが行っている限り、私はそれについてほとんど経験がないので、あなたが提案した解決策を適用する前に読書をしなければならないかもしれませんし、その間にありがとう! –

+1

'frame'が' im'にどこに置かれているのかわかりません。私はそれが割り当てられた後に使用されて表示されません? 2回目に 'frame'を使用すると、新しい変数であるかのように設定され、名前を上書きしますが、ImageSequenceインスタンスには書き戻されません。 – Benjamin

+0

はい、私は今どこでミスをしたのか分かりました。どのように私はそれを戻すことについて行くだろうか? –

関連する問題