番外編 DICOMとNAS その5


スライス位置を表示して、スライス像を連続して再生する

 
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);

            list_counter = (int)this.Invoke(read_data);
            ;
         
            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