Python OpenCV Starry Sky Panorama Stitcher

IC⎵1396

Neues Mitglied
Hallo liebes astronomie.de-Forum,

ich möchte euch hier die auf GitHub von mir veröffentlichte Software zum Stitchen von insb. Fisheye-Panoramas vorstellen. Grundlegende Programmierkenntnisse (Python) sind zur Bedienung notwendig.

Zielsetzung / Motivation
  • PTGui (https://ptgui.com/) leistet ausgezeichnete Dienste aber es erkennt Sterne nicht als ImageFeatures. Für jede Kombination aus 2 Aufnahmen müssen mindestens 3 Sterne pro Aufnahmemanuell markiert werden. Bei 21 Nachthimmelaufnahmen für ein Fisheye-Panorama ergeben sich 36 Überlappungen zwischen jeweils 2 Fotos. Für jede Überlappung müssen auf beiden Aufnahmen mindestens 3übereinstimmende Sterne händisch markiert werden – äußerst lästig.
    pt_gui_manual_keypoint_labeling.png
  • https://github.com/opencv/opencv/blob/4.x/samples/python/stitching_detailed.py ist ein ausgezeichnetes Beispiel für das Stitchen einePanoramas mit OpenCV – für jemanden, der noch nie OpenCV bedient hat jedoch sehr verwirrend und wenig erhellend. Der in stitching_detaily.py vorgestellte Stitiching-Workflow (inkl. feature detection, pairwiseimage matching, homography estimation, bundle adjustment, waviness correction, image warping, stitching seam estimation and seaming/masking, timelapsing of warped images, blending of warped images) ermöglicht tiefe Einblicke indie Arbeitsweise von OpenCV und schreibt die Resultate jedes Zwischenschritts auf die Festplatte. Es handelt sich um eine stark erweiterte Version von stitching_detaily.py , die mehr Dokumentation und Einblick bietet.
  • Die standardmäßig in stitching_detaily.py verwendeten Matcher (cv.detail_BestOf2NearestMatcher and cv.detail_BestOf2NearestRangeMatcher) funktionieren kaum beiSternenhimmelaufnahmen. Deswegen wird hier ein custom bruteforce matcher vorgestellt , der cv.BFMatcher(cv.NORM_HAMMING) verwendet und ein Tuple aus cv2.detail.MatchesInfo -Objekten ausgibt– analog zu cv.detail_BestOf2NearestMatcher und cv.detail_BestOf2NearestRangeMatcher .
Fotos für das Fisheye-Panorama aufnehmen
Es empfiehlt sich, nach einem Plan vorzugehen. Für ein 18 mm-Objektiv liefert folgend Vorgehensweise ausreichend gute Überlappungen zwischen den Einzelfotos:
image_plan_for_all_sky_circular_fisheye.png


ORB keypoint/descriptor matching vs. shape/constellation matching
OpenCV matchers können keypoints/descriptors matchen, dabei handelt es sich um einzelne Punkte:
Oystercatcher_01_full.png

Oystercatcher_02_keypoints.png


Bei Sternenhimmelaufnahmen wird das schnell problematisch, insbesondere wenn die Aufnahme schwächer belichtet wurde, nicht allzu viele Sterne vorhanden sind und der Himmelshintergrund eher dunkel als sternreich erscheint. Denn»die meisten Sterne sehen gleich aus«.

Wenn wir mit Hilfe einer Sternkarte nach Sternbildern am Himmel suchen, suchen wir nicht nach einzelnen Sternen, sondern nach Mustern – Sternbildern eben. Es wäre hilfreich, wenn OpenCV ebenfalls imstande wäre, nicht nurKeypoints/Descriptors sondern ganze Muster (Sternbilder) zu matchen.

Der hier vorgestellte StarPolygonMatcher bietet genau diese Funktionalität:
polygon_shape_matching.jpg


Sternbilder bzw. Sternpolygone werden anhand von Eckwinkeln, Seitenlängen und Sternhelligkeiten miteinander verglichen.

Für ein 5-seitiges Polygon (5-Eck) wie oben dargestellt ergeben sich 5 Eckwinkel, 5 Seitenlängen und 5 Sternhelligkeiten.

Die Eckwinkel und Seitenlängen werden nicht in der Bildebene gemssen! Die Sterne werden zunächst auf eine Sphäre »in die reale, physikalische Welt« zurückprojiziert.Winkel und längen auf der Kugeloberfläche werden dann mithilfe sphärischer Trigonometrie bestimmt. Der Radius der Kugel ist beliebig wählbar, da dieSeitenlängen von sphärischen Dreiecken in Radian beschrieben werden.
projecting_stars_from_the_image_plane_onto_a_sphere.png



Der Panorama-Stitching-Workflow
pipeline.png
 
Beispiele

Beispiel 1: Tagfotos stitchen

cv.detail_BestOf2NearestMatcher (links) und CustomBruteForceMatcher (rechts) liefern auch bei Tagfotos vergleichbare Ergebnisse.
cv.detail_BestOf2NearestMatcher_vs_CustomBruteForceMatcher.jpg


Beispiel 2: Nähte und Fotokanten farbig darstellen

Mit ORB gefundene Keypoints

z_ORB_keypoints.jpg



Mit Canny Edge gefundene Sterne
z_CannyEdge.jpg



Aus den mit CannyEdge gefundenen Sternen generierte ORB-Features
z_StarFeatures.jpg



Matches (inliers) gefunden via ORB keypoing matching
ORB___omitted_____conf=0.22444___num_inliers=9___02-horiz-ne.jpg___10-alt1-ne.jpg.jpg



Reduzierung der Stern-Anzahl mittels sklearn.cluster.AgglomerativeClustering
Alle Keypoints, die mit der CannyEdge-Sterndetektion gefunden wurden:
00_all_star_keypoints_before_clustering_02-horiz-ne.jpg___10-alt1-ne.jpg__619kps___1000kps.jpg


Zum Löschen markierte Keypoints (bei einer max. Keypoint-Anzahl von 15 pro Cluster):
01_all_star_keypoints_highlighted_if_removed_by_clustering_02-horiz-ne.jpg___10-alt1-ne.jpg__6...jpg


Nach dem Clustering bleiben diese Keypoints übrig:
02_remaining_keypoints_after_clustering__02-horiz-ne.jpg___10-alt1-ne.jpg__68kps___72kps.jpg
 
Für die Reduzierung der Stern-Anzahl wird das Bild in mehrere Regionen aufgeteilt und sklearn.cluster.AgglomerativeClustering parallel auf alle Regionen angewendet:
cluster_star_reduction_steps.png


Die 12 für das Clustering verwendeten Regionen:
12_image_regions_for_clustering.png


Vom Custom Star Polygon Matcher gefundene übereinstimmende Polygone:
good_matches_5-sided_polygons.jpg


Matches (inliers) gefunden via StarPolygonMatching
STARS______conf=3.00000___num_inliers=8___02-horiz-ne.jpg___10-alt1-ne.jpg.jpg



Warping
warping.jpg



Nähte
seaming.jpg



Farbig hervorgehobene Bildkanten
colorizing_edges.jpg
 
Finales Panorama
2022-12-30_13h31m14s__fisheye_no-000__red_seams.jpg


2022-12-30_13h31m48s__fisheye_no-000__colored_edges.jpg


2022-12-30_13h32m13s__fisheye_multiband-001__colored_edges.jpg


2022-12-30_19h47m53s_rot=000deg_fisheye_multiband-042.jpg



Beispiel 3: Welligkeits-Effekt entfernen
waviness_correction.jpg



Beispiel 4: Alle Projektionen (warp modes)
warp_modes.png



Beispiel 5: Kamera-Rotation (zur Drehung des Panoramas)

2022-12-30_19h47m53s_rot=000deg_fisheye_multiband-042.jpg


90°
2022-12-30_19h48m12s_rot=090deg_fisheye_multiband-042.jpg

...
 
Beispiel 6: ORB Matching-Ergebnisse vs. CustomStarPolygon-Matching-Ergebnisse bei schwächer belichteten Dämmerungsfotos
orb_vs_star_polygon.jpg


Noch nicht umgesetzt / Ausblick:
  • Bildverzerrung wird noch nicht berücksichtigt. Schachbrett-Kalibrierungsfotos aufnehmen und Bilderverzerrung herausrechnen. Liefert das beim Polygon-Matching bessere Ergebnisse?

  • Multi-Processing einführen und diverse Schritte auf mehreren Kernen parallel abarbeiten lassen.

  • Fälschlicherweise als Sterne erkannte Horizont-Features entfernen.
    stars_horizon.png
 
Oben