J'ai une photo 1443x998 des étoiles (prise avec un appareil photo 35 mm puis scannée) avec les étoiles suivantes aux emplacements de pixels suivants:
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]
Quelle fonction mathématique convertit l'emplacement des pixels en RA / DEC et vice versa? Remarques:
Les étoiles brillantes sont des taches sur l'image; les coordonnées ci-dessus sont à peu près le centre de la goutte, mais peuvent être décalées de + -2 pixels.
Je sais que je peux faire pivoter la sphère céleste de sorte que le centre de mon image ait des coordonnées polaires 0,0. La vraie question est donc "comment trouver cette rotation" (mais voir le point suivant).
Si l'élévation / azimut était linéaire sur les images, ce serait plus facile (euh), mais ce n'est pas le cas: mesurer la distance angulaire avec des photographies
Je peux fournir des emplacements de pixels de plus d'étoiles si cela aide. Je pense que 3 devraient suffire, mais je peux me tromper.
J'ai essayé de choisir 3 étoiles qui étaient "réparties" sur l'image (car je pense que cela réduit les erreurs, je ne sais pas), mais je ne suis pas sûr d'avoir réussi.
Je fais cela pour plusieurs photos et je voudrais une méthode générale.
Faire cela m'aidera à identifier les étoiles plus faibles / les objets Messier / etc. dans l'image.
Je suis sûr que beaucoup d'astrophotographes veulent le faire, mais n'ont pas trouvé de logiciel existant qui le fasse.
EDIT: Merci, whuber! La projection gnomonique est ce qui me manquait. J'avais déjà fait cela en supposant une transformation linéaire:
(* 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}];
];
où x, y et z étaient chacun des listes à 4 éléments comprenant une étoile RA, une déclinaison, une coordonnée x sur l'image et une coordonnée y sur l'image. xwid et ywid sont la largeur et la hauteur de l'image. Dans ce cas:
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}
}
Maintenant, en faisant référence à "{-2250.51, -1182.52, 385.689}" comme $ frow, "{-166.12, -543.746, -2376.73}" comme $ srow et "{0.480698, -0.861509, 0.163497}" comme $ null, ce sous-programme PHP traduit RA / DEC en coordonnées 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));
}
}
Malheureusement, je ne sais plus pourquoi cela fonctionne, mais l'utiliser + ajouter des positions d'étoiles connues donne des résultats tolérables (utilisez "voir l'image" pour la voir en taille réelle):
Cependant, comme vous pouvez le voir, les résultats ne sont pas parfaits, ce qui me convainc qu'une transformation linéaire n'était pas la bonne réponse. Je pense que gnomonic pourrait être le Graal que je cherchais.