2017-04-21 10 views
2

私は静止した全天カメラを持っていて、WCS解(ピクセルx、yをalt、az)に適合させたいと考えています。私はいくつかの星を識別した場合、私は複合モデルを作成し、ちょうどproj_aff = Sky2Pix_ZEA + AffineTransformation2Dを言うし、その後astropy.modeling.fittingにそれを養うためにastropyの能力を活用したいのですがthuslyアストロフィーで同定された星を使ってWCS座標解をフィッティングする

import numpy as np 
from astropy.modeling import models, fitting 
from astropy.modeling.projections import Sky2Pix_ZEA, AffineTransformation2D 
from scipy.optimize import minimize  

# Stars of known x,y on chip and alt,az in sky. 
star_obs = np.array([('Achernar', 3441.0, 2918.0, 49.947050461141515, 215.1280625253878), 
        ('Achernar', 3576.0, 3018.0, 43.715460044327585, 217.98734214492922), 
        ('Betelgeuse', 2123.0, 971.0, 43.319872170968644, 40.984431336638984), 
        ('Betelgeuse', 2330.0, 956.0, 47.122656796538564, 32.091831385823845), 
        ('Betelgeuse', 2677.0, 949.0, 51.30177229534061, 14.886238412655885), 
        ('Canopus', 2221.0, 2671.0, 55.59320568854928, 141.12216403321605)], 
        dtype=[('star_name', 'S10'), ('x', '<f8'), ('y', '<f8'), 
        ('alt', '<f8'), ('az', '<f8')])  

class sky2pix(object): 
    def __init__(self, x, y, alt, az): 
     projection = Sky2Pix_ZEA() 
     self.affine = AffineTransformation2D() 
     self.x = x 
     self.y = y 
     self.projx, self.projy = projection(az, alt) 

    def __call__(self, x0): 
     self.affine.translation.value = x0[0:2] 
     self.affine.matrix.value = x0[2:] 
     newx, newy = self.affine(self.projx, self.projy) 
     residuals = np.sum((newx - self.x)**2 + (newy-self.y)**2) 
     return residuals 

fun = sky2pix(star_obs['x'], star_obs['y'], star_obs['alt'], star_obs['az']) 
x0 = np.array([np.median(star_obs['x']), np.median(star_obs['y']), 1., 0., 0., 1.]) 
fit_result = minimize(fun, x0) 

初期解を得ることができますルーチン、しかし私はAffineTransformation2D 2つの出力を返すと対処する方法を伝えることはできません。

+0

あなたは[astrometry.net](http://astrometry.net)を使ってみましたか?これはあなたの質問に直接答えませんが、あなたの問題を解決するかもしれません。 – Thucydides411

+0

はい。 Astrometry.netは魚眼レンズにはあまり適していないことが分かります。天頂付近に小さな切れ目を入れれば収束することができます。 –

答えて

0

現在のところ、astropy.modelingのフィッタは、複数の出力(私が遭遇した制限)を処理することはできませんが、これはドキュメントからはっきりしません。さらに、モデルSky2Pix_ZEAAffineTransformation2Dは、何らかの理由で現在fittable=Falseという属性を持っています。

複数の出力とdocumented the limitationをサポートするためにissueを開設しましたが、すぐに誰かがこれに取り組むことができるかどうかはわかりません(次回のリリースではほとんど間違いありません) 。

サブクラス化Fitterhere)のように、独自のフィッタを書くことができます(該当する場合)。同僚は数十行の特殊なものを書いていますが、(既存のコードから)統計関数とオプティマイザを理解するためのインタフェースがいくつかあります。

関連する問題