Преобразование изображения RGB в фиты (астропия)

Я пытаюсь сохранить массив NumPy RGB (трехмерный массив размером 512x512x3) в файл .fits, используя astropy.io. Сохранение этого массива в файле .png работает нормально, но когда я пытаюсь сохранить его в файле .fits с помощью HDUList.writeto, он создает просто мусорные цвета. Кроме того, мне нужно изменить форму изображения следующим образом:

img = img.reshape(img.shape[2], img.shape[0], img.shape[1])

или он попытается сохранить только 3 столбца изображения вместо 512.

Каждый элемент массива 3d содержит значение от 0 до 255.

Что означает «он производит только мусорные цвета»? Файлы FITS не предназначены для хранения «цветов» RGB.

Ответы (1)

Раньше я не занимался обработкой астрономических изображений, но, поскольку на этот вопрос нет ответа, я попробую - надеюсь, что это принесет пользу. Если проблема более специфична, пример кода/образец изображения, вероятно, будет полезен для дальнейшей диагностики, но в остальном этот пример может помочь. В нем обсуждается процесс записи 3-канального изображения в отдельные изображения FITS. Я бы сначала попробовал это и проверил, не является ли этот вывод мусором - это может быть просто проблема с тем, как вы используете функцию HDUList.writeto(). Соответствующий код вставлен ниже (с парой правок, так как в примере сначала используется класс Pillow Image):

Разделите три канала (RGB):

r, g, b = img[:, :, 0], img[:, :, 1], img[:, :, 2]

Запишите каналы как отдельные изображения FITS.

red = fits.PrimaryHDU(data=r)
red.writeto('red.fits')

green = fits.PrimaryHDU(data=g)
green.writeto('green.fits')

blue = fits.PrimaryHDU(data=b)
blue.writeto('blue.fits')

Также из любопытства - почему ваш «пустой массив RGB» хранит значения от 0 до 512? Стандартом для изображений обычно являются целые числа от 0 до 255 или числа с плавающей запятой от 0 до 1; но я предполагаю, что астрономия требует большей разрядности? В любом случае вы также должны убедиться, что dtype вашего массива numpy достаточно велик для желаемой битовой глубины — часто изображения хранятся с dtype="uint8", который находится в диапазоне от 0 до 255.

Здравствуйте, спасибо за ваш ответ. Я попытался разделить каналы r, g, b и сохранить файл .fits для каждого канала, как вы описали. Это работает, но наблюдаемые интенсивности явно сильно отличаются от файла .png. Это заставляет меня думать, что мне нужно выполнить какое-то преобразование значений перед их сохранением, чтобы получить хороший результат, но я действительно не знаю, что это такое. Кроме того, вы правы насчет диапазона 0-255, это была моя ошибка.
Я загрузил образец png с расширением .fits для каналов r,g,b здесь: ссылка
@ user3042966 С чем вы наблюдаете за интенсивностью? Астрономическое программное обеспечение, такое как ds9, может просто устанавливать цветовую шкалу на логарифмические, а не на линейные значения, создавая впечатление, что интенсивность отключена.