どせいたんさき。

ナスダヨー

IDL コマンドメモ

IDL のコマンドで最近使ったものをメモ.

readcol - ファイルからデータを読み込む

カラム形式のデータをロードできる.デフォルトのデリミタはカンマとスペース.

readcol, './data.dat', var1, var2, var3, ...

forprint - ファイルにデータを書き込む

デフォルトは画面出力.オプションを設定することでファイルに流し込める.

forprint, var1, var2, var3, ..., TEXTOUT='./output.dat'

mrdfits - fits ファイルを読む

画像だろうがテーブルだろうが読めるらしい.便利.

data = mrdfits('./input.fits', N, hdr)
; data に読み込んだデータ(画像とか)が入る
; N で何番目の構造を読むか指定できる
; hdr にヘッダーの情報が文字列で保存される

mwrfits - fits ファイルに書きだす

mrdfits の逆.引数の順番に注意. hdr は省略しても良い.

mwrfits, data, './output.fits', hdr

fxpar - ヘッダーファイルを読む

mrdfits などで読み込んだヘッダー構造体から情報を抜き出す. sxpar というのもあるらしい.

output = fxpar(hdr, 'KEYWORD')

fxaddpar - ヘッダー情報を書き換える

ヘッダーに情報を足せる.すでにキーワードが登録されている場合は書き換える. sxaddpar というのもあるらしい.

fxaddpar, hdr, 'KEYWORD', value

euler - 座標を変換する

celestial, galactic, cataleptic で座標変換できる.

euler, in_A, in_B, out_A, out_B, SELECT
; SELECT には座標変換の方式が入る
;      SELECT   From          To        |   SELECT      From            To
;       1     RA-Dec (2000)  Galactic   |     4       Ecliptic      RA-Dec    
;       2     Galactic       RA-DEC     |     5       Ecliptic      Galactic  
;       3     RA-Dec         Ecliptic   |     6       Galactic      Ecliptic  

extast - アストロメトリ情報を抜き出す

extract astrometry information. ヘッダーからアストロメトリに関する内容だけ構造体にして抜き出す.抜き出された構造体は他のプロシージャに渡すことで座標変換に使える.

extast, hdr, astr

xy2ad, ad2xy - ピクセル・座標変換

アストロメトリの情報を利用して画像のピクセル位置と天球面上での座標を相互に変換できる.

;; 画像をロード & アストロメトリ情報を抜き出す
img = mrdfits('./image.fits',hdr)
extast, hdr, astr
;; ヘッダーから x,y それぞれのピクセル数を取得
nx = fxpar(hdr, 'NAXIS1')
ny = fxpar(hdr, 'NAXIS2')
;; 全ピクセルをマップするためのベクトルを作成
xi = repmat(lindgen(nx), ny, 1)
yi = floor(lindgen(nx*ny)/nx)
;; 各ピクセルに対応する座標を計算,ベクトルに収める
xy2ad, xi, yi, astr, ra, dec

expand - アレイ(画像)を任意の大きさに拡大

ちなみに補間方式は bilinear に固定.

expand, array_in, nx, ny, array_out
;; nx, ny はそれぞれ変換後のピクセル数(倍率ではない)

おまけ - nearest method で画像変換

例えば座標変換して画像を回転したりしたい場合. idl のような言語では for loop を二重に回したりするととんでもなく時間がかかるので出来れば避けたい.とりあえず最も単純な nearest method なら loop を回さずに記述できる(内部的にどうなっているのかは知らない).

;; 変換前の画像を orig 変換後の画像を out とする.
;; 変換後の画像で [xi,yi] に位置するピクセルが変換前の画像の [xj,yj] に対応するとする.

;; サイズ [nx,ny] の float array を作成
out = fltarr(nx,ny)
;; 全ピクセルをマッピングできるように位置ベクトルを作成
xi = repmat(lindgen(nx),ny,1)
yi = floor(lindgen(nx*ny)/nx)

;; 何らかの変換によって [xj,yj] を求める(たとえば座標系の変換など)
;; このときに "出力先の各ピクセルに対応する" 変換前のピクセル位置を求める
;; これを逆にして変換前のピクセルが変換後どこに行くかをやってしまうと
;; 変換によっては出力画像に穴が開いてしまったりする
hoge_conversion, xi, yi, xj, yj

;; 変換後の画像の各ピクセルに変換前のピクセルをマッピングする(この一行だけでできる)
;; この方針で行けば多項式で補間程度なら for loop なしでできそう?
out[xi,yi] = orig[xj,yj]