3

我正在寻找一种方法来定位我的 FITS 图像上的像素坐标,这些坐标对应于过采样后对象的 ra 和 dec 位置(以度为单位)。如果我没有过采样,这会很简单,但我需要。给定一个未改变的 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)

如果有人对如何在过采样后恢复准确的像素坐标有任何想法,那就太好了。谢谢!

4

1 回答 1

1

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

您没有显示用于计算坐标的代码,所以我只能猜测问题。

一些技巧:

  • 首先通过阅读此页面学习使用 Cutout2D:http ://docs.astropy.org/en/stable/nddata/utils.html 请注意,cutout.data您在示例中使用了一个,但也有一个cutout.wcs代表 WCS你的剪纸。如果您想使用剪切,则必须使用该 WCS(而不是原始图像中的 WCS)在世界坐标和像素坐标之间进行转换。
  • 尝试在过采样图像上获得一个带有像素/天空坐标的工作示例,而不会产生剪切的额外复杂性。如果您发布了一个最小的示例来尝试这样做,我们可以运行并且给出不正确的结果,那么您的问题会更容易回答。
  • 知道如果您将origin=1调用w.all_world2pix(ra, dec, 1)作为第三个参数传递,那么第一个像素的中心将位于像素位置 1。您必须获取 x 和 y 插值位置以进行插值,以及用于计算的代码行坐标完全正确。它可能更容易通过origin=0.5,即将第一个像素的中心放在像素位置 0.5 处,从而将图像的角落放在像素位置 0.0 处?这样,可能更容易编写放置插值节点的行,并正确计算插值图像中的坐标。

如果您将任务分成单独的步骤或功能(而不是一个同时执行剪切和上采样的功能)并使用您知道预期输出的精心选择的测试用例(例如,您知道预期输出的只有几个像素的图像结果,如data = np.array([[1, 2, 3], [4, 5, 6]])),您将在计算坐标的代码中快速找到并解决问题。

于 2018-08-19T22:45:19.023 回答