Как просмотреть это.fits изображение без изменения размера и без изменения цвета?
Я пытаюсь открыть полноцветное изображение из '.fits'
файл. Но, сравнивая его с соответствующим '.gif'
изображение, кажется, есть ошибка относительно его цвета и размера.
Как я могу просмотреть настоящее цветное изображение в его правильных размерах?
В качестве примера можно выбрать '.fits'
файл и соответствующий '.gif'
файл, расположенный в верхней части этой веб-страницы. Мой пример кода, который использует модуль APLPY, приведен ниже.
def from_fits_to_image(color_scheme, rloc, rname='synop_Ml_0.2104', rext='.fits', cmap=None):
"""
color_scheme : 'rgb', 'grayscale', or 'false color'; color scheme of image to be shown
rloc : type <str>; location of file to be read
rname : type <str>; name of file to be read
rext : type <str>; extension of file to be read
cmap : None or type <str>; colormap
"""
rpath = rloc + rname + rext
if color_scheme == 'rgb':
pic = aplpy.FITSFigure(rpath)
# pic.show_rgb(alt_filename) # what filename is supposed to go here?
else:
pic = aplpy.FITSFigure(rpath)
if color_scheme == 'grayscale':
pic.show_grayscale()
elif color_scheme == 'false color':
if cmap is None:
pic.show_colorscale()
else:
pic.show_colorscale(cmap=cmap)
# plt.savefig(...)
plt.show()
Пока один обеспечивает правильное rloc
(расположение загруженного '.fits'
файл) и color_scheme
приведенный выше код будет работать.
Вызов функции ниже покажет пустой график правильных размеров. Чтобы сделать его не пустым, я должен предоставить другое существующее имя файла, хотя мне неясно, что именно это должно быть.
from_fits_to_image(color_scheme='rgb', rloc=rloc)
Каждый из приведенных ниже вызовов функций показывает график, размер которого был изменен на маленький. В то время как color_scheme='grayscale'
Похоже, что цвет окрашивает сюжет правильно, другие методы не окрашивают изображение должным образом.
from_fits_to_image('grayscale', rloc=rloc)
from_fits_to_image('false color', rloc=rloc)
from_fits_to_image('false color', rloc=rloc, cmap='plasma')
Для сравнения '.gif'
изображение ниже. В идеале вывод будет выглядеть точно так, как показано на рисунке ниже.
РЕДАКТИРОВАТЬ:
Я пытался использовать astropy
, PIL
, а также pyfits
безуспешно. Любая помощь будет оценена.
РЕДАКТИРОВАТЬ 2:
Ниже приведен результат использования fits
от astropy.io
,
from astropy.io import fits
def reada(rloc, rname='synop_Ml_0.1998', rext='.fits'):
""" """
rpath = rloc + rname + rext
# hdu_list = fits.open(rpath)
# hdu_list.info()
pic = fits.getdata(rpath)
plt.imshow(pic)
plt.show()
reada(rloc=rloc)
Я играл с vmin
а также vmax
kwargs, но безуспешно. Кроме того, используя pyfits
открытие файла приводит к следующей ошибке, даже при использовании pyfits.open(rpath, uint=True, do_not_scale_image_data=True)
:
TypeError: Image data can not convert to float
1 ответ
Судя по рисунку, кажется, что изображение ложного цвета, и это вопрос выбора правильной цветовой карты. Я не могу сказать, есть ли в python карта цветов, эквивалентная той, с которой вы связаны, но мы можем найти что-то очень близкое, воссоздав все функции на изображении:
fig = aplpy.FITSFigure('synop_Ml_0.2104.fits')
fig.show_colorscale(vmin=-60, vmax=60, cmap='hot')
который показывает следующее (обратите внимание, что aplpy
не понимает эту систему координат, поэтому рисует фигуру в пиксельных координатах):
Вторая часть вопроса более сложная, и я не могу на нее ответить полностью. Во-первых, вам нужно преобразовать время Каррингтона в долготу и синусоиду в градусы, а затем построить новые значения для меток оси либо вместо старых, либо в качестве осей паразита наряду со старыми (вы можете обратиться к паразиту Пример осей здесь).
Похоже, что с 9 ноября 1853 года время Каррингтона повернуто только на градусы, а ось х охватывает ровно 360 градусов, поэтому я предполагаю, что преобразование представляет собой просто смещение на 757079,95, значение оси х на левом краю. Мы можем дважды проверить его по мировым координатам, посмотрев, как диапазон пикселей на карте соответствует диапазону координат:
In [88]: fig._wcs.wcs_pix2world(fig._ax1.get_xlim(), fig._ax1.get_ylim(), origin=1)
Out[88]: [array([757439.95, 757079.95]), array([-1., 1.])]
и разница в значениях для краев оси, 757079,95 и 757439,95, составляет ровно 360 градусов.
Итак, мы можем использовать некоторые matplotlib
хитрости, чтобы вручную сместить значения координат, чтобы заставить их перейти от нуля до 360 и получить ось, соответствующую вашему изображению GIF:
# using hidden attributes is non-pythonic but aplpy does not leave us other options
ax = fig._ax1
x_range = ax.get_xlim()
new_ticklabels = np.arange(60, 361, 60)
new_tick_positions = new_ticklabels / 360. * x_range[1] + x_range[0]
ax.set_xticks(new_tick_positions)
ax.set_xticklabels(new_ticklabels)
fig.axis_labels.set_xtext('Carrington Longitude')
Имейте в виду, что aplpy
это библиотека, предназначенная для построения небесных, а не солнечных координат, поэтому преобразование осей для правильной работы может быть довольно болезненным процессом. Альтернативный и, возможно, лучший способ - построить файл подгонки с sunpy
библиотека питонов для физики Солнца. Тем не менее, я никогда не использовал его, и, похоже, выдает ошибку для этого конкретного файла соответствия. Похоже, вам нужно изменить заголовок файла подгонки, чтобы правильно прочитать координаты. Возможно, вы можете связаться с sunpy
сообщество, если вы хотите использовать библиотеку?