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.
fonte
Fazer isso com o mesmo grau de precisão que os astrônomos profissionais fazem seria realmente difícil. Isso exigiria uma caracterização extremamente precisa das distorções produzidas pela lente e das imperfeições no sensor da câmera. No entanto, você provavelmente não precisa desse grau de precisão. Deveria ser suficiente para você supor que sua lente não apresenta grandes quantidades de distorção (o que é uma boa suposição para uma lente de qualidade) e que o sensor de sua câmera está muito próximo de uma grade perfeitamente regular (que é uma suposição muito boa para até uma câmera barata).
Tudo o que resta é descobrir a transformação de coordenadas que descreve a orientação da câmera, ou seja, a direção em que ela foi apontada e o grau em que foi girada.
O que você está procurando então é chamado de transformação afim ou mapa afim. Que é apenas um nome elegante para uma matriz pela qual você multiplicaria suas coordenadas de pixel para obter suas coordenadas astronômicas. No caso de um mapa afim, essa transformação pode incluir qualquer grau de rotação, escala, cisalhamento e translação.
O significado do componente de rotação é bastante óbvio. O fator de escala descreve simplesmente quanto do céu é coberto por cada pixel em termos de RA / Dec. O cisalhamento é uma transformação que faria a imagem de um retângulo se tornar um paralelogramo, mas não deveria haver esse efeito em uma imagem de objetos no infinito (como estrelas). Por fim, o componente de tradução simples adiciona um deslocamento para explicar o fato de que o pixel (x = 0, y = 0) na sua imagem provavelmente não corresponde a (RA = 0, dez = 0).
Como você tem três estrelas de referência em sua imagem, você tem informações suficientes para calcular o relacionamento entre as coordenadas de pixel e o RA / Dec que você está procurando. Isso seria feito pelo ajuste de mínimos quadrados lineares (não mínimos quadrados não lineares, como mencionado acima) para determinar os valores dos componentes da matriz que melhor correspondem às suas coordenadas de pixel com o RA / Dec conhecido das estrelas de referência. Uma vez que a matriz é estabelecida, você pode aplicá-la às coordenadas de pixel de outras estrelas para obter seu RA / Dec.
Embora eu pudesse fazer isso com relativa facilidade, infelizmente não tenho certeza de como ajudá-lo. Isso envolveria alguma habilidade matemática que está um pouco além do escopo do photo.SE. Sou engenheiro óptico, mas não sou muito fotógrafo; o software que eu usaria para isso foi projetado para os engenheiros fazerem computação numérica pesada e não é realmente uma ferramenta fotográfica. Pode haver maneiras de fazer isso usando pacotes de software voltados para fotógrafos, mas eu não os conheço.
fonte