我正试图从一个物体的一个图像中绘制轮廓,比如在A波段中,在同一个物体的较低分辨率图像上绘制轮廓,让我们说在Z带中。
两个图像都是大型文件,所以我必须创建每个图像的2D剪切。然而,带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,所以如果它有点粗糙我会道歉。
答案 0 :(得分:4)
使用reproject的问题在于您传递了(stamp_a.data, wcs_a)
,但wcs_a
是来自原始图片的WCS,而不是来自邮票。
您可以从Cutout2D图像中获取与您的图章匹配的WCS对象。我认为改为(stamp_a.data, stamp_a.wcs)
会给你一个正确的结果。
你看过astropy.visualisation.wcsaxes了吗?您可以看到一个示例here如何绘制图像,以及使用不同的WCS从第二个图像上绘制轮廓图。如果这适合您,则比手动使用Cutout2D
和reproject
更简单。
我不确定性能;如果你的图像很大,你仍然可能想要像现在一样做剪裁。如果内存/执行时间不是问题,您可以绘制整个图像,然后使用wcsaxes
设置所需的范围(参见他们的教程文档)。
是否自己进行重新投影或在幕后让matplotlib
和astropy.visualisation.wcsaxes
问题也是一个品味问题。直接使用reproject
代码会更复杂,但会让您更好地控制所使用的精确重投影方法(例如插值或更慢的保持通量reproject_exact
),并且可能更容易完全理解发生了什么事。