将.fits数据转换为.png图像

 

本篇博客主要用于学习交流,用来记录自己学习过程中遇到的问题,所获得的感想,同时也为了方便以后的查找与回顾。另外也为了向各位前辈学习,纠正自己思维上的不足。文中可能会引用其他前辈的博客,文末会给出相应链接,侵删!

 

前言

由于目的需要,需处理空间天气图像数据,主要是空间天气数据,但目前空间天气图像数据的取得并不顺利,找到的是.fits文件,通过参考网上的一些方法,将.fits转换为.png图像,从而得到所需数据。

自己所获得的.fits数据,是从JSOChttp://jsoc.stanford.edu/)上 下载的,下载过程使自己很是糟心!

在此,也向广大网友寻求帮助,如果您有做过关于太阳黑子、太阳耀斑、太阳日冕物质抛射的检测的实验或项目,请联系我,自己很是需要您的帮助!谢谢,文末会给出自己QQ,添加时,请备注 太阳黑子检测。

 

1、FITS基本文件格式

FITS (Flexible Image Transport System) 是国际天文学会(IAU)1982 年确定的世界各天文台之间用于数据传输、交换的统一标准格式。它描述了数据的定义和数据编码的一般方法。它是与机器无关的,用磁带作为标准传输介质的独立方法。它提供了图像的单值转换,精度包括符号在内可以达到 32 位。对一维、二维、三维、甚至多维的数据类型都提供了合适的转换。它不仅适用于天文数据, 对其他学科的数据也是可用的。 FITS 是天文学界常用的数据格式,专门为在不同平台之间交换数据而设计。1988年的国际天文学联合会(IAU)大会指定IAU的FITS工作组全权负责此格式的修订。IAU规定,今后对FITS标准的修改不得破坏前后一致性,也就是所谓的“once FITS, always FITS”一说。

 

FITS文件由文件头和数据组成。在文件头中存储有对该文件的描述,如观测时间、观测对象、拍照温度、曝光时间等信息,同时也可以在文件头中注明观测时的视场、精度等,便于后期数据分析之用。文件头部分每行占80个字符,并以END结尾。按南京大学郑兴武教授所编《现代天体物理实验指导》一书中的说法,文件头共有36行,若未满则以空格补之。较重要的几项有:BITPIX(指明图像位数)、NAXIS(指明图像维数)、NAXISn(代表第n维的像素数

  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
配准图像图像处理的一个重要问题,生成对抗网络(GAN)是近年来非常流行的图像生成模型,可以用于图像配准。下面是一个简单的用于.fits图像文件配准的GAN的Python实现: 首先,需要导入相关的Python库: ```python import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from astropy.io import fits from tensorflow.keras import layers ``` 然后,需要加载.fits文件,将其转换为numpy数组,并将其归一化到[-1, 1]之间: ```python def load_fits_file(file_path): hdul = fits.open(file_path) data = hdul[0].data.astype(np.float32) data /= np.max(np.abs(data)) return data ``` 接下来,需要定义生成器和判别器的架构: ```python def make_generator_model(): model = tf.keras.Sequential() model.add(layers.Dense(7 * 7 * 256, use_bias=False, input_shape=(100,))) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Reshape((7, 7, 256))) assert model.output_shape == (None, 7, 7, 256) model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False)) assert model.output_shape == (None, 7, 7, 128) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False)) assert model.output_shape == (None, 14, 14, 64) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh')) assert model.output_shape == (None, 28, 28, 1) return model def make_discriminator_model(): model = tf.keras.Sequential() model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape=[28, 28, 1])) model.add(layers.LeakyReLU()) model.add(layers.Dropout(0.3)) model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same')) model.add(layers.LeakyReLU()) model.add(layers.Dropout(0.3)) model.add(layers.Flatten()) model.add(layers.Dense(1)) return model ``` 然后,定义损失函数和优化器: ```python cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True) def discriminator_loss(real_output, fake_output): real_loss = cross_entropy(tf.ones_like(real_output), real_output) fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output) total_loss = real_loss + fake_loss return total_loss def generator_loss(fake_output): return cross_entropy(tf.ones_like(fake_output), fake_output) generator_optimizer = tf.keras.optimizers.Adam(1e-4) discriminator_optimizer = tf.keras.optimizers.Adam(1e-4) ``` 接下来,需要定义训练循环: ```python def train_step(images): noise = tf.random.normal([BATCH_SIZE, 100]) with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape: generated_images = generator(noise, training=True) real_output = discriminator(images, training=True) fake_output = discriminator(generated_images, training=True) gen_loss = generator_loss(fake_output) disc_loss = discriminator_loss(real_output, fake_output) gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables) gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables) generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables)) discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables)) ``` 最后,定义GAN模型并开始训练: ```python def train(dataset, epochs): for epoch in range(epochs): for image_batch in dataset: train_step(image_batch) if epoch % 100 == 0: generate_and_save_images(generator, epoch + 1, test_input) print('Epoch {} finished'.format(epoch + 1)) generate_and_save_images(generator, epochs, test_input) def generate_and_save_images(model, epoch, test_input): predictions = model(test_input, training=False) fig = plt.figure(figsize=(4, 4)) for i in range(predictions.shape[0]): plt.subplot(4, 4, i + 1) plt.imshow(predictions[i, :, :, 0] * 127.5 + 127.5, cmap='gray') plt.axis('off') plt.savefig('image_at_epoch_{:04d}.png'.format(epoch)) plt.show() BUFFER_SIZE = 60000 BATCH_SIZE = 256 EPOCHS = 300 train_images = load_fits_file('image.fits') train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE) generator = make_generator_model() discriminator = make_discriminator_model() train(train_dataset, EPOCHS) ``` 这个简单的GAN模型可以用于.fits图像文件配准,但是需要根据具体的需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值