どせいたんさき。

ナスダヨー

3 次元 FITS 画像をとりあえず動画にしてみる

目的

3 次元 FITS 画像を NAXIS3 の方向に動画データとして出力してみる.いちいち中間ファイルを出力して結合するのは面倒なので python でさくっと適当に変換できるスクリプトを作成したい.

方法

ここにかかれている内容を参考にした.いくつかのパラメタ変数については何を設定しているのかよくわかっていないがとりあえず動画はできた.

#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import (print_function, absolute_import)

import matplotlib.animation as anim
import matplotlib.pyplot as plt
import numpy as np
import pyfits as fits

from argparse import ArgumentParser as ap

if __name__ == '__main__':
    parser = ap('Convert 3D FITS into a movie file.')
    parser.add_argument(
        'fits', type=str, help='source a FITS image.')
    parser.add_argument(
        'avi', type=str, help='converted a movie file.')
    parser.add_argument(
        '-l','--limits', dest='limits', nargs=2, type=float,
        default=[0.,1000.], help='(lower, upper) limits of colormap.')
    parser.add_argument(
        '-f','--fps', dest='fps', type=float, default=24,
        help='frame rate of the movie')
    parser.add_argument(
        '-r', '--dpi', dest='dpi', type=float, default=200.,
        help='resolution of the movie')

    args = parser.parse_args()

    hdu = fits.open(args.fits)
    img = hdu[0].data
    if len(img.shape)==4: img = img[0]
    nz = img.shape[0]
    sz = img[0].shape

    fig = plt.figure()
    fig.set_size_inches([sz[1]/args.dpi, sz[0]/args.dpi])

    ax = plt.Axes(fig,[0.,0.,1.,1.])
    ax.set_axis_off()
    fig.add_axes(ax)

    im = ax.imshow(np.zeros_like(img[0]),
                   cmap='gray', interpolation='nearest')
    im.set_clim([0,1])

    clim = args.limits
    def update_img(n):
        im.set_data(np.clip((img[n]-clim[0])/(clim[1]-clim[0]),0,1))
        return im

    avi = anim.FuncAnimation(fig, update_img, nz, interval=int(args.fps))
    writer = anim.writers['avconv'](fps=args.fps,codec='h264')

    avi.save(args.avi, writer=writer, dpi=int(args.dpi))

参考資料