2016-08-04 31 views
1

Ich versuche ein Programm über eine Sequenz von 60 Frames (in einer TIFF-Datei) laufen zu lassen und einen Rauschreduzierungsfilter (Median) anzuwenden, um die Frames aufzuräumen Bit vor der Analyse. Jedoch gibt mein Programm (das es Bild für Bild aufnimmt) ein Einzelbild-TIFF aus; Warum das? Wie könnte ich mich darum kümmern?Tiff-Median-Filter exportiert als Einzelbild 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

Haben Sie eine Beispieldatei? Meinst du, du willst ein einzelnes Bild, das ist der Median aller Bilder in einer einzigen Datei? –

+0

Nein, ich versuche, einen Medianfilter auf jeden Frame anzuwenden, um das Rauschen eines kurzen Films herauszufiltern. Ich habe eine Beispieldatei, aber um sie überall hochzuladen, würde sowieso eine Formatkonvertierung nach gif nötig sein; Verdammtes Ding ist fast 600 MB (kann aber, wenn es hilft). Das Endergebnis sollte eine einzelne Datei-TIFF-Sequenz von 60 Frames sein, wobei auf jeden einzelnen ein Median-Filter angewendet wird. –

Antwort

1

Ich glaube, Sie werden Ihre endgültigen Stapel nicht korrekt wieder Komponieren (nicht oben gezeigt?) Und einen einzelnen Frame (die letzte Frame) zu speichern?

Eine Alternative ist OpenCV und Verwendung scipy zu verzichten:

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

Ja, ich bin mir nicht ganz sicher, wie ich den letzten Stapel wieder zusammensetzen würde, hoffte, dass frame = image.fromarray Frame für Frame konvertiert und die Struktur der Sequenz unberührt lässt. Soweit scipy geht, habe ich sehr wenig Erfahrung damit, also muss ich vielleicht etwas lesen, bevor ich in der Lage bin, die vorgeschlagene Lösung anzuwenden und zu bewerten, ob es das Problem löst; Danke in der Zwischenzeit! –

+1

Ich sehe nicht, wo 'frame' in' im' zurückgelegt wird. Ich sehe es nicht verwendet, nachdem es zugewiesen wurde? Wenn Sie das zweite Mal 'frame' verwenden, wird es so eingestellt, als ob es eine neue Variable wäre. Überschreiben Sie den Namen, aber schreiben Sie nicht zurück in Ihre ImageSequence-Instanz. – Benjamin

+0

Ja, ich glaube, jetzt verstehe ich, wo ich einen Fehler gemacht habe. Wie würde ich es wieder einbauen? –