【问题标题】:How to view this .fits image without resizing and without modifying colors?如何在不调整大小和不修改颜色的情况下查看此 .fits 图像?
【发布时间】:2018-03-20 02:35:36
【问题描述】:

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

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

例如,可以选择'.fits' 文件和对应的'.gif' 文件located at the top of this webpage。下面是我的示例代码,它使用了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.iofits 的结果。

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

【问题讨论】:

  • gif图片是怎么产生的?你确定这不是假彩色图像?对于真彩色 rgb 图像,您通常需要组合通过红/绿/蓝滤镜拍摄的三张图像,但您提供的 fit 文件中只有一张图像。
  • 我不确定这些图像是如何产生的,尽管 gif 图像乍一看似乎是正确的,因为该图像描绘了太阳在太阳自转过程中的表面。我将阅读该网站以获取更多信息。至于组合三个图像过滤器,PIL 和 APLPY 有提取 RGB 过滤数据的方法。我是否错误地假设不能通过对图片进行三次(或一次有效)采样来生成 3 个 RGB 过滤数据数组?如果没有,是否可以从 fit 图像重新创建 gif 图像?
  • 我不确定是否可以从单个阵列生成 3 个 rgb 图像。也许在太阳天体物理学中有一些技巧可以做到这一点,但制作 rgb 图像背后的整个想法是使用三张图像,每张图像中都携带着独立的信息,所以我对此表示怀疑。
  • 现在我看,我认为你的gif图像确实是一个假彩色的。等一下,我会起草一个答案。

标签: python python-3.x python-imaging-library fits aplpy


【解决方案1】:

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

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

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

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

现在看起来卡灵顿时间自 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 library。但是,我从未使用过它,而且它似乎为这个特定的 fit 文件引发了错误。看起来您需要修改 fit 文件的标题才能正确读取坐标。如果您想使用该库,或许可以联系sunpy 社区?

【讨论】:

  • 哇,感谢您的详尽回答。我查看了SunPy documentation,看起来他们读取适合文件的方法是对 astropy 的包装。
  • 出于好奇,您是否从 x 轴范围除以 xticks 的数量中选择了 vmin 和 vmax 的值,是任意选择的,还是您使用不同的方法来选择这些值?
  • 我绘制了一个值的直方图,发现它大多在 +-50 附近达到峰值,所以我以这种相当随意的方式绘制它。
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多