Scion Image のマクロを使ってみよう

戻る

1.マクロって何でしょう?何の役に立つのでしょうか??

 たとえば、数枚の画像の同じピクセル位置から同じサイズで画像を切り抜くことを考えてみて下さい。手作業でこれを行おうとすれば操作は次のようになります。

  @ 選択ツールでinfoのカーソル位置を確認しながら左クリック
  A そのままinfoでカーソル位置を確認しながらドラッグして慎重に指を離す
  B EditメニューのCopy Selectionで選択領域をメモリにコピー
  C FileメニューのNewからImageWindowを選んで高さと幅を入力し、新しい画像を作成
  D EditメニューのPasteで新しい画像にメモリ上の画像を貼りつける
  E @〜Dの操作を画像の枚数分繰り返す

 どうですか?結構大変な作業であることが分かると思います。実はこのような単純で繰り返しの多い作業はマクロを使うと簡単で早く、しかも正確に行うことが出来るのです。
 次のマクロを見てみて下さい。Scion Imageのプログラムがインストールされているフォルダの中にあるMacrosというフォルダーのなかにあるFiltersというマクロの冒頭の部分です。

――――――――――――<マクロの始まり>――――――――――――――

macro 'Unsharp Mask';
var
I, pid1, pid2: integer;
begin
pid1 := PidNumber;


Duplicate(concat(WindowTitle, ' (Unsharp Mask)'));
pid2 := PidNumber;

for i := 1 to 8 do
 filter('smooth more'); 

ImageMath('subract', pid1, pid2, 1, 0, pid2);
end;
 ←この部分がマクロのタイトルになります(Fig.2参照)
 ←マクロで使用する、変数を宣言する印。
 ←3つの変数を整数として宣言しています。
 ←マクロ文を開始する宣言
 ←変数pid1にPidNumber(現在アクティブになっている画像に割り振られている番号)で指定されている画像の番号を代入しています。(原画像)
この画像の複製を“Unsharp Mask”というタイトルで作成しています。{実はこの記述は誤りでエラーで止まります}

←変数pid2に複製された画像のPidNumberを代入しています(このときは複製された画像がアクティブになっている)
←iに1を代入し8になるまで下の行の命令を繰り返します
“smooth more”という比較的強い平滑化フィルター処理をアクティブな画像(複製された画像)に対して8回繰り返している。(処理画像)
←画像間演算を行う命令です。原画像から処理画像を引き算しています。
←マクロ文を終了する宣言

―――――――――――――<マクロの終わり>―――――――――――――

 このようにテキストエディターなど(メモ帳でよい)で記述して“ファイル名.txt”として保存すればマクロは出来上がりです。
 これをSpecialメニューのLoad Macros...で読み込んで使用します。

Fig.1 マクロが読み込まれていない状態のSpecialメニュー

 Scion Imageのマクロ言語はPascal(Delphi)によく似ています。したがってプログラムの経験がない人は、Pascal言語の入門書などを読まれることをおすすめします。

Fig.2 標準添付の“Filters”というマクロを読み込んだところ

 Load Macros...以下にマクロ名が表示されているのが分かると思います。

――――――――――――<マクロの続き>――――――――――――――
 
macro 'Make Bas-relief'
begin
Duplicate('Bas-relief');
SelectAll;
Smooth;
Copy;
MoveRoi(-1,-1); {Try MoveRoi(1,1) for a different effect.}
Paste;
Subtract;
EnhanceContrast;
ApplyLUT;
end;

macro 'Normalize to 0 to 255';
{
Similar to enhance contrast but alters the pixel data instead of generating
a LUT function. Can be used to normalize multiple images to the same
brightness scale when creating a poster.
}
var
min,max,count:integer;
begin
ResetCounter;
Measure;
count:=rCount;
min :=rMin[count];
max:=rMax[count];
KillROI;
SelectAll;
AddConstant(-min);
Max:=Max-min;
MultiplyByConstant(255/max);
ShowMessage('Results are best if a ROI is drawn before the macro is executed');
end;

―――――――――――――<マクロの終わり>―――――――――――――

2.マクロ言語の基本的なルール

Key Words(予約語のようなものマクロ文の中では特別な意味を持つ)

MACRO FUNCTION PROCEDURE BEGIN END VAR FOR TO DO
IF THEN ELSE WHILE REPEAT UNTIL

Operators(演算子)

+ - * / DIV MOD :=        ←算術演算子
= < > <> <= >= AND OR NOT  ←論理演算子

Types(変数の型 : 整数型、実数型、論理型、文字列型の4種類)

INTEGER REAL BOOLEAN STRING

 整数と実数は、内部では拡張精度実数(Extended)の形式で蓄えられ、1.9×10-4 9 5 1から 1.1×104 9 3 2 までの範囲を持ち、 19-20 桁の精度を持っています。実数は、必要な際は四捨五入を用いて警告なしに自動的に整数に変えられます。文字列は最大 255 文字で、文字列の比較は大文字、小文字を区別しません。
変数名は、 12 文字の範囲内でなければなりません。

@ 文の最後には必ず“;”を付けます。しかし“begin”には付いてないと思うかもしれませんが、“begin・・・・・・end;”でひとつの文と考えれば分かりますね。次の文も同様に“do”の後ろに“;”がありませんが、“filter()”まで含めてひとつの文と考えます。
  for i := 1 to 8 do
   filter('smooth more');
A 算術演算“Max:=Max-min;”や代入“count:=rCount;”では“=”ではなく “:=”を使用します。
B 使用する変数は型も含めて必ず宣言する。
var
  I, pid1, pid2: integer;
C “{” と “}”で囲った部分はコメントで自由に書いて良い。
D 使用できる関数とそのパラメータはツールバーのメニューからたどれるものがほとんどであるから、どのような作用の関数か、あらかじめ試してみることができる。

 3.マクロを書いてみましょう。

 最初の“Unsharp Mask”というマクロを訂正して、正しくアンシャープマスクができるようにしてみましょう。まず問題なのが“Duplicate”の記述の誤りです。マニュアルを見ると(p71)次のように書いてあります。

Duplicate('Window Title')
指定された名前の新しいウインドウを作り、そのウインドウに現在の選択範囲の内容をコピーします。

マクロの方は
Duplicate(concat(WindowTitle, ' (Unsharp Mask)'));

これをマニュアル通りに直せばよいので次のようになります。
Duplicate('Unsharp Mask');

これを保存して再度マクロを読み込んで実行させてみて下さい。次のような結果が得られたはずです。

Fig.3 マクロ:“Unsharp Mask”の実行結果

 なんか変な結果ですよね。エラーは出なくなったけれどもこの結果には納得がいきません。問題はボケマスクの式にあります。

                 A’=A+k(A−B)・・・・・・(1)
                  A’:処理画像
                  A :原画像
                  B :ボケ画像
                  k :強調係数

 マクロの中で計算が出てくるのは次の部分です。

ImageMath('subract', pid1, pid2, 1, 0, pid2);

 この計算では(1)式の括弧の中だけしか計算していません。pid1は原画像です。pid2はボケ画像です。すなわち原画像からボケ画像を引いて結果をpid2に出力しただけです。だから変な結果になったのです。それではどのような文が必要か検討してみましょう。ImageMathのマニュアルにある説明文を見ながら考えてみましょう。

ImageMath('op',pic1,pic2,scale,offset,result)
'op' は、以下のうちのいずれかです:'add', 'sub', 'mul', 'div', 'and', 'or', 'xor', 'min', 'max' ,'copy'。 'real' というキーワードを加える(例:'add real')と、32 ビット実数の結果が返ってきます。Pic1 , Pic2 pic number もしくは pid number です。ImageMath は指定した演算を行い、結果は scale を掛けられ、offset が足され、もし real が指定されていないときは、最後の結果は 8 ビットで切られます。計算操作は各画像の左上の端から、一番小さいウインドウの大きさに合わせて行われます。Result には文字列か pid number を入れます。文字列の場合、その文字列の名前のウインドウが作られて結果が入ります。 pid number の場合、結果の画像は pid number で指定される画像の中に入ります。

現在pid2は (A - B ) になっていますので A’=pid1+k×pid2の計算ができればよいので、たとえばk=1とすると追加する文は次のようになります。

ImageMath('add', pid1, pid2, 1, 0, pid2);

早速この文を追加してマクロを実行してみましょう。マクロを上書きで保存して、“Special”メニューで再度マクロを読み込みます。

Fig.4 マクロを書き直して実行し直した結果

 出力結果“Unsharp Mask”は高周波成分が強調されて、少し引き締まったように見えるのではないでしょうか。いかがですか?

 このようにマクロは正しく記述して利用すれば一連の処理を自動化することが可能です。また同じ処理であれば何度でも再現性良く実行させることが出来ます。このようなマクロを自分で1から書くことは大変なので、Scion Imageのフォルダの中にある“Macros”フォルダの中には、いろいろなマクロが入っています。まずはこのようなマクロを改造して利用することから始め、慣れてきたら自分のほしいマクロを書けばよいと思います。このようなマクロを集めたwebサイトもありますが、多くはNIH Image用のものが多く、Scion Imageでは動作しないものもあるようです。

4.参考文献

  1. NIH Image (Version 1.61)日本語マニュアル
  2. 小島清嗣、岡本洋一、医学・生物学研究のための画像解析テキスト 実践講座羊土社、1997、¥5,900−
  3. (株)アンク、Delphi Object Pascal リファレンスブック、技術評論社、1999、¥2,480+税

Top