每次运行后,为什么我的代码从同一张图片的同一列表中查找更多对象?

时间:2019-01-14 03:08:35

标签: python python-3.x astropy

我编写了一个代码,该代码查看一个预先存在的图像文件夹,并使用一个恒定的对象名称列表及其在天空中的对应ra,dec位置在每个原始图像中定位它们,并进行10x10 arcsec剪裁(如果对象在图像中)。它正在运行,并且我得到了一些漂亮的抠图,但是由于某些奇怪的原因,每次我运行它时,都会保存新的抠图图像!我真的不知道为什么会这样,因为对象列表及其ra,dec位置始终是完全相同的,而且我总是将剪切图像保存为图像和对象的准确名称,且不应更改。所有原始图像也保持不变。

我进行了许多测试,但仍然感到困惑-通过我的测试,我确认每次运行中对象列表(objs)保持相同,并且我得出的结论相同。原始图像(all_images)和ra,dec位置(列表ras_hmsdecs_deg)。

图像和对象的原始数目都非常长,因此我在较小的子集上运行代码以进行测试,并且每次运行期间仍出现新的剪切图像的问题。我在以下图像上运行了以下代码:'calexp-HSC-I-18012-1,7.fits', 'calexp-HSC-I-18114-0,0.fits', 'calexp-HSC-I-18114-1,1.fits',这些图像保存在目录/Users/myuser/Desktop/Original_Images/中。我在不同的目录中运行代码,最后也保存了切口。第一次运行时,我生成了以下切口:'cutout-IMG-HSC-I-18114-0,0-OBJ-NEP175719.1+652743.2.fits', 'cutout-IMG-HSC-I-18114-1,1-OBJ-NEP175509.2+653523.9.fits'。几分钟后,当我运行完全相同的代码而不进行任何更改时,我还生成了这两个新图像:'cutout-IMG-HSC-I-18114-0,0-OBJ-NEP175654.7+652930.2.fits', 'cutout-IMG-HSC-I-18114-1,1-OBJ-NEP175458.4+653419.1.fits',以此类推,以便以后运行。

如您所见,它一定没有在我的一张图像中找到任何对象(这很好),但是每次运行它都会以某种方式在其他每张图像中找到一个新对象(实际上,每次我运行此对象时)在这个小子集上的代码,我看到保存了两个新的抠图图像,对象名称不同。我很沮丧,因为就像我说的那样,每次运行的每个图像中搜索的对象和坐标都相同。任何见解或猜测将不胜感激!

import astropy
from astropy.nddata.utils import Cutout2D, NoOverlapError
import numpy as np
import matplotlib.pyplot as plt
from astropy import units as u
from astropy.io import fits
from astropy.wcs import WCS
from astropy.coordinates import SkyCoord, Angle
import re
import glob

def make_cutouts(img_file, box_len):
    # Image data
    hdulist = fits.open(img_file)
    img_data = fits.getdata(img_file)
    img_name = re.search(r'calexp\-(.+)\.fits', img_file)[1]

    # Make cutouts (by locating coords in image with WCS)
    wcs = WCS(hdulist[1].header)
    for i in range(len(objs)):
        # Skip if cutout already exists
        if 'cutout-IMG-'+img_name+'-OBJ-'+objs[i]+'.fits' in glob.glob('cutout*.fits'):
            print('Cutout of object already exists for this image, skipping...')
            continue

        # Convert ra, dec to HMS for specific object
        ra_h = re.search(r'h=(\d+.?\d*)', str(ras_hms[i]))[1]
        ra_m = re.search(r'm=(\d+.?\d*)', str(ras_hms[i]))[1]
        ra_s = re.search(r's=(\d+.?\d*)', str(ras_hms[i]))[1]
        ra_angle = Angle((float(ra_h), float(ra_m), float(ra_s)), unit='hourangle')
        dec_angle = decs_deg[i]

        # Coordinate transformation to pixels
        center = SkyCoord(ra_angle, dec_angle, frame='fk5')
        xp, yp = astropy.wcs.utils.skycoord_to_pixel(center, wcs=wcs, origin=1)

        # Make cutout, skip when object is not in image
        size = u.Quantity((box_len,box_len),u.arcsec)
        try:
            co = Cutout2D(img_data,(xp, yp),size,wcs=wcs)
        except NoOverlapError:
            continue
        hdu = fits.PrimaryHDU(data=co.data,header=co.wcs.to_header())
        hdu.writeto('cutout-IMG-'+img_name+'-OBJ-'+objs[i]+'.fits', overwrite=True)
        return 


# Gather all original images

all_images = glob.glob('/Users/myuser/Desktop/Original_Images/calexp*.fits')
coords_file = 'good_dataset.fits'

# Coordinates

hdul = fits.open(coords_file)
coords_data = hdul[1].data
objs = coords_data['Name']
ras = np.array(coords_data['RA']) # in decimal degrees
decs = np.array(coords_data['DEC']) # in decimal degrees
# Convert coordinate systems using astropy
decs_deg = Angle(decs, unit=u.deg)
ras_deg = Angle(ras, unit=u.deg)
ras_hms = [ra.hms for ra in ras_deg]

count=0
for image in all_images:
    make_cutouts(image, 10.0)
    count+=1
    print('Image %d out of %d completed' % (count, len(all_images)))

这是我刚才的一次运行的打印语句输出的示例,该语句再次生成了两个新的剪切图像(不同的对象,相同的两个图像)...这里的图像2是从未找到任何对象的图像。同样,有趣的是,每次运行的每个图像的“已经存在,正在跳过”语句的数量增加了两个。

Cutout of object already exists for this image, skipping...
Cutout of object already exists for this image, skipping...
Cutout of object already exists for this image, skipping...
Cutout of object already exists for this image, skipping...
Image 1 out of 3 completed
Image 2 out of 3 completed
Cutout of object already exists for this image, skipping...
Cutout of object already exists for this image, skipping...
Cutout of object already exists for this image, skipping...
Cutout of object already exists for this image, skipping...
Image 3 out of 3 completed

1 个答案:

答案 0 :(得分:3)

这是一个简单的错误:return循环的末尾有一个for语句,这意味着make_cutouts的每次运行最多只能产生一个切口。每次运行它时,它都会生成第一个剪切块,然后下一次,它将看到一个剪切块存在,使用continue语句跳过它,然后获取下一个剪切块,然后退出。删除return语句,代码可能会正常工作。

但是,您正在尝试避免以下几件事:

(1)您正在函数中使用全局变量。您最好将objsras_hms作为函数的参数传递,而不要依赖全局状态来访问它们。

(2)当您可以循环遍历对象本身时,即for thisobj, thisra in zip(objs, ras_hms):

(3)较小,但是if 'cutout-IMG-'+img_name+'-OBJ-'+objs[i]+'.fits' in glob.glob('cutout*.fits'):的效率比if os.path.exists(if 'cutout-IMG-'+img_name+'-OBJ-'+objs[i]+'.fits' in glob.glob('cutout*.fits'):高。如果您使用'cutout-IMG-{img_name}-OBJ-{obj_id}.fits'.format(img_name=img_name, obj_id=objs[i])作为字符串,您可能还会发现它更易读