番外編 DICOMとNAS その5
list_counter =
(int)this.Invoke(read_data);
// アフィン変換行列の設定
// 描画
// 再描画
}
スライス位置を表示して、スライス像を連続して再生する
1.本当の画像は、もっと大きいのです
CTのスライス画像を、連続して表示することにしました。
最初は、一括して画像データを読み込んでいたのですが、
何せ、400枚以上のスライス画像では、読み込みに3分位必要なので、あきらめました。
表示の度に、1枚ずつ読み込んでいますが、2〜3
frames per second
なので、大丈夫だと、思います。
スライス画像の連続表示には、新しいスレッドを立てて、メインスレッドとは、別のスレッドに委ねました。
左側の副画面は、スライス位置が解るように、表示しました。 まだ、未完成ですねん。
2.スライスの、z軸上の位置を知るには
ウシジマさんの、CTのSeriesは、3つあります。
最初の数字が、何枚のスライス画像かを、示しています。
一番最初の 1枚しかない インスタンスが、このスライス位置を表示するための画像です。
2,3番目のインスタンスが、そのスライス画像を示し、それぞれ 58枚、466枚の スライス画像を含んでいる事が、解ります。
で、1番目の画像のdcmファイルの内容を覗いてみると、
0020,0032 Image
Position(Patient)
-512.0\0.0\69.8
x軸の位置が -512.0、 y軸の位置が 0.0 z軸の位置が 69.8 (単位 mm)
この画像は、x-z平面を示しています。
で、
画面左上隅のコーナーの位置が x軸 -512.0 z軸 69.8mm です。
ですので、
z軸を ここから 69.8mm下げた位置が z軸(つまり、最初のスライス位置)になります。
一方
0028,0030
PixelSpacing 2.0\2.0
から、この画像のピクセル間の距離は、 2mmであることが、わかります。
ですので、 69.8mm 下げるのに、何ピクセル必要かと計算すると
69.8mm
/ 2.0 mm = 34.9 ピクセル、下げればよい事になります。
自作 K-PACSの画像
スライス幅は
0018,0050 Slice Thickness
5.00mm
5.00mmと、解りますから、
この間隔で、Slice Pos
ラインを、drawしてやればよいと、思います。
//別スレッドで実行するタスク
private void
ThreadTask()
{
//get_TrackBar_valueの作成
get_TrackBar_value read_data = new
get_TrackBar_value(get_CTrackBar_value);
set_TrackBar_value write_data = new
set_TrackBar_value(set_CTrackBar_value);
;
while (list_counter < dirs_oblectfiles.Length &&
show_movie)
{
this.Invoke(write_data,list_counter);
;
p_info.ObjectFile =
dirs_oblectfiles[list_counter];
list_counter +=
1;
if (dirs_oblectfiles.Length >=
list_counter)
gdcm_read_file_contents_backgorund(p_info.ObjectFile);
bitmap = myCreateBitmap(origin_Data, width, height, window_center_current,
window_current);
//
DrawImage();
if (bitmap == null) return;
// g.Transform = mat;
if (p_info.modality ==
"CT")
g.DrawImage(bitmap, 320,
0);
else
g.DrawImage(bitmap, 1800, 300);
myRefresh();
}
show_movie = false;
3.別スレッドを立てて、よかった事
当たり前の事ですが、スライス画像を連続して表示しながら、メインスレッドを操作できる事です。
これには、C#では、delegateなるものが必要になります。
よく解らないけど、兎に角、動くようになりました。
window_center
windowを一定にしながら、スライスを連続して表示できます。
まだまだ、やる事が、いっぱい、ありますねん (^_^;;
H.23.11.11