Meine neue Astro Kamera (ASI 1600 MMC ) kann mit 12 bit /Pixel mehr als die sonst üblichen 8 bit Videos. Da gibt es zwar eine Bildbearbeitungsprogramme zum Stacken, aber leider noch keine Python Bibliothek zum Einlesen der Dateien.
Daher habe ich versucht, eine einfache Klasse zu schreiben, die Header und Frames von .SER Dateien einliest, inclusive dem Zeitstempel. Derzeit nur für monochrome oder Raw Videos, aber die Erweiterung auf die anderen Formate wäre eine Kleinigkeit. Möchte sie nur nicht machen ohne Testmöglichkeit. Eine gute Beschreibung des Dateiformats findet sich bei grischa-hahn .
Der Code zur Klasse SerReader findet sich auf SerReader
Aber Achtung, ist derzeit noch ohne Fehlerbehandlung geschrieben.
Der Aufruf ist einfach:
sr = SerReader(Dateiname) erstellt ein neues Objekt, liest Header und Trailer der Datei ein
Zeit, Bild = sr.getFrame(i) liefert das i-te Bild in der Datei als Numpy Array, zusätzlich den Zeitstempel des Bildes
sr.printHeader() druckt dann die Headerinformationen der Datei aus
sr.close() schließt die Datei
Ein kleines Testprogramm zeigt ein Profil durch einen Sonnenfleck und die Abdunklung zum Sonnenrand hin. Das Programm befindet sich am Ende der Seite.
Zuerst wird die Sonne von einem Frame eingelesen, das Bild wurde in der Auswertung eingefärbt. In Wirklichkeit wäre das Sonnenbild mit dem Baader Filter grün. Das Video wurde ohne Nachführung mit einem Skywatcher 100/900 ED Refraktor auf einer AZ3 Montierung aufgenommen. Das Sonnenlicht wurd durch Herschelprisma, ND3 Filter und Solar Continuum Filter aufgenommen.
In Detail sieht man dann den Sonnenfleck besser und auch Fackeln am Rand. Grün ist eine Auswertelinie eingezeigt, auf der dann ein Profil ausgelesen wird. In der Mitte oben ist ein Fackelgebiet sichtbar, das aber hier nicht ausgewertet wird:
Am Ende steht dann ein Profil zur Verfügung
Rot ist eine Ausgleichskurve gezeichnet, die die Randverdunklung recht gut wiedergibt. Die schafe Spitze nach unten ist der Sonnenfleck, durch den das Profil gelegt wurde.
Die Randhelligkeit von 2/5 der Mittenhelligkeit passt gut zu den Literaturangaben, die Resthelligkeit des Himmelshintergrundes dürfte auf leichte Schleierwolken und Reflexionen und Schmutz in der Optik zurückzuführen sein. Das Rauschen der Kurve wird von der Granulation verursacht.
import numpy as npfrom matplotlib import pyplot as pltimport copysr = SerReader(r'C:\Users\Arnold\Desktop\SharpCap Captures\2017-05-19\Capture/test.ser')print(sr.__doc__)sr.printHeader()for i in range(0,1): frameTime, frame = sr.getFrame(i) print("Frame",i,frameTime) t = np.arange(0.0, header['ImageWidth'], 1.0) ye=1006 #570 #1006 s = frame[ye,:] ym =60500 xm= 1435 xr= 990 x=np.linspace(0,2500,500) rr=abs(x-xm)/xr yy=np.sqrt(1-rr*rr) y=ym*(2/5+3/5*yy) plt.plot(t, s) plt.plot(x, y, 'r') plt.xlabel('pixel') plt.ylabel('ADU value') plt.title('evaluation line') plt.grid(True) plt.show() plt.imshow(frame, cmap = 'hot', interpolation = 'bicubic') plt.show() plt.imshow(frame, cmap = 'binary', interpolation = 'bicubic') x=[0,4000] y=[ye,ye] plt.plot(x,y,'g') axes = plt.gca() axes.set_xlim([1500,2500]) axes.set_ylim([1500,500]) #plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis plt.show()sr.closeFile()