Ho un'immagine 1443x998 delle stelle (scattata con una fotocamera da 35 mm e quindi scansionata) con le seguenti stelle nelle seguenti posizioni dei pixel:
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]
Quale funzione matematica converte la posizione dei pixel in RA / DEC e viceversa? Appunti:
Le stelle luminose sono chiazze nella foto; le coordinate sopra sono approssimativamente al centro del blob, ma possono essere disattivate di + -2 pixel.
So di poter ruotare la sfera celeste in modo che il centro della mia immagine abbia coordinate polari 0,0. Quindi la vera domanda è "come trovare questa rotazione" (ma vedi il prossimo punto).
Se l'elevazione / azimut fossero lineari nelle immagini, questo sarebbe facile (er), ma non lo sono: Misurare la distanza angolare con le fotografie
Posso fornire posizioni di pixel di più stelle se questo aiuta. Credo che 3 dovrebbero essere sufficienti, ma potrei sbagliarmi.
Ho provato a scegliere 3 stelle che sono state "sparse" in tutta l'immagine (perché penso che riduca l'errore, non sono sicuro), ma non sono sicuro di esserci riuscito.
Lo sto facendo per diverse foto e vorrei un metodo generale.
In questo modo mi aiuterà a identificare le stelle più deboli / Messier-oggetti / ecc. Nella foto.
Sono sicuro che molti astrofotografi vogliono farlo, ma non hanno trovato alcun software esistente che lo faccia.
EDIT: Grazie, whuber! La proiezione gnomonica è ciò che mi mancava. Lo avevo già fatto ipotizzando una trasformazione lineare:
(* 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}];
];
dove x, ye z erano elenchi di 4 elementi ciascuno costituito da una stella RA, declinazione, coordinata x sull'immagine e coordinata y sull'immagine. xwid e ywid sono la larghezza e l'altezza dell'immagine. In questo caso:
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}
}
Ora, facendo riferimento a "{-2250.51, -1182.52, 385.689}" come $ frow, "{-166.12, -543.746, -2376.73}" come $ srow e "{0.480698, -0.861509, 0.163497}" come $ null, questa subroutine PHP traduce RA / DEC in coordinate xy:
# 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));
}
}
Purtroppo, non ho più idea del perché funzioni, ma usarlo + l'aggiunta di posizioni stellari note produce risultati tollerabili (usa "vedi immagine" per vederlo a grandezza naturale):
Tuttavia, come puoi vedere, i risultati non sono perfetti, convincendomi che una trasformazione lineare non era la risposta giusta. Penso che lo gnomonico potrebbe essere il graal che stavo cercando.