Startseite   Übersicht   Zurück


Sterne extrahieren

Die Idee

Um die Sterne aus einem Bild (Grafikdatei) zu extrahieren, suche ich einfach gesagt nach den hellen Punkten im Bild und merke mir die (Pixel-)Koordinaten.

Das Bild selbst lade ich mit den Standards von Visual Studio (C#), also als Bitmap und zeige es mit einer PictureBox an. Diese doch recht einfache Methode hat so seine Vor- und Nachteile. Da ich aber letztendlich nur an den Pixelkoordinaten interessiert bin, ist mir diese Technik ausreichend.

Der Hintergrund des Bildes

Um die hellen Stellen im Bild zu finden, muss ich zuerst wissen, was hell und was dunkel ist. Dabei gehe ich davon aus, das der Hintergrund dunkel und die Sterne hell sind. Zuerst ermittle ich dann die durchschnittliche Helligkeit des Hintergrunds.

Ausgehend von einem Farbbild mit RGB Daten bestimme ich die Helligkeit eines Pixels über die Formel:

HPixel = (0,299 * rPixel) + (0,587 * gPixel) + (0,114 * bPixel)

HPixel: Helligkeit des Pixels
rPixel: Rotanteil der RGB-Farbe des Pixels
gPixel: Grünanteil der RGB-Farbe des Pixels
bPixel: Blauanteil der RGB-Farbe des Pixels

Um dann auf die durchschnittliche Helligkeit des Hintergrundes zu kommen, addiere ich die Helligkeiten jedes einzelnen Pixels auf und dividiere anschließend durch die Anzahl Pixel (Länge x Breite des Bildes). Damit erhalte ich eine einigermaßen passende Hintergrundhelligkeit des Gesamtbildes.

HHintergrund = ΣHPixel(x,y)

HHintergrund: Hintergrundhelligkeit des Gesamtbildes
HPixel: Helligkeit des Pixels
x,y: Pixel-Koordinaten des Bildes

Die so ermittelte durchschnittliche Helligkeit ist etwas zu hell, da die Sterne und das fotografierte Objekt auch mit in die Hintergrundhelligkeit einfließen. Der Fehler, der so entsteht, ist in meinen Augen aber klein genug, so das erst mal keine Optimierung dieser Berechnung erfolgen müsste.

Die Sterne

Als nächstes lege ich für das Bild Ausschlussbereiche fest. Diese Ausschlussbereiche werden über die störenden Teile des Bildes gelegt. Der Rand selbst wird mit einem kleinen Bereich (5 Pixel) ausgeblendet. Aber auch das fotografierte Objekt wird ausgeblendet, sonst erkennt mein Stern-Extraktions-Algorithmus falsche Sterne, die nur unnötig viel Zeit in den Berechnungen kosten würden.

Über den verbleibenden Bereich laufe ich in x- und y-Richtung. Zuerst prüfe ich, ob die Helligkeit des Pixels eine gewisse (konfigurierbare) Schwelle (5-fach) oberhalb der Hintergrundhelligkeit liegt. Falls nicht, ignoriere ich dieses Pixel.

Liegt ein Pixel oberhalb dieser Schwelle, so prüfe ich, ob es der hellste Punkt im Umkreis eines (konfigurierbaren) Quadrates ist (5x5 Pixel). Ist er der hellste Punkt, so identifiziere ich dieses Pixel als Stern und merke mir diese Koordinate. Ist er zwar oberhalb der Hintergrund- Schwelle, aber nicht der hellste Punkt, so ignoriere ich dieses Pixel.

Die Helligkeit dieses Sterns ermittle ich einfach als Summe der Helligkeiten der Pixel innerhalb des Quadrates. Es kommt zwar kein mag-Wert heraus, aber relativ gesehen passen die Helligkeiten, um eine Sortierung vornehmen zu können.

Als Ergebnis habe ich dann eine Liste von (x,y) Koordinaten, von denen ich ausgehe, das es sich um Sterne handelt. Diese Liste wird dann noch nach der Helligkeit für die weiteren Schritte sortiert.

Schwachpunkte

Wie schon angedeutet, werden die Bilder mit den Bordmitteln von Visual Studio geladen. Diese erlauben aber keine zu tiefen Bilder in der Farbanzahl und quittieren dies mit einem Fehler beim Laden. Abhilfe hierzu war für mich, die Bilder mit MS Paint zu laden und erneut abzuspeichern, was die Farbtiefe reduziert, so das das Laden mit dem Programm funktioniert.

Die durchschnittliche Helligkeit des Hintergrundes könnte noch besser bestimmt werden, wenn z.B. mit mehreren durchgängen gerechnet wird. Im ersten Durchgang könnte so wie jetzt eine erste Näherung erfolgen. In einem zweiten Durchgang könnten dann die zu hellen Bildteile (heller als die 5-fach Schwelle) automatisch ausgeblendet werden.

Die Definition der Ausschlussbereiche erfolgt im Moment händisch, also einfach gesagt, ich suche die Bereiche von Hand raus und lege Ausschluss-Quadrate fest, die dann ignoriert werden. Schön wäre es, wenn die Ausschlussbereiche mit einer Maus markiert werden könnten und wenn zusätzlich zu den Quadraten auch Kreise angegeben werden könnten.

Die Identifikation eines Sterns, genauer der Mittelpunkt, erfolgt über die Erkennung des hellsten Punktes in einer Region. Hierbei wird mit größer-gleich verglichen. Sind zwei Pixel mit derselben Helligkeit nebeneinander, so werden somit auch zwei Sterne erkannt. Umgekehrt wäre es, wenn nur mit größer verglichen würde, dann würde ich an dieser Stelle keinen Stern erkennen, da kein Pixel in der Region als heller als alle anderen Pixel erkannt würden.

Im Moment wird die Sternkoordinate als Pixel (x,y) identifiziert, Ich könnte mir auch vorstellen, das in der Sternregion der Helligkeitsschwepunkt ermittelt wird und diese Koordinate als Sternkoordinate weiterverwendet wird. Bei größeren Bilder (von der Pixelzahl her) wird dies kaum einen Unterschied ausmachen (vgl. 3 Bogenminuten und 500 Pixel -> 0,36 Bogensekunden/Pixel), aber bei kleineren Bildern (oder Bildausschnitten) könnte dies eine Verbesserung der Genauigkeit bringen.

Die Erkennung unterscheidet nicht, ob es ein Stern oder eine sonstige Aufhellung ist. Es könnte sich bei dem vermeintlich erkannten Stern auch um eine z.B. schwache Galaxie handeln. Bei der späteren Auswertung würde dieser Pseudo-Stern dann (hoffentlich) durchfallen. Das kann man auch positiv sehen. Es könnten die herausgefallenen Objekte nächer betrachtet werden, um so bekannte oder unbekannte Objekte zu finden.

Stand: 4. Oktober 2009