Создание нового файла изображения в астропии с указанными размерами другого файла изображения

У меня проблема с манипуляциями с файлами в пакете astropy, и мне нужна помощь.

По сути, я хочу взять изображение, которое у меня есть в формате файла fits, и создать новый файл, в котором мне нужно начать вводить коэффициенты коррекции, и новое изображение, которое затем можно использовать с коэффициентами коррекции и исходным изображением для создания изображения коррекции. Каждый из них будет иметь одинаковые размеры.

Начиная с этого:

from astropy.io import fits

# Compute the size of the images (you can also do this manually rather than calling these keywords from the header):
#URL: /Users/UCL_Astronomy/Documents/UCL/PHASG199/M33_UVOT_sum/UVOTIMSUM/M33_sum_epoch1_um2_norm.img
nxpix_um2_ext1 = fits.open('...')[1]['NAXIS1']
nypix_um2_ext1 = fits.open('...')[1]['NAXIS2']
#nxpix_um2_ext1 = 4071 #hima_sk_um2[1].header['NAXIS1'] # IDL: nxpix_uw1_ext1 = sxpar(hima_sk_uw1_ext1,'NAXIS1')
#nypix_um2_ext1 = 4321 #hima_sk_um2[1].header['NAXIS2'] # IDL: nypix_uw1_ext1 = sxpar(hima_sk_uw1_ext1,'NAXIS2')

# Make a new image file with the same dimensions (and headers, etc) to save the correction factors:
coicorr_um2_ext1 = ??[nxpix_um2_ext1,nypix_um2_ext1]

# Make a new image file with the same dimensions (and headers, etc) to save the corrected image:
ima_sk_coicorr_um2_ext1 = ??[nxpix_um2_ext1,nypix_um2_ext1]

Может ли кто-нибудь дать мне очевидные знания, которых мне не хватает, чтобы сделать это ... последние две строки предназначены только для того, чтобы обрисовать то, что мне не хватает. Я включил ?? чтобы, возможно, сигнализировать, что мне нужно что-то еще, возможно, fits.writeto () или что-то подобное ...


person Community    schedule 14.02.2016    source источник


Ответы (2)


Я думаю, что ответ @VincePs правильный, но я добавлю дополнительную информацию, потому что я думаю, что вы не используете здесь возможности astropy.

Во-первых, Python начинается с нуля, поэтому основное расширение имеет номер 0. Может быть, вы ошиблись, а может, и нет - но получить доступ ко второму HDU редко, поэтому я подумал, что лучше упомянуть об этом.

hdu_num = 0 # Or use = 1 if you really want the second hdu.

Во-первых, вам не нужно открывать один и тот же файл дважды, вы можете открыть его один раз и закрыть после извлечения соответствующих значений:

with fits.open('...') as hdus:
    nxpix_um2_ext1 = hdus[hdu_num]['NAXIS1']
    nxpix_um2_ext1 = hdus[hdu_num]['NAXIS2']
# Continue without indentation and the file will be closed again.

или если вы хотите сохранить весь заголовок (для его сохранения позже) и данные, которые вы можете использовать:

with fits.open('...') as hdus:
    hdr = hdus[hdu_num].header
    data = hdus[hdu_num].data # I'll also take the data for comparison.

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

new_data = np.zeros((hdr['NAXIS2'], hdr['NAXIS1']))

Обратите внимание, что Python интерпретирует ось иначе, чем IRAF (и я думаю, что IDL, но я не уверен), поэтому вам понадобится axis2 как первый и axis1 как второй элемент.

Так что быстро проверьте, совпадают ли формы:

print(new_data.shape)
print(data.shape)

Если они не равны, я запутался в оси в Python (снова), но я так не думаю. Но вместо создания нового массива на основе значений header вы также можете создать новый массив, просто используя старую форму:

new_data_2 = np.zeros(data.shape)

Это обеспечит идентичность размеров и формы. Теперь у вас есть пустое изображение. Если вам нравится копия, вы можете, но не обязаны, явно копировать данные (кроме случаев, когда вы открывали файл явно в режиме записи / добавления / обновления, вы всегда должны копировать его, но это не по умолчанию).

new_data = data # or = data.copy() for explicitly copying.

Выполните свои операции с ним, и если вы хотите сохранить его снова, вы можете использовать то, что предложил @VinceP:

hdu = fits.PrimaryHDU(new_data, header=hdr) # This ensures the same header is written to the new file
hdulist = fits.HDUList([hdu])
hdulist.writeto('new.fits')

Обратите внимание, что вам не нужно изменять ключевые слова заголовка, связанные с формой, даже если вы изменили форму данных, потому что во время writeto астропия обновит их (по умолчанию)

person MSeifert    schedule 15.02.2016
comment
Я согласен со вторым советом @MSeifer об использовании data.shape вместо заголовков NAXIS в файле FITS. Это детали реализации FITS, о которых, естественно, ни один пользователь не должен думать (на практике это не всегда возможно или наиболее эффективный способ, потому что FITS - это неуклюжий формат, а pyfits также имеет некоторые неуклюжие детали реализации). Но в целом не ищите в заголовке FITS ничего, кроме метаданных. - person Iguananaut; 15.02.2016
comment
@MSeifert, спасибо за более глубокое разъяснение некоторых аспектов. Я согласен со всеми ними. Вы совершенно правы насчет того, что X1, X2 меняются местами на python по отношению к iraf. Иногда это может сбивать с толку. - person VinceP; 15.02.2016
comment
@MSeifert Привет, Майкл. Это работает, как объяснено. Однако становится немного сложно с тем, что я хочу с этим делать после. Не могли бы мы как-нибудь поделиться подробностями, и я мог бы заручиться вашей помощью (с небольшим финансовым вознаграждением, если вам интересно?) - person ; 15.02.2016
comment
@ user3125347 Я бы порекомендовал, если у вас есть какой-либо общий или конкретный вопрос, просто открыть другой вопрос здесь, в StackOverflow или в списке рассылки Astropy (если он становится более подробным, список рассылки был бы лучшим местом). Я не уверен, смогу ли я ответить или объяснить, как вы можете обработать свое изображение (я не знаю подробностей), но я обязательно буду часто проверять StackOverflow, и если я знаю ответ, я дам его, а я нет нужно за это финансовое вознаграждение. - person MSeifert; 15.02.2016
comment
@MSeifert Замечательно. Что я сделаю, так это обновлю свой скрипт вашими предложениями, а затем повторно отправлю следующие шаги, в которых мне нужна помощь. Следите за этим. Я случайно отправил его в список рассылки Astropy, но пока ничего не возвращено. - person ; 15.02.2016
comment
Нет проблем, не забудьте принять мой ответ или ответ @VincePs, если какой-либо из этих ответов решит ваш вопрос. И я обязательно проверю здесь другие вопросы. - person MSeifert; 15.02.2016
comment
@MSeifert Я принял ваш, так как теперь он составляет большую часть моего нового скрипта. Я только что разместил здесь новый вопрос. Надеюсь, это не слишком долго. - person ; 15.02.2016

В документации астропии вы выполните эту задачу шаг за шагом: создайте массив с size (NAXIS1, NAXIS2), поместите данные в первичный HDU, создайте HDUlist и запишите его на диск:

import numpy as np
from astropy.io import fits

data = np.zeros((NAXIS2,NAXIS1))
hdu = fits.PrimaryHDU(data)
hdulist = fits.HDUList([hdu])

hdulist.writeto('new.fits')
person VinceP    schedule 14.02.2016
comment
Не могли бы вы отредактировать свой ответ, поменяв местами NAXIS1 и NAXIS2? Я думаю, что если кто-то еще наткнется на этот вопрос и прочитает ваш ответ, он должен предоставить правильный код. :-) - person MSeifert; 15.02.2016