Python 如何覆盖两个.fits图像,每个图像具有不同的WCS/分辨率?

Python 如何覆盖两个.fits图像,每个图像具有不同的WCS/分辨率?,python,imshow,astronomy,astropy,fits,Python,Imshow,Astronomy,Astropy,Fits,我试着从一个物体的图像上画出轮廓,比方说在A波段,在同一物体的低分辨率图像上,比方说在Z波段 这两个图像都在大尺寸文件中,所以我必须为每个图像创建一个二维剪切。但是,Z带中的图像的像素远少于A带。因此,当我尝试在同一个图中绘制它们时,Z带中的图像根据像素尺寸绘制,因此在图的左下角非常小(请参见下面链接中的绘图)。我需要这两幅图像以天文角度尺寸为基础绘制,而不是像素 import numpy as np import matplotlib %matplotlib inline import mat

我试着从一个物体的图像上画出轮廓,比方说在A波段,在同一物体的低分辨率图像上,比方说在Z波段

这两个图像都在大尺寸文件中,所以我必须为每个图像创建一个二维剪切。但是,Z带中的图像的像素远少于A带。因此,当我尝试在同一个图中绘制它们时,Z带中的图像根据像素尺寸绘制,因此在图的左下角非常小(请参见下面链接中的绘图)。我需要这两幅图像以天文角度尺寸为基础绘制,而不是像素

import numpy as np
import matplotlib
%matplotlib inline
import matplotlib.pyplot as plt
from astropy.io import fits
from astropy import units as u
from astropy.coordinates import SkyCoord
from astropy.wcs import WCS
from astropy.nddata import Cutout2D
from reproject import reproject_interp

# Read in .fits images and WCS information
image_a = fits.open("image_a.fits")
image_z = fits.open("image_z.fits")
wcs_a = WCS(image_a.header).celestial
wcs_z = WCS(image_z.header).celestial

# Define object RA and DEC
obj_coords = SkyCoord(ra=135.19081*u.degree, dec=0.68991393*u.degree, frame='fk5')

# Create 2D cutouts of the object in each band in a 6 by 6 arcsec box
size = u.Quantity((6, 6), u.arcsec)
stamp_a = Cutout2D(image_a.data, obj_coords, size, wcs=wcs_a)
stamp_z = Cutout2D(image_z.data, obj_coords, size, wcs=wcs_z)

# Plot the the stamp in band Z with contours from band A
ax = plt.subplot(projection = wcs_z)
plt.imshow(stamp_z.data, cmap='gray', origin='lower', alpha=1)
ax.contour(stamp_a.data, levels = [2*sigma,3*sigma,4*sigma,5*sigma], 
colors='green')

我也看到了一些关于使用reproject的东西。我试过了,但我不认为我完全理解它,因为它只产生了一个很小的像素。这就是我所尝试的:

array, footprint = reproject_interp((stamp_a.data, wcs_a), image_z.header)
plt.imshow(array, origin='lower')

让我知道如果有任何信息我错过了回答这个问题。在使用IDL几年后,我上周刚刚切换到python,因此如果有点粗糙,我很抱歉。

使用方法的问题是传递
(stamp_.data,wcs_a)
,但是
wcs_a
是原始图像中的wcs,而不是来自图章

您可以从图像中获取与戳记匹配的WCS对象。我认为更改为
(stamp\u a.data,stamp\u a.wcs)
将为您提供正确的结果

你看过了吗?您可以看到一个如何绘制图像的示例,以及如何使用不同WCS从第二个图像过度绘制轮廓。如果这对您有效,它将比手动使用
Cutout2D
reproject
更简单

我不确定性能;如果你的图像是巨大的,你可能仍然想做剪贴画,就像你现在做的那样。如果内存/执行时间没有问题,您可以绘制整个图像,然后使用
wcsaxes
(参见他们的教程文档)设置所需的范围


是自己重新投影还是让
matplotlib
astropy.visualization.wcsaxes
隐藏在幕后也是一个品味问题。直接使用
reproject
代码要复杂一些,但可以让您更好地控制所使用的精确重投影方法(例如插值或较慢的通量守恒
reproject\u exact
),并且可能更容易完全理解所发生的事情。

非常感谢@Christoph!我结合了你的一些建议,使它起作用。我用较少的像素从图像中绘制了戳记,将戳记的WCS投影到绘图上,然后将自动缩放设置为“False”,并使用该图像的WCS从另一个图像中过度绘制轮廓。其中很大一部分原本不起作用的原因是我在整个过程中使用了错误的WCS对象(戳记与原始图像)。再次感谢!