Ich habe ein 1443x998-Bild der Sterne (aufgenommen mit einer 35-mm-Kamera und dann gescannt) mit den folgenden Sternen an den folgenden Pixelpositionen:
Altair x=782, y=532 [19h50m46.9990s RA, +08 52'05.959'' DEC]
Sualocin, x=311, y=146 [20h 39m 38.287s +15 54'43.49'' DEC]
Denebokab, x=1023, y=815 [19h25m29.9005s +03 06' 53.191'' DEC]
Welche mathematische Funktion konvertiert die Pixelposition in RA / DEC und umgekehrt? Anmerkungen:
Helle Sterne sind Blobs auf dem Bild. Die obigen Koordinaten sind ungefähr die Mitte des Blobs, können jedoch um + -2 Pixel abweichen.
Ich weiß, dass ich die Himmelskugel so drehen kann, dass die Bildmitte Polarkoordinaten 0,0 hat. Die eigentliche Frage ist also "wie man diese Rotation findet" (aber siehe nächster Punkt).
Wenn Höhe / Azimut in Bildern linear wären, wäre dies einfach (er), aber nicht: Messen des Winkelabstands mit Fotos
Wenn das hilft, kann ich Pixelpositionen mit mehr Sternen angeben. Ich glaube, 3 sollte ausreichen, aber ich könnte mich irren.
Ich habe versucht, 3 Sterne auszuwählen, die über das Bild "verteilt" waren (weil ich denke, dass dies den Fehler reduziert, nicht sicher), bin mir aber nicht sicher, ob es mir gelungen ist.
Ich mache das für mehrere Bilder und möchte eine allgemeine Methode.
Auf diese Weise kann ich schwächere Sterne / Messier-Objekte / usw. auf dem Bild identifizieren.
Ich bin sicher, dass viele Astrofotografen dies tun möchten, aber keine vorhandene Software gefunden haben, die dies tut.
EDIT: Danke, whuber! Die gnomonische Projektion hat mir gefehlt. Ich hatte dies bereits unter der Annahme einer linearen Transformation getan:
(* convert RA/DEC to xyz coords on celestial psuedo-sphere of radius 1 *)
radecxyz[ra_,dec_] =
{Cos[ra/12*Pi]*Cos[dec/180*Pi],Sin[ra/12*Pi]*Cos[dec/180*Pi],Sin[dec/180*Pi]};
(* I no longer have any idea how this works *)
astrosolve[x_,y_,z_,xwid_,ywid_] := Module[{a,m,ans,nullans},
m=Array[a,{2,3}];
temp=Solve[{
m.radecxyz[x[[1]],x[[2]]]=={x[[3]]-xwid/2,x[[4]]-ywid/2},
m.radecxyz[y[[1]],y[[2]]]=={y[[3]]-xwid/2,y[[4]]-ywid/2},
m.radecxyz[z[[1]],z[[2]]]=={z[[3]]-xwid/2,z[[4]]-ywid/2}
}];
ans = m /. Flatten[temp];
nullans=Flatten[NullSpace[ans]];
If[nullans.radecxyz[x[[1]],x[[2]]]<0,nullans=-nullans];
Return[{ans,nullans}];
];
Dabei waren x, y und z jeweils 4-Element-Listen, die aus einem Stern RA, einer Deklination, einer x-Koordinate auf dem Bild und einer y-Koordinate auf dem Bild bestehen. xwid und ywid sind die Breite und Höhe des Bildes. In diesem Fall:
astrosolve[
{19.8463886110, 8.8683219443, 782, 532},
{20.6606352777, 15.9120805555, 311, 146},
{19.4249723610, 3.1147752777, 1023, 815},
1443, 998]
{
{{-2250.51, -1182.52, 385.689}, {-166.12, -543.746, -2376.73}},
{0.480698, -0.861509, 0.163497}
}
Unter Bezugnahme auf "{-2250.51, -1182.52, 385.689}" als $ frow, "{-166.12, -543.746, -2376.73}" als $ srow und "{0.480698, -0.861509, 0.163497}" als $ null, Diese PHP-Subroutine übersetzt RA / DEC in xy-Koordinaten:
# radecxy(ra,dec): converts ra/dec to x,y using a quasi-linear transformation
function radecxy($ra,$dec) {
global $null,$frow,$srow,$xwid,$ywid;
list($x,$y,$z)=array(cos($dec)*cos($ra),cos($dec)*sin($ra),sin($dec));
$dotprod=$null[0]*$x+$null[1]*$y+$null[2]*$z;
if ($dotprod<0) {return(array(-1,-1));}
list($fx,$fy) = array($frow[0]*$x+$frow[1]*$y+$frow[2]*$z,$srow[0]*$x+$srow[1]*$y+$srow[2]*$z);
$fx+=$xwid/2;
$fy+=$ywid/2;
if ($fx<0 || $fy<0 || $fx>$xwid || $fy>$ywid) {
return(array(-1,-1));
} else {
return(array($fx,$fy));
}
}
Leider habe ich keine Ahnung mehr, warum dies funktioniert, aber wenn Sie es verwenden + bekannte Sternpositionen hinzufügen, erhalten Sie tolerierbare Ergebnisse (verwenden Sie "Bild anzeigen", um es in voller Größe zu sehen):
Wie Sie jedoch sehen können, sind die Ergebnisse nicht perfekt, was mich davon überzeugt, dass eine lineare Transformation nicht die richtige Antwort war. Ich denke, Gnomonisch könnte der Gral sein, den ich suchte.