从经度和纬度获取超采样FITS图像中的像素坐标

3

我希望找到一种方法,可以定位我的经过超采样后的FITS图像中与目标在以度为单位给出的赤经和赤纬位置对应的像素坐标。如果我不需要进行超采样,这将是简单的操作。但是,我需要进行超采样处理。对于一个未经修改的FITS图像,我可以执行以下操作:

from astropy.wcs import WCS

ra, dec = (43.603, 31.029)
w = WCS('myimage.fits')
x, y = w.all_world2pix(ra, dec, 1) #this gives me the pixel coordinates of the object at (ra, dec) position

然而,当我对其进行过采样,然后尝试查找像素坐标时,由于(ra,dec)不再适用于过采样图像,因此显然不准确。 由于我正在进行5x5的过采样,因此我尝试将上述x、y乘以5。但是,当我在ds9中放大这个点时,它显示物体偏离中心,所以我认为这不起作用。由于这可能有助于查看,下面是代码中的过采样部分。在此处,data只是原始FITS图像中包含数据的2D numpy数组。

from astropy.nddata import Cutout2D
import numpy as np
from scipy import interpolate

def oversample(data_set, N):
    size = 120 #pixel size of my box cutout
    geom_ctr = (np.shape(data_set)[0]//2, np.shape(data_set)[1]//2)
    cutout = Cutout2D(data_set, geom_ctr, size).data
    Y, X = np.shape(cutout)
    x = np.linspace(0, 0.5, X)
    y = np.linspace(0, 0.5, Y)

    f = interpolate.interp2d(x, y, cutout, kind='cubic')
    Xnew = np.linspace(0, 0.5, X*N)
    Ynew = np.linspace(0, 0.5, Y*N)
    new_data = f(Xnew, Ynew)

    return new_data

resampled_data = oversample(data, 5)

如果有任何关于如何在过采样后恢复准确的像素坐标的想法,那将是非常好的。谢谢!

1个回答

1

原则上,您描述的解决方案“将x,y乘以5”是正确的。您的实现中一定存在错误。

您没有展示用于计算坐标的代码,因此我只能猜测问题所在。

一些提示:

  • 首先学习使用Cutout2D,请阅读此页面:http://docs.astropy.org/en/stable/nddata/utils.html。请注意,您在示例中使用的是cutout.data,但还有一个cutout.wcs,表示您的裁剪区域的WCS。如果要使用裁剪区域,则必须使用该WCS(而不是原始图像的WCS)在世界和像素坐标之间进行转换。
  • 尝试在超采样图像上获得使用像素/天空坐标的工作示例,而不需要裁剪的额外复杂性。如果您发布了一个可以运行但结果不正确的最小示例,那么我们回答您的问题将更容易。
  • 请注意,如果在w.all_world2pix(ra, dec, 1)调用中传递第三个参数origin=1,则第一个像素的中心将位于像素位置1。您必须完全正确地获取x和y插值位置以进行插值,并使用计算坐标的代码行。可能更容易通过传递origin=0.5,即将第一个像素的中心放置在像素位置0.5并将图像角落放置在像素位置0.0?这样可能更容易编写放置插值节点的行以及正确计算插值图像中的坐标。
如果您将任务分解为单独的步骤或函数(而不是一个既切割又上采样的函数),并使用一个经过精心选择的测试用例,其中您知道期望的输出(例如,一张只有几个像素并且您知道预期结果的图像,如data = np.array([[1, 2, 3], [4, 5, 6]])),那么您将很快找到并修复计算坐标的代码中的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接