Tenho uma foto das estrelas em 1443x998 (tirada com uma câmera de 35 mm e depois digitalizada) com as seguintes estrelas nos seguintes locais de pixels:
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]
Que função matemática converte a localização do pixel em RA / DEC e vice-versa? Notas:
Estrelas brilhantes são bolhas na imagem; as coordenadas acima são aproximadamente o centro do blob, mas podem estar desativadas em + -2 pixels.
Eu sei que posso girar a esfera celeste para que o centro da minha imagem tenha coordenadas polares 0,0. Portanto, a verdadeira questão é "como encontrar essa rotação" (mas veja o próximo ponto).
Se a elevação / azimute fosse linear nas imagens, seria mais fácil, mas não é: Medir a distância angular com fotografias
Posso fornecer locais de pixel de mais estrelas, se isso ajudar. Acredito que 3 deve ser suficiente, mas posso estar errado.
Tentei escolher 3 estrelas que estavam "espalhadas" pela imagem (porque acho que isso reduz o erro, não tenho certeza), mas não tenho certeza se consegui.
Estou fazendo isso para várias fotos e gostaria de um método geral.
Fazer isso me ajudará a identificar estrelas mais fracas / objetos Messier / etc na imagem.
Tenho certeza que muitos astrofotógrafos querem fazer isso, mas não encontraram nenhum software existente que faça isso.
EDIT: Obrigado, whuber! A projeção gnomônica é o que estava faltando. Eu já tinha feito isso assumindo uma transformação linear:
(* 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}];
];
onde x, ye z eram, cada uma, listas de 4 elementos consistindo em RA de estrelas, declinação, coordenada x na imagem e coordenada y na imagem. xwid e ywid são a largura e a altura da imagem. Nesse 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}
}
Agora, referindo-se a "{-2250.51, -1182.52, 385.689}" como $ frow ", {-166.12, -543.746, -2376.73}" como $ srow e "{0.480698, -0.861509, 0.163497}" como $ null, esta sub-rotina PHP converte as coordenadas RA / DEC em 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));
}
}
Infelizmente, eu não tenho mais idéia do por que isso funciona, mas usá-lo + adicionar posições em estrela conhecidas gera resultados toleráveis (use "ver imagem" para ver em tamanho real):
No entanto, como você pode ver, os resultados não são perfeitos, me convencendo de que uma transformação linear não era a resposta certa. Eu acho que gnomônico pode ser o graal que eu estava procurando.