※ getPictPoints関数
[2006/06/17]
 画像の指定した位置の座標を返す

画像中の任意の位置をマウスで指定し、その位置座標を得る。本関数は ver 1.7.8β8から使用可能。

【書式】

getPictPoints(pict#);
getPictPoints(pict#,pos);
getPictPoints(pict#,title$);
getPictPoints(pict#,pos,title$);

【引数】

pict# 位置座標を求めたい画像
pos 位置座標(m行2列)
title$ ウインドウのタイトル文字列

【戻値】

m行2列の指定した点の位置座標
第一列 X座標
第二列 Y座標

【備考】

 位置座標は画像の左上のピクセルが (1,1) であり、右に向かってX座標値は1ピクセル毎に増加し、下に向かってY座標値は1ピクセル毎に増加する座標系である。

【例 】

 乱数データを使い画像を作り、その中の領域を取り出してみる。これは SPECT, PET の ROI 分析で多用する。

a = rand(10,10);
m = 300; n = 400;
b = hokan(a,m,n);
c# = densityPlot(b,|1,0|);
c#;

この画像を使い領域を指定してみる。

c = getPictPoints(c#);

 領域指定なので [Draw Line] にチェックを入れ、[Closed Line] にチェックを入れて閉じた曲線となるようにします。ポイントは指定した位置にマウスカーソルを移動し、ダブルクリックでポイントが追加されます。ポイント が選択された状態になると赤のマークになります。このときマウスボタンを押して移動(drag)することができます。また [Delete Point] ボタンをクリックすると、その点を削除することができます。

 ポイントを作った順番が結果の行の並びになります。ポイントとポイントを結ぶ直線上の点をクリックするとその位置に新しい点が挿入されます。データの並びもポイントとポイントの間に挿入されます。

それでは得られたデータの確認をしてみます。

parametricPlot(c[#,1],m-c[#,2]);

 これが得られた位置座標の散布図です。Y軸方向が散布図のグラフと異なるので m-c[#,2] として上下反転させ作図している点に注意して下さい。

 それでは次に region 関数を使って得られた閉曲線が示す領域を表示させてみましょう。

d = region(c,|m,n|);
densityPlot(d,|1,0|);

これが region関数で得られたデータです。閉曲線の中に相当する行列の要素が1で閉曲線の外が0の行列データです。これだと確認できないので元データに重ねてみましょう。

densityPlot(b•d,|1,0|)•c#;

.OK.

 指定した通りの領域が得られています。

 

● おまけ

 人の操作で奇麗(正確)に領域を指定するのは困難です。そこでちょっとした操作をし奇麗な領域にしてみます。これには spline関数を使い尤もらしい値を追加する処理です。

t = hokan(|0,1|',msize(c),1);
tt = hokan(t,msize(c)*10,1);
cc= spline(t,c,tt);
d = region(cc,|m,n|);
densityPlot(b•d,|1,0|)•c#;

 この spline 関数を使えば指定するポイント数を少なくしても滑らかな領域を指定することが出来ます。
これと同じ操作を B-Spline スライダを動かすとできます。