1993.3.2 関口真木
Imcでモザイクのファイルが仮想的に読み込めるようになりました. これは個々のFlat-field・Sky-subtractされたファイルを,Mosaicingで得られた仮想空 間上のオフセット等のパラメータと一緒に読み込み,ユーザから見た場合に大きな一つの画像イメージとして見るような機能があります. これらの機能はユーザからは隠ぺいされており,ユーザのソフトウェアーは,従来からの単一ファイルに対するものから変更する必要はありません.
モザイクファイル読込み時は,通常のファイル名(comar_10など)を指定するかわりに,comar.mosなどの様に".mos"というextensionのついた名前のついたファイルを指定し ます. これは安田氏のmosaicingソフトによって得られた出力ファイルです. フォーマットは以下の通りです:
最初の{個別の...} の行は*.mosファイルの中身ではありません.
ファイル名はIRAFの画像ファイル名で,.imhや.pixを取った部分です.
絶対的なpathを指定してください.
X-offsetとY-offsetは,各画像の左下(ix=0,iy=0)の仮想空間における位置です.
これは実数で表示します.
仮想空間でどこがx=0,y=0になるかは結果に影響しません.
あくまで各画像ファイルの相対的な関係のみが問題となります.
実際,imcで読み込んだ後はすべての画素の中で最も小さいxとyが,x=0,y=0として扱われます.
Rotationはその画像Frameが左下を中心にして,仮想空間上でどれだけ回転しているかをradianで表します(実数表示).
Fluxは各画像が受けたphotonの数の相対的な比を実数で表します.
たとえば,10分露出のframeのfulxがだとすると,20分露出のframeのfluxは2.0になります.
(読み込ませる画像frameの大きさは,同じである必要はありません.)
現在もし,mosaicingの出力がこのフォーマットと違っている場合は,editするかmosaicingのソフトウェアーを修正してください.
もしあなたが今までのimcをつかったソフトウェアーを使いたければ,入力ファイルに*.
mosを指定すればそのまま動きます.
ただ注意する事が数点あります.
第一に画像の大きさは*.mosを読み込むまでわかりません.
仮想画像の大きさはXY-offsetとrotationに依存します.
もちろんimropen()を読んだ後では,imhp->npx,imhp->npyから仮想画像の大きさを知る
事ができますが,もしあなたのコードが入力画素の大きさを仮定している場合はうまくゆかないでしょう.
これにはあなたのコードを任意の大きさの画像に対応するように変更する必要があります.
第二に注意する事は,読み込まれるファイルは非常に大きなものとなる事です.
もしあなたのソフトウェアーがimrl_tor()を使って読み,一行一行を処理して行くときはまったく問題ありません.
しかし全体を一度に読み込んでいる場合は,メモリーが足りなくなるかも知れません.
たとえば画素全体を読み込む場合は64MBのメモリー(実メモリー+スワップエリア)が必要です.
この手法の限界はUnixのkernelの設定やハードの実装に依存します.
(ちなみに,imcでは今までのやり方で読むと,モザイクファイルに対して100行分
のバッファを確保して読み込みます.
これはユーザがimrl_tor()で一行一行読んでいる場合も同様です.
たとえばこれは
画素の場合でも,
MBにしか(?)なりません.
このバッファの大きさは後述する方法でユーザが調整できる.)
結論から言うと,大型のモザイクファイルを扱う場合は,imcの使い方は同じでも画像解析は何等かの方法で単一ファイルを解析する時とは変更する必要があると思われます.
仮想的なモザイク画像を生成するのあたって,現在3つの方法が選択できます. これはimropen()を呼び出す前に,(void)imc_mos_set_add(mode)を呼び出してモザイクのしかたを指定します.
#include <stdio.h> #include <memory.h> #include "imc.h" main() { static struct imh imhin, imhout; static struct icom icomin, icomout; char fnam[80]; FILE *fp, *fp2; float dp[16000]; long offset; long iy; /* Mosaicingのし方を指定する */ /* NODIST\_NOADD:後のファイル画素が前のファイル画素を上書きする */ /* NODIST\_ADD:すべての画素が加算される(もちろんnormalizeされる)*/ /* DIST\_ADD:1実画素が4仮想画素に分配され加算される */ (void) imc\_mos\_set\_add( /*DIST\_ADD*/ /*NODIST\_ADD*/ NODIST\_NOADD ) ; /* 入力ファイルを読み込む */ /* コード上では単一ファイルとモザイクファイルの区別はない */ (void) printf(" input IRAF file name = " ); (void) gets( fnam ); if( (fp = imropen ( fnam, &imhin, &icomin )) == NULL ) goto err; /* 画素サイズのチェック */ /* imhにはこの時点で仮想画素の大きさが書込まれている */ /* この点も単一ファイルと変わりない */ if( imh.npx > 16000 ) { (void) printf("Image size too large\n"); goto err: } /* 出力ファイルの指定 */ (void) printf(" output IRAF file name = " ); (void) gets( fnam ); /* 仮想画像をそのまま実ファイルとして出力するためimhのコピーを作る*/ (void) memcpy( (char *)(&imhout), (char *)(&imhin), sizeof(imhin) ); (void) memcpy( (char *)(&icomout), (char *)(&icomin), sizeof(icomin) ) ; (void) imaddcom( &icomout, "Test of imc Mos"); if( (fp2 = imwopen( fnam, &imhout, &icomout )) == NULL ) goto err; /* 一行ずつ読み込んで,書出す */ for( iy=0; iy<imhin.npy; iy++ ) { (void) imrl\_tor( &imhin, fp, dp, iy ); (void) imwl\_rto( &imhout, fp2, dp, iy ); } err: (void) fclose( fp ); (void) fclose( fp2 ); return(0); }
従来からの使い方だけではなく,モザイクファイルに最適化した使い方がある. これは全体の画像を読み込むのではなく,仮想画像の一部分を読み込むことである. さらにこの場合は従来のようにユーザが画像用のアレイを定義するのではなく,システ ム 側で画素データを入れるスペースを確保して,そこへのポインタをユーザに返す.(Fo rtran77では使用出来ない.) したがってユーザがデータを読み込む前にアレイの大きさを気にする必要もなくなり, メモリーの使用量は常に必要最小限である. 具体的には以下の例のようにimropen()してから,imc_mos_read()を呼ぶ.
#include "imc.h" main() { static struct imh imhin static struct icom icomin; char fnam[80]; FILE *fp; long bsize, nblock, iblock, ymin, ymax; float *dp0; /* データに対するポインタのみ定義する */ (void) imc\_mos\_set\_add( /*DIST\_ADD*/ /*NODIST\_ADD*/ NODIST\_NOADD ) ; (void) printf(" input IRAF file name = " ); (void) gets( fnam ); if( (fp = imropen ( fnam, &imhin, &icomin )) == NULL ) goto err; /* 画素サイズのチェックは不要*/ /* 400行ずつ読み込ませる */ bsize = 400; nblock= imhin.npy / bsize; for( iblock=0; iblock<nblock; iblock++ ) { ymin= iblock * bsize; ymax= (iblock+1) * bsize - 1; dp0 = imc\_mos\_read( (long)0, ihmin.npx-1, ymin, ymax ); /* * ここでimc\_mos\_read()のargumentsは読み込みたい仮想空間の * ウインドウを指定している.(long)0は最少の仮想x, * imhin.npx-1は最大の仮想x,yminとymaxはそれぞれ最少最大 * の仮想yである. */ if( dp0 == NULL ) continue; /* もしエラーだとNULLになる */ /* 画像解析する */ /* * たとえばこのブロックでiy行でix列のデータは * *( dp0 + iy * imhin.npx + ix ) となる. */ } /* end block loop */ err: (void) fclose( fp ); return(0); }
従来からのimcを使う場合は,注意点がある. (もっともこれが問題となる場合はほとんどないとおもうが.)imrl_tor()を使って 一行読みした場合でも,モザイクファイルは仮想空間の100行を一度に読んでくる. 従って,行番号を一つずつ増加させる場合は良いが,行番号を減らしてゆく場合やラン ダ ムな行番号にアクセスする場合は極めて遅くなってしまうので(最悪100倍)注意が 必 要である.
またプログラミングの都合上,実画像の最周辺部の画素は無視されているので,記憶に 留 めておいて欲しい.(これは現実的にも使わないほうが良い気がする.)
8個のファイル(各々画素)のモザイク読み込みに必要な時間(計
算
+I/O)
の時間を測定した.
画素の足算をするかどうかはあまり結果に影響しないが,1つの実画素を4つの仮想画 素 に分配するのはかなりCPUを使うことがわかる. 読込み速度については,今後改良の予知があるが,現在でもacceptableな速度であると 理 解している.
voidの/image/image1/mosaic/imcの中身,及び/image/image1/mosaic/bin.hp/libimc.a はすでに新しくなっている.c1では/home/c0/osekigu/imcにすべてはいっている.
今回は最初のreleaseなので,当然バグを含んでいると思われる.したがって,皆さん に たくさん使っていただいてバグを見つけてもらいたい.