Python numpy array als Bild in tkinter.canvas anzeigen

chillking

Lieutenant
Registriert
Juni 2010
Beiträge
847
Tag zusammen,

ich lese Farbbilder einer Kamera ein, die ich dann als numpy-Array vorliegen habe. Da mehrere Bilder nacheinander aufgenommen werden, speicher ich diese in einer Liste ab (hier "Original").

Ich habe nun ein Beispiel gefunden, in dem Rauschen erzeugt, angezeigt und danach durchgerollt wird und wollte dieses auf meine Bedürfnisse anpassen. Habe mal nur mit einem Kanal des Bildes angefangen (Zeile 22).
Jedoch wird das Bild nicht korrekt angezeigt, sondern ebenfalls als Rauschen.

Im folgenden Code habe ich nur Zeile 22 und 23 eingefügt (um mein Bild anzeigen zu lassen) und Zeile 36 und 37 auskommentiert (da das Bild danach ja nicht durchlaufen soll).

Code:
class mainWindow():
    times=1
    timestart=time.clock()
    data=numpy.array(numpy.random.random((400,500))*900,dtype=numpy.uint16)
    
    def __init__(self):
        self.root = tkinter.Toplevel()
        self.frame = tkinter.Frame(self.root, width=454, height=256)
        self.frame.pack()
        self.canvas = tkinter.Canvas(self.frame, width=454, height=256)
        self.canvas.place(x=-2,y=-2)
        xdata = b'P5 500 400 255 ' + self.data.tobytes()
        self.photo = tkinter.PhotoImage(width=454, height=256, data=xdata, format='PPM')
        self.imid = self.canvas.create_image(0,0,image=self.photo,anchor=tkinter.NW)
        self.root.after(2000,self.start) # INCREASE THE 0 TO SLOW IT DOWN
        self.root.mainloop()
     
    def start(self):
        global data
        global Original
                
        Bild = Original[0][:,:,0]
        data=numpy.array(Bild,dtype=numpy.uint16)
        
        xdata = b'P5 500 400 255 ' + numpy.clip(self.data,0,255).tobytes()
        self.photo = tkinter.PhotoImage(width=454, height=256, data=xdata, format='PPM')
        if True:
            self.canvas.itemconfig(self.imid, image = self.photo)
        else:
            self.canvas.delete(self.imid)
            self.imid = self.canvas.create_image(0,0,image=self.photo,anchor=tkinter.NW)
        self.times+=1
        if self.times%33==0:
            print("%.02f FPS"%(self.times/(time.clock()-self.timestart)))
        self.root.update()
#        self.root.after(10,self.start)
#        self.data=numpy.roll(self.data,-1,1)
 
if __name__ == '__main__':
    x=mainWindow()

Angezeigt wird dann folgendes:
1.png

Mit matplotlib sieht das ganze so aus:
2.png

Hat jemand einen Tipp, was da falsch läuft?
 
Zurück
Oben