Tengo una imagen de 1443x998 de las estrellas (tomada con una cámara de 35 mm y luego escaneada) con las siguientes estrellas en las siguientes ubicaciones de píxeles:
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]
¿Qué función matemática convierte la ubicación de píxeles en RA / DEC y viceversa? Notas:
Las estrellas brillantes son manchas en la imagen; las coordenadas anteriores son aproximadamente el centro de la burbuja, pero pueden estar apagadas en + -2 píxeles.
Sé que puedo rotar la esfera celeste para que el centro de mi imagen tenga coordenadas polares 0,0. Entonces, la verdadera pregunta es "cómo encontrar esta rotación" (pero vea el siguiente punto).
Si la elevación / acimut fuera lineal en las imágenes, esto sería fácil (er), pero no lo son: medir la distancia angular con fotografías
Puedo proporcionar ubicaciones de píxeles de más estrellas si eso ayuda. Creo que 3 debería ser suficiente, pero podría estar equivocado.
Traté de elegir 3 estrellas que se "extendieron" en la imagen (porque creo que eso reduce el error, no estoy seguro), pero no estoy seguro de haber tenido éxito.
Estoy haciendo esto para varias imágenes y me gustaría un método general.
Hacer esto me ayudará a identificar estrellas más débiles / objetos Messier / etc en la imagen.
Estoy seguro de que muchos astrofotógrafos quieren hacer esto, pero no han encontrado ningún software existente que lo haga.
EDITAR: ¡Gracias, whuber! La proyección gnomónica es lo que me faltaba. Ya había hecho esto suponiendo una transformación lineal:
(* 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}];
];
donde x, y y z eran cada una de las listas de 4 elementos que consisten en una estrella RA, declinación, coordenada x en la imagen y coordenada y en la imagen. xwid e ywid son el ancho y la altura de la imagen. En este 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}
}
Ahora, refiriéndose a "{-2250.51, -1182.52, 385.689}" como $ frow, "{-166.12, -543.746, -2376.73}" como $ srow y "{0.480698, -0.861509, 0.163497}" como $ null, Esta subrutina PHP traduce RA / DEC a coordenadas 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));
}
}
Lamentablemente, ya no tengo idea de por qué esto funciona, pero usarlo + agregar posiciones conocidas de estrellas produce resultados tolerables (use "ver imagen" para verlo a tamaño completo):
Sin embargo, como puede ver, los resultados no son perfectos, convenciéndome de que una transformación lineal no era la respuesta correcta. Creo que gnomonic podría ser el grial que estaba buscando.