对FITS图像进行过采样后,从ra,dec获取像素坐标

时间:2018-08-16 22:28:22

标签: python python-3.x astropy fits oversampling

我正在寻找一种方法,可以在过采样后在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)

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

1 个答案:

答案 0 :(得分:0)

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

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

一些提示:

  • 首先阅读以下页面,以了解如何使用Cutout2D:http://docs.astropy.org/en/stable/nddata/utils.html 请注意,在示例中使用了cutout.data,但是还有一个cutout.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]])),您将迅速在计算坐标的代码中找到并解决问题。