Нанесите изображение FITS на сетку всего неба - PullRequest
0 голосов
/ 15 февраля 2019

Я хотел бы нанести изображение FITS на набросок всего неба.

Я так далеко отрисовал все небо:

import matplotlib.pyplot as plt
from astropy.utils.data import get_pkg_data_filename
from astropy.io import fits

image_file = get_pkg_data_filename('tutorials/FITS-images/HorseHead.fits')
image_data = fits.getdata(image_file, ext=0)

plt.subplot(111, projection='aitoff')
plt.grid(True)
plt.imshow(image_data, cmap='gray')
plt.show()

Но я не могу показатьсячтобы изображение FITS было правильно выровнено по сетке


Приведенный выше код приводит к следующему actual result Но я пытаюсь получить что-то более похожее на expected result, где синий квадрат - это фактическое положение изображения в image_file

1 Ответ

0 голосов
/ 15 февраля 2019

image_data - это просто массив значений пикселей, и на самом деле он не содержит никакой информации о положениях и ориентациях пикселей на карте неба.Вы также должны извлечь эту информацию из файла FITS.

Примером может быть (на основе информации из здесь и здесь ):

import matplotlib.pyplot as plt
from astropy.utils.data import get_pkg_data_filename
from astropy.io import fits
from astropy.wcs import WCS
from astropy.visualization.wcsaxes.frame import EllipticalFrame

image_file = get_pkg_data_filename('tutorials/FITS-images/HorseHead.fits')
image_header = fits.open(image_file)[0].header  # extract header info
image_data = fits.getdata(image_file, ext=0)

# use the WCS class to get coordinate info and projection axes to use
wcs = WCS(image_header)

# make the axes using the EllipticalFrame class
ax = plt.subplot(projection=wcs, frame_class=EllipticalFrame)

# add the image
im = ax.imshow(image_data, origin='lower')

# add a grid
overlay = ax.get_coords_overlay('fk5')
overlay.grid(color='white', ls='dotted')

plot of horsehead nebula

Поскольку конкретный пример изображения не распространяется по всему небу, вы увидите только небольшой участок (но вы можете расширить график, используя ax.set_xlim()и ax.set_ylim() по мере необходимости, хотя я не уверен, что это за единицы, и также стоит отметить, что это изображение на самом деле просто покрывает очень маленький участок неба), но если бы ваше изображение было над всем небом, оно бы выглядело какпроекция Aitoff, как показано здесь .

Я думаю, что это работает только с последней версией astropy (v3.1), Matplotlib (v3.0.2), и поэтому требует Python> = 3.5.

Возможно, вы также захотите взглянуть на healpy , хотя это невозможно прочитать в файле FITS примера астропии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...