我正在寻找一种方法,可以在过采样后在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)
如果有人对过采样后如何恢复准确的像素坐标有任何想法,那就太好了。谢谢!
答案 0 :(得分:0)
原则上,您描述的解决方案“将x,y乘以5”是正确的。您的实现中一定有一个错误。
您没有显示用于计算坐标的代码,所以我只能猜测问题所在。
一些提示:
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]])
),您将迅速在计算坐标的代码中找到并解决问题。