1

我正在尝试从'.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,PILpyfits不成功。任何帮助,将不胜感激。

在此处输入图像描述

编辑2:

下面是使用fitsfrom的结果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)

我玩过the vminand vmaxkwargs,但没有成功。此外,使用pyfits打开文件会导致以下错误,即使使用pyfits.open(rpath, uint=True, do_not_scale_image_data=True)

TypeError: Image data can not convert to float

在此处输入图像描述

4

1 回答 1

2

从gif来看,好像是假色图,是选对色图的问题。我不能说 python 中是否有与您链接的颜色图等效的颜色图,但我们可以找到非常接近的东西,重新创建图像中的所有特征:

fig = aplpy.FITSFigure('synop_Ml_0.2104.fits')
fig.show_colorscale(vmin=-60, vmax=60, cmap='hot')

它显示了以下内容(请注意,aplpy不理解此坐标系,因此它以像素坐标绘制图形): 在此处输入图像描述

问题的第二部分比较棘手,我无法完全回答。首先,您需要将 Carrington 时间转换为经度,将正弦纬度转换为度数,然后绘制轴标签的新值而不是旧值或作为旧轴旁边的寄生虫轴(您可以参考寄生虫此处为轴示例)。

现在看起来卡灵顿时间自 1853 年 11 月 9 日以来只是旋转了度数,x 轴正好跨越 360,所以我假设转换只是偏移 757079.95,即左边缘的 x 轴值。通过查看地图的像素跨度与坐标跨度的对应关系,我们可以在世界坐标上仔细检查它:

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.])]

xaxis 边缘值的差异 757079.95 和 757439.95 正好是 360 度。

因此,我们可以使用一些matplotlib技巧来手动偏移坐标值,以强制它们从零变为 360,并让 xaxis 与您的 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的 python库来绘制 fit 文件。但是,我从未使用过它,而且它似乎为这个特定的 fit 文件引发了错误。看起来您需要修改 fit 文件的标题才能正确读取坐标。sunpy如果您想使用图书馆,也许您可​​以与社区取得联系?

于 2018-03-20T13:14:48.253 回答