gpt4 book ai didi

python - 通过 PyFITS/AstroPy 的 FITS 图像中的笛卡尔投影问题

转载 作者:太空狗 更新时间:2023-10-30 00:56:09 25 4
gpt4 key购买 nike

我一直在寻找这个问题的解决方案,但一无所获。

我正在通过 matplotlib 生成矩形 FITS 图像,然后使用 AstroPy(或 PyFITS)将 WCS 坐标应用于它们。我的图像采用银河经纬度,因此适合我的 map 的标题关键字应该是 GLON-CARGLAT-CAR(用于笛卡尔投影)。我看过 other mapsSAO DS9 中使用相同的 map 投影坐标工作得很好......网格应该是完全正交的。可以找到 FITS 标准投影 here.

但是当我生成 map 时,坐标根本不是笛卡尔坐标。这是我的 map (左)和大致相同区域的另一张引用 map (右)的并排比较。两者都在 FITS header 中列出了 GLON-CARGLAT-CAR,但是在 SAO DS9 中查看时我的很奇怪(请注意坐标网格是 SAO DS9 生成的东西基于 FITS header 中的数据,或者至少存储在 FITS 文件中的某处):

(left) my map, and (right) reference map.  HEADER keywords are the same, both Cartesian

这是有问题的,因为如果投影错误,坐标分配算法将为每个像素分配不正确的坐标。

有没有人遇到过这个,或者知道可能是什么问题?

我已经尝试应用其他投影(只是为了看看它们在 SAO DS9 中的表现)并且结果很好......但是我的笛卡尔和墨卡托投影没有像它们应该的那样出现正交网格。

我无法相信这会是 AstroPy 中的错误,但我找不到任何其他原因......除非我在 header 中的参数格式不正确,但我仍然不明白这会如何导致我遇到的问题。或者你会推荐使用其他东西吗? (我看过 matplotlib basemap ,但在我的电脑上运行时遇到了一些问题)。

我的标题代码如下:

 from __future__ import division
import numpy as np
from astropy.io import fits as pyfits # or use 'import pyfits, same thing'

#(lots of code in between: defining variables and simple calculations...
#probably not relevant)

header['BSCALE'] = (1.00000, 'REAL = TAPE*BSCALE + BZERO')
header['BZERO'] = (0.0)
header['BUNIT'] = ('mag ', 'UNIT OF INTENSITY')
header['BLANK'] = (-100.00, 'BLANK VALUE')
header['CRVAL1'] = (glon_center, 'REF VALUE POINT DEGR') #FIRST COORDINATE OF THE CENTER
header['CRPIX1'] = (center_x+0.5, 'REF POINT PIXEL LOCATION') ## REFERENCE X PIXEL
header['CTYPE1'] = ('GLON-CAR', 'COORD TYPE : VALUE IS DEGR')
header['CDELT1'] = (-glon_length/x_length, 'COORD VALUE INCREMENT WITH COUNT DGR') ### degrees per pixel
header['CROTA1'] = (0, 'CCW ROTATION in DGR')
header['CRVAL2'] = (glat_center, 'REF VALUE POINT DEGR') #Y COORDINATE OF THE CENTER
header['CRPIX2'] = (center_y+0.5, 'REF POINT PIXEL LOCATION') #Y REFERENCE PIXEL
header['CTYPE2'] = ('GLAT-CAR', 'COORD TYPE: VALUE IS DEGR') # WAS CAR OR TAN
header['CDELT2'] = (glat_length/y_length, 'COORD VALUE INCREMENT WITH COUNT DGR') #degrees per pixel
header['CROTA2'] = (rotation, 'CCW ROTATION IN DEGR') #NEGATIVE ROTATES CCW around origin (bottom left).
header['DATAMIN'] = (data_min, 'Minimum data value in the file')
header['DATAMAX'] = (data_max, 'Maximum data value in the file')
header['TELESCOP'] = ("Produced from 2MASS")

pyfits.update(filename, map_data, header)

感谢您提供的任何帮助。

最佳答案

-CAR 投影的现代定义中(来自 Calabretta 等人),仅 GLON-CAR/GLAT-CAR 投影如果 CRVAL2 设置为零,则生成直线网格。如果 CRVAL2 不为零,则网格是弯曲的(这应该与 Astropy 无关)。您可以尝试通过调整 CRVAL2CRPIX2 来解决此问题,使 CRVAL2 为零。这有帮助吗?

只是为了阐明我的意思,请在上面的代码之后和写出文件之前尝试:

header['CRPIX2'] -= header['CRVAL2'] / header['CDELT2']
header['CRVAL2'] = 0.

运气好吗?

如果您查看所查看的“引用”文件的 header ,您会发现那里的 CRVAL2 为零。需要明确的是,CRVAL2 为非零并没有什么错误,但网格不再是直线。

关于python - 通过 PyFITS/AstroPy 的 FITS 图像中的笛卡尔投影问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21415059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com