2016-11-26 28 views
3

ファイル(ダウンロードtest.fits)トリミング後に保存されていない:座標はフィットを考えてみましょう次のコードを

from astropy.io import fits 
from photutils.utils import cutout_footprint 

# Read fits file. 
hdulist = fits.open('test.fits') 
hdu_data = hdulist[0].data 
hdulist.close() 

# Some center and box to crop 
xc, yc, xbox, ybox = 267., 280., 50., 100. 
# Crop image. 
hdu_crop = cutout_footprint(hdu_data, (xc, yc), (ybox, xbox))[0] 
# Add comment to header 
prihdr = hdulist[0].header 
prihdr['COMMENT'] = "= Cropped fits file") 
# Write cropped frame to new fits file. 
fits.writeto('crop.fits', hdu_crop, prihdr) 

を元の(左)と(右)の画像が次のようになりクロップ:

enter image description here

フレーム中央の星の(ra、dec)equatorial coordinatesは次のとおりです。

Original frame: 12:10:32 +39:24:17 
Cropped frame: 12:12:07 +39:06:50 

トリミングされたフレームで座標が異なるのはなぜですか?


これは、2つの異なる方法を使用してこれを解決する2つの方法です。

from astropy.io import fits 
from photutils.utils import cutout_footprint 
from astropy.wcs import WCS 
from astropy.nddata.utils import Cutout2D 
import datetime 

# Read fits file. 
hdulist = fits.open('test.fits') 
hdu = hdulist[0].data 
# Header 
hdr = hdulist[0].header 
hdulist.close() 

# Some center and box to crop 
xc, yc, xbox, ybox = 267., 280., 50., 100. 

# First method using cutout_footprint 
# Crop image. 
hdu_crop = cutout_footprint(hdu, (xc, yc), (ybox, xbox))[0] 
# Read original WCS 
wcs = WCS(hdr) 
# Cropped WCS 
wcs_cropped = wcs[yc - ybox // 2:yc + ybox // 2, xc - xbox // 2:xc + xbox // 2] 
# Update WCS in header 
hdr.update(wcs_cropped.to_header()) 
# Add comment to header 
hdr['COMMENT'] = "= Cropped fits file ({}).".format(datetime.date.today()) 
# Write cropped frame to new fits file. 
fits.writeto('crop.fits', hdu_crop, hdr) 

# Second method using Cutout2D 
# Crop image 
hdu_crop = Cutout2D(hdu, (xc, yc), (xbox, ybox), wcs=WCS(hdr)) 
# Cropped WCS 
wcs_cropped = hdu_crop.wcs 
# Update WCS in header 
hdr.update(wcs_cropped.to_header()) 
# Add comment to header 
hdr['COMMENT'] = "= Cropped fits file ({}).".format(datetime.date.today()) 
# Write cropped frame to new fits file. 
fits.writeto('crop.fits', hdu_crop.data, hdr) 
+1

で明示的に実装されているガブリエル - ああ、OK、私が知っていただき、ありがとうござい。 ここでphotutilsタグをクリックすると、「photutilsタグには使用方法のガイダンスがありません。作成する手助けはできますか?」 「詳細」をクリックすると情報が混乱し、提案した内容が表示されません。 私はSOのパワーユーザーではありません、あなたがいて、これを報告する場所を知っているなら、してください。プロセスや新しい提案されたタグで改善できるもののように見えます。 – Christoph

+0

私が与えたタグの説明はピアレビューを待っています。私はあなたがこれを見ることができると思った。この問題に関する質問をMetaに投稿できますか? http://meta.stackoverflow.com/ – Gabriel

+0

@Gabrielあなたの質問にソリューションを編集する代わりに、あなたのソリューション(例えばCutout2D)を含む回答を投稿して、問題から解決部分をもう一度削除してください。あなたは答えとしてそれを受け入れることさえできます! – MSeifert

答えて

3

photutils.utils.cutout_footprintは、ピクセルを切り捨てるだけで、ピクセル座標とワールド座標を変換するために使用されるWCSを更新しません。

代わりにastropy.nddata.utils.Cutout2Dを使用してください。

+0

私は 'Cutout2D'(' cutout = Cutout2D(hdu_data、(xc、yc)、(xbox、ybox)) ')を使用しようとしましたが、保存しようとすると' KeyError: 'object''を生成するオブジェクトを返しますそれは 'fits.writeto( 'crop.fits'、cutout、prihdr)'です。 'hdu_crop = fits.PrimaryHDU(cutout.data)'を使って変換しようとしましたが、それでも同じエラーが発生します。 – Gabriel

+0

'Cutout2D'ドキュメントストリングを読んでください。これは、wscを別々に渡す必要がある、つまり 'astropy.wcs import WCSから;あなたのドキュメントには、 'data'と' wcs'という新しい属性があります。あなたがそれを必要とすれば、ヘッダとヘッダーからHDUを作り直すことができます。 私は今オフラインですが、明日は作業コードを投稿することができます 'Cutout2D'文書にWCSを使用した例、誰かがプルリクエストを送るべきです。 – Christoph

+0

テストでwcsでCutout2Dを使用する例が2つあります:https://github.com/astropy/astropy/blob/master/astropy/nddata/ tests/test_utils.py#L441 間違いなくドキュメントに入れる必要がありますが、今のところ役立つかもしれません。 – Christoph

2

イメージをスライスしたがWCS情報(特に参照ピクセル値)を変更しなかったため、座標が変更されました。

from astropy.wcs import WCS 
wcs = WCS(hdulist[0].header) 
wcs_cropped = wcs[280-50 : 280+50 , 267-25 : 267+25] 

、その後、あなたのヘッダにこの更新WCSをコピーします:

prihdr.update(wcs_cropped.to_header()) 

ファイルを保存する前に

一つの方法は、astropy.WCSを使用することです。

cutout_footprintが何であるかわからないので、wcs_croppedを作成するときにスライスインデックスを変更する必要があります。

Cutout2Dという便利な機能があり、デフォルトでWCSが更新されます。

+0

これは、コードを元の値に近づけますが、 '12:10:37 +39:25:13'のままです。このソリューションを試しましたか?あなたの期待どおりに機能しますか?また、警告が表示されます。警告:FITSFixedWarning:RADECSYS = 'FK5'/WORLD COORDINATE FRAME RADECSYSキーワードは非推奨です。RADESYSaを使用してください。 [astropy.wcs.wcs] 警告:FITSFixedWarning: 'datfix'が '' 03/03/95 'を' 1995-03-13 'に変更しました。 [astropy.wcs.wcs] ' – Gabriel

+0

私は、photutilsが' cutout_footprint'を使うとき(x、y)の規約を使用していると思います。 WCSをスライスするときに '[280-50:280 + 50,267-25:267 + 25]を使用できますか? – MSeifert

+0

はい、それでした。 'Cutout2D'クラスも面白そうです、私はそれをチェックアウトします。ありがとうMSeifert! – Gabriel

1

別の答えは、追加のパッケージ必要とするため:astropy.nddata.NDDataに基づいて、特にクラスCCDDataccdprocを:

これは、ファイルを読み取る簡素化:

from ccdproc import CCDData 
ccd = CCDData.read(filename, unit='erg/cm**2/s/AA') 

ユニットは、ヘッダ部ので、指定する必要がありますastropy.unitsモジュールと互換性がありません。

CCDDataについて重要なことは、(主に)あなたがそれらを、彼らは属性として保存され、最も基本的な操作は、保存(および更新)自分でunitsのケア、wcsheadermasksを取る必要がないということですそれに応じて。

ccd_cropped.write('cropped.fits') 

そして、それは正確に座標を更新しておく必要があります。たとえば、スライシング:あなたは、単に(再びそれを保存など)、それを処理し続けることができるように

xc, yc, xbox, ybox = 267., 280., 50., 100. 
ccd_cropped = ccd[int(yc - ybox // 2) : int(yc + ybox // 2), 
        int(xc - xbox // 2) : int(xc + xbox // 2)] 

このスライスccd_croppedはすでに、WCS情報を更新しました。スライス部分がastropy.nddata.NDDataRefを使用しても、実際に可能である、唯一のreadwrite一部がccdproc.CCDData

関連する問題