2016-11-26 2 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 

자른 프레임에서 좌표가 다른 이유는 무엇입니까?


두 가지 방법을 사용하여이를 해결할 수있는 두 가지 방법이 있습니다.

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

가브리엘 - 아, 알았어 주셔서 감사합니다. 지금 photutils 태그를 클릭하면 "photutils 태그에는 사용법에 대한 지침이 없습니다. 만들 수 있습니까?" '세부 정보'를 클릭하면 정보가 혼란스럽고 제안한 내용이 표시되지 않습니다. 저는 전원 사용자가 아니기 때문에 어디에서보고해야하는지 알고 계시다면 보내주십시오. 프로세스 나 새로운 제안 태그에서 향상시킬 수있는 것처럼 보입니다. – 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' 문서화 문자열을 읽습니다. 별도로 wcs를 전달해야합니다 (예 :'astropy.wcs import WCS; cutout = Cutout2D (data = hdu.data, wcs = WCS (hdu.header)') 그리고 출력'cutout' 객체를 봅니다. 문서에 따르면 새로운'data'와'wcs' 속성이 있어야합니다. 컷 아웃 .wcs를 다시 헤더로 돌려서 필요한 경우 데이터 및 헤더에서 HDU를 만들 수 있습니다. 도움이 되십니까? 지금 오프라인입니다. 내일은 작업 코드를 게시 할 수 있습니다. 실제로 있어야합니다. 'Cutout2D' 문서에서 WCS를 사용하는 예는 누군가가 pull 요청을 보내야합니다. – Christoph

+0

테스트에서 wcs와 함께 Cutout2D를 사용하는 두 가지 예가 있습니다 : 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 복사 :

한 가지 방법은 astropy.WCS을 사용하는 것입니다

prihdr.update(wcs_cropped.to_header()) 

파일을 저장하기 전에.

cutout_footprint이 무엇인지 잘 모르겠습니다. 따라서 wcs_cropped을 만들 때 조각 인덱스를 변경해야 할 수도 있습니다.

Cutout2D이라는 편의 기능이 WCS으로 기본적으로 업데이트됩니다.

+0

이것은 coords를 원래의 값에 가깝게하지만 여전히 꺼져 있습니다 :'12:10:37 +39 : 25 : 13'. 이 솔루션을 사용해 보셨습니까? 예상대로 작동합니까? 또한 경고가 트리거됩니다. 경고 : FITSFixedWarning : RADECSYS = 'FK5'/ WORLD 좌표계 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

가 추가 패키지를 필요로하기 때문에 또 다른 답 : ccdproc 특히 astropy.nddata.NDData에 따라 클래스 CCDData :

그것은 파일을 읽는 단순화가 :

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

단위는 헤더 장치 때문에 지정해야합니다을 astropy.units 모듈과 호환되지 않습니다.

CCDData에 대한 중요한 것은 (대부분) 당신이 그 (것)들을, 그들이 속성으로 저장되고 가장 기본적인 작업 보존 (업데이트) 직접 units의 관리, wcs, headermasks을 할 필요가 없다는 것입니다 따라서.

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

관련 문제