Как просмотреть это.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 сообщество, если вы хотите использовать библиотеку?

Другие вопросы по тегам