番外編 DICOM画像とNAS その9


擬似カラー表示も追加しました

 1.やるべき事が、まだまだ沢山ありますが、

    取りあえず

      水平、垂直鏡像、

      CTのウィンドウレベル及びウィンドウ幅の調整、及び、簡単な自動調整

      白黒反転、90度左右回転

      擬似カラーでの表示

      他病院からのDICOM画像の閲覧

    を、追加しました。

    CTのウィンドウレベル及びウィンドウ幅の調整(マウス右ボタン:上下左右ドラッグ)を行うと

    擬似カラーも変化します。



    次に
      他病院からのDICOM画像の閲覧する時

    CDのディレクトリーを直接指定するか、CD画像をハード-ディスクにコピーして

    そのディレクトリーを指定します。 ( @のボタンを押す )


         尚、Aの所は、選択したマウスの機能を、表示しています。

    マウスの左右クリック等で、その時の機能を表示します。
   
    ディレクトリーを選択すると、


    選択したディレクトリー内及び、選択したディレクトリー以下のサブディレクトリー内の、全てのDICOM画像が、抽出されます。
  



    うーむ、

    今まで、DICOM画像でみた事もない、画像が表示されますね。

    ディレクトリー内のDICOMファイルの抽出は、GDCM::Scannerの力を、お借りしました。

    今回のプログラムの一部です。
/////////////////////////////////////////////////////////////////////////////////
    private void toolStripButton6_Click(object sender, EventArgs e)
        {
            read_from_Directory = !read_from_Directory;


            if (read_from_Directory)
            {
        ................
   
                DialogResult result = folderBrowserDialog1.ShowDialog();
                if (result == DialogResult.OK)
                {

                    string dirct = folderBrowserDialog1.SelectedPath;

                    if (dirct == "C:\\")
                    {
                        MessageBox.Show("このDirectoryの検索は中止します。");
                       ....................................
                        read_from_Directory = false;
                            return;
                    }
                    ...............
                    gdcm.Directory d = new gdcm.Directory();

                                       
                    p_info_LIST.Clear();
                    Cursor.Current = Cursors.WaitCursor;
                    uint nfiles;
                 
                        nfiles = d.Load(dirct);

                        if (nfiles != 0)
                        {
                            Scanner s = new Scanner();
                            Tag t = new Tag(0x8, 0x8);
                            //add Tag(t) is necessary
                            s.AddTag(t);

                            //d.GetFilenames()で得たファイルは、DICOMファイル以外も含む
                            FilenamesType files = d.GetFilenames();
                            int files_number = files.Count();
                            bool b4 = s.Scan(d.GetFilenames());
                            if (b4)
                            {

                                //scan後、getKeys()は、有効なDICOM filesを列挙する。
                                FilenamesType f3 = s.GetKeys();

                                if (f3.Count() != 0)
                                {
                                    p_info.objects_number = f3.Count();
                                    string key = f3[0];
                                    gdcm_read_file_contents(key);
                                    p_info.ObjectFile = key;
                                    p_info.dirs_oblectfiles = f3.ToArray();
                                    p_info_LIST.Add(p_info);

                                }
                            }
                        }
                        string[] subFolders = System.IO.Directory.GetDirectories(
                                dirct, "*", System.IO.SearchOption.AllDirectories);
                        int numberOfSubdirectory = subFolders.Count();
                   
                    if (numberOfSubdirectory != 0)
                    {
                        for (int i = 0; i < numberOfSubdirectory; i++)
                        {

                            nfiles = d.Load(subFolders[i]);

                            if (nfiles != 0)
                            {
                                Scanner s = new Scanner();
                                Tag t = new Tag(0x8, 0x8);
                                //add Tag(t) is necessary
                                s.AddTag(t);
                                //d.GetFilenames()で得たファイルは、DICOMファイル以外も含む

                                bool b4 = s.Scan(d.GetFilenames());
                                if (b4)
                                {

                                    //scan後、getKeys()は、有効なDICOM filesを列挙する。
                                    FilenamesType f3 = s.GetKeys();

                                    if (f3.Count() != 0)
                                    {
                                        p_info.objects_number = f3.Count();
                                        string key = f3[0];
                                        gdcm_read_file_contents(key);
                                        p_info.ObjectFile = key;
                                        p_info.dirs_oblectfiles = f3.ToArray();
                                        p_info_LIST.Add(p_info);

                                    }
                                }
                            }


                        }
                    }

                    treeView1.BackColor = Color.Chartreuse;
                    OnRecordEnum_OnTreeview(null, null);
                    treeView1.BackColor = Color.Chartreuse;
                }
                else
                {
                    toolStripButton6.BackColor = Color.LemonChiffon;
                    read_from_Directory = false;
                    toolStripButton2_Click(null, null);
                    toolStripButton6.Text = "Directoryから読み込む";
                    treeView1.BackColor = Color.Chartreuse;
                }
            }
            else
            {
                adjust_window_level = false;
                toolStripButton6.BackColor = Color.LemonChiffon;
                toolStripButton2_Click(null, null);
                toolStripButton6.Text = "Directoryから読み込む";
                textBox1.Enabled = true;
                textBox2.Enabled = true;
                toolStripTextBox1.Enabled = true;
                toolStripTextBox2.Enabled = true;
                treeView1.BackColor = Color.Chartreuse;
            }
            Cursor.Current = Cursors.Default;
        }

    尚、他病院からの患者名は、DICOM画像のTagから取得しましたが

    日本語もバッチリです。


/////////////////////////////////////////////////////////////////////////////////
             //GDCM part
                gdcm.ImageReader reader = new gdcm.ImageReader();
              
                reader.SetFileName(file_name);
                if (!reader.Read())
                {
                    return;
                }

                //////////////////////////////////////////////////
                StringFilter sf = new gdcm.StringFilter();
                sf.SetFile(reader.GetFile());
             
                //////////////////////////////////////////////////
                gdcm.Image image = reader.GetImage();
                p_info.height = (int)image.GetRows();
                p_info.width = (int)image.GetColumns();
                p_info.origin_Data = new short[p_info.width * p_info.height];
                image.GetArray(p_info.origin_Data);

                gdcm.DataSet ds = reader.GetFile().GetDataSet();

                //Patient name
                if (ds.GetDataElement(new gdcm.Tag(0x10, 0x10)).IsEmpty())
                    p_info.name = "UNKNOWN";

                else
               {
                     
                    byte[] bytesData = new byte[50];
                    ByteValue bv = ds.GetDataElement(new gdcm.Tag(0x10, 0x10)).GetByteValue();
                    bv.GetBuffer(bytesData, bv.GetLength());
                    p_info.name = encISO2022.GetString(bytesData);
                    int len = p_info.name.IndexOf('\0');
                    p_info.name = p_info.name.Substring(0, len);
                    p_info.name = p_info.name.Replace("^", " ");
                    p_info.name = p_info.name.Trim('=');
                    p_info.name = Microsoft.VisualBasic.Strings.StrConv(p_info.name, VbStrConv.Narrow);//to 半角カナ
                }
/////////////////////////////////////////////////////////////////////////////////

    次に

    水平、垂直鏡像等は、右クリックで、表示されます。


    数字キーでも、

    一発で、windowレベル 、window widthを、調整できるようにしました。

    thanks to Dr. AKASAKA 先生。

    私の関与する病院は、療養型病院なので、

    これだけの機能で十分かな......

    3Dも、興味あるのですが.....(^_^;;

H.24.4.15