Conversión de una imagen RGB a ajustes (astronomía)

Estoy tratando de guardar una matriz NumPy RGB (una matriz 3d con una dimensión de 512x512x3), en un archivo .fits usando astropy.io. Guardar esta matriz en un archivo .png funciona bien, pero cuando trato de guardarla en un archivo .fits usando HDUList.writeto, solo produce colores basura. Además, tengo que remodelar la imagen así:

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

o intentará almacenar solo 3 columnas de la imagen en lugar de 512.

Cada elemento de la matriz 3d contiene un valor entre 0 y 255.

¿Qué significa "produce solo colores basura"? Los archivos FITS no están destinados a almacenar "colores" RGB.

Respuestas (1)

No he hecho mucho procesamiento de imágenes astronómicas antes, pero como esta pregunta no tiene respuesta, lo intentaré, con suerte, para algo. Si el problema es más específico, una muestra de código/una muestra de imagen probablemente sería útil para un diagnóstico posterior, pero de lo contrario, este ejemplo puede ayudar. Describe el proceso de escritura de una imagen de 3 canales para separar imágenes FITS. Intentaría esto primero y verificaría si esta salida también es basura; podría ser un problema con la forma en que está usando la función HDUList.writeto(). El código relevante se pega a continuación (con un par de ediciones, ya que el ejemplo usa la clase Imagen de almohada al principio):

Divida los tres canales (RGB):

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

Escriba los canales como imágenes FITS separadas

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')

También por curiosidad: ¿por qué su "matriz RGB numpy" almacena valores entre 0 y 512? El estándar para las imágenes suele ser números enteros entre 0 y 255 o flotantes entre 0 y 1; pero supongo que la astronomía requiere una mayor profundidad de bits. En cualquier caso, también debe asegurarse de que el dtype de su matriz numpy sea lo suficientemente grande para la profundidad de bits deseada; a menudo, las imágenes se almacenan con dtype="uint8", que va de 0 a 255.

Hola, Gracias por tu respuesta. Intenté dividir los canales r, g, b y guardar un archivo .fits para cada canal como describiste. Funciona, pero las intensidades observadas son claramente muy diferentes a las del archivo .png. Me hace pensar que necesito hacer algún tipo de transformación en los valores antes de almacenarlos para dar un buen resultado, pero realmente no sé qué es eso. Además, tienes razón sobre el rango de 0-255, ese fue mi error.
Subí un png de muestra con un archivo .fits para los canales r,g,b aquí: enlace
@ user3042966 ¿Con qué estás observando las intensidades? Es posible que el software astronómico como ds9 simplemente esté configurando la escala de colores para registrar en lugar de valores lineales, dando la impresión de que las intensidades están apagadas.