如何在不调整大小和不修改颜色的情况下查看此 .fits 图像?

How to view this .fits image without resizing and without modifying colors?

我正在尝试从 '.fits' 文件中打开全彩图像。但是,当将它与相应的 '.gif' 图像进行比较时,它的颜色和大小似乎有误。

如何以正确的尺寸查看真彩色图像?

举个例子,可以select'.fits'文件和对应的'.gif'文件located at the top of this webpage. My example code, which uses the 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' 图像如下。理想情况下,输出看起来与下图完全一样。

编辑:

我曾尝试使用 astropyPILpyfits,但均未成功。任何帮助将不胜感激。

编辑 2:

下面是使用 astropy.io 中的 fits 的结果。

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)

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

TypeError: Image data can not convert to float

从动图来看,好像是false-color一张,关键是要选对色图。我不能说 python 中是否有与您链接到的颜色图等效的颜色图,但我们可以找到非常接近的东西,重新创建图像中的所有特征:

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

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

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

现在看起来卡林顿时间自 1853 年 11 月 9 日以来只是旋转了度数,并且 x-axis 正好跨越 360,所以我假设转换只是偏移了 757079.95,x-axis 左边缘的值。我们可以double-check它在世界坐标上,通过查看地图的像素跨度如何对应坐标跨度:

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

x 轴边的值差 757079.95 和 757439.95 正好是 360 度。

那么我们可以使用一些 matplotlib 技巧来手动偏移坐标值以强制它们从 0 变为 360 并使 x 轴与您的 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 library 用于太阳物理学。但是,我从未使用过它,它似乎会为这个特定的适合文件抛出错误。看起来您需要修改 fits 文件的 header 才能正确读取坐标。如果您想使用该库,也许您可​​以联系 sunpy 社区?