Почему мой код находит больше объектов из того же списка в тех же изображениях после каждого запуска? - PullRequest
0 голосов
/ 14 января 2019

Я написал код, который просматривает уже существующую папку изображений и использует постоянный список имен объектов и их соответствующих положений ra, dec в небе, чтобы найти их в каждом исходном изображении и сделать вырез 10x10 arcsec ( если объект находится на изображении). Это работает, и я получаю несколько хороших вырезов, но по какой-то странной причине, каждый раз, когда я запускаю его, сохраняются новые изображения вырезов! Я действительно не знаю, почему это происходит, поскольку список объектов и их ra, dec положения всегда одинаковы, и я всегда сохраняю вырезанные изображения с точным названием изображения и объекта, которые не должны изменяться. Все исходные изображения также остаются неизменными.

Я провел много тестов и все еще в тупике - своими тестами я подтвердил, что список объектов (objs) остается идентичным при каждом запуске, и я пришел к тому же выводу для списка исходных изображений (all_images) и позиции ra, dec (списки ras_hms и decs_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 голосов
/ 14 января 2019

Это простая ошибка: у вас есть оператор return в конце цикла for, что означает, что каждый запуск make_cutouts ограничен производством не более одного выреза. Каждый раз, когда вы запускаете его, он производит первый вырез, затем в следующий раз он видит, что он существует, пропускает его с помощью оператора continue, затем получает следующий, а затем завершает работу. Удалите оператор return, и код, вероятно, будет работать нормально.

Однако есть несколько вещей, которые вы должны избегать:

(1) Вы используете глобальные переменные в своей функции. Было бы лучше передать objs и ras_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]) в качестве строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...