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