gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:03:12 25 4
gpt4 key购买 nike

我正在尝试从 '.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) 

enter image description here

下面的每个函数调用都会显示一个已调整为小尺寸的绘图。虽然 color_scheme='grayscale' 似乎可以正确地为绘图着色,但其他方法不能正确地为图像着色。

from_fits_to_image('grayscale', rloc=rloc)

enter image description here

from_fits_to_image('false color', rloc=rloc)

enter image description here

from_fits_to_image('false color', rloc=rloc, cmap='plasma')

enter image description here

为了进行比较,'.gif' 图像如下。理想情况下,输出将如下图所示。

编辑:

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

enter image description here

编辑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

enter image description here

最佳答案

从 gif 来看,该图像似乎是假彩色图像,这是选择正确的颜色图的问题。我不能说 python 中是否有与您链接到的颜色图等效的颜色图,但我们可以找到非常接近的东西,重新创建图像中的所有功能:

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

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

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

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

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')

enter image description here

请记住,aplpy 是一个为绘制天体坐标而不是太阳坐标而设计的库,因此使轴变换正常工作可能是一个相当痛苦的过程。另一种方法,也许是更好的方法,是使用 python library sunpy 绘制拟合文件。对于太阳物理学。但是,我从未使用过它,并且它似乎会针对这个特定的拟合文件引发错误。看起来您需要修改拟合文件的标题才能正确读取坐标。如果您想使用该库,也许可以联系 sunpy 社区?

关于python - 如何在不调整大小和不修改颜色的情况下查看此 .fits 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49375502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com