Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

単一ファイルおよび複数ファイルの DICOM ボリュームを含むイメージ データストアの作成

この例では、単一ファイルおよび複数ファイルとして格納された DICOM ボリューム データを含むイメージ データストアを作成する方法を説明します。

DICOM データを含むディレクトリの場所を指定します。このデータには、2 次元イメージ、単一ファイル内の 3 次元ボリューム、および複数ファイルの 3 次元ボリュームが含まれます。

dicomDir = fullfile(matlabroot,'toolbox/images/imdata');

関数 dicomCollection を使用して、DICOM ファイルの詳細を収集します。この関数は、各行が単一のスタディを表す table として詳細を返します。複数ファイルの DICOM ボリュームの場合、この関数はそれらのファイルを集計して単一のスタディにします。

collection = dicomCollection(dicomDir,"IncludeSubfolders",true)
collection=6×14 table
               StudyDateTime               SeriesDateTime           PatientName      PatientSex     Modality     Rows    Columns    Channels    Frames    StudyDescription    SeriesDescription                             StudyInstanceUID                                                     SeriesInstanceUID                                                                                  Filenames                                                     
          ________________________    ________________________    _______________    __________    __________    ____    _______    ________    ______    ________________    _________________    __________________________________________________________________    __________________________________________________________________    ___________________________________________________________________________________________________________________

    s1    {0×0 double            }    {0×0 double            }    ""                    ""         "RTSTRUCT"      0         0         0           1      ""                  ""                   "1.2.826.0.1.3680043.8.274.1.1.2729954696.96242.3632970675.507"       "1.2.826.0.1.3680043.8.274.1.1.7145442384.75872.7982248107.258"       {["E:\jobarchive\Bdoc20b\2020_04_16_h05m48s37_job1364129_pass\matlab\toolbox\images\imdata\rtstruct.dcm"         ]}
    s2    {[30-Apr-1993 11:27:24]}    {[30-Apr-1993 11:27:24]}    "Anonymized"          ""         "CT"          512       512         1           1      "RT ANKLE"          ""                   "1.2.840.113619.2.1.1.322987881.621.736170080.681"                    "1.2.840.113619.2.1.2411.1031152382.365.736169244"                    {["E:\jobarchive\Bdoc20b\2020_04_16_h05m48s37_job1364129_pass\matlab\toolbox\images\imdata\CT-MONO2-16-ankle.dcm"]}
    s3    {[14-Dec-2013 15:47:31]}    {[14-Dec-2013 15:54:33]}    "GORBERG MITZI"       "F"        "MR"          512       512         1          22      "CSP"               "AX T2"              "1.2.840.113619.2.244.3596.11880862.13689.1386517653.214"             "1.2.840.113619.2.244.3596.11880862.13689.1386517653.217"             {22×1 string                                                                                                      }
    s4    {[03-Oct-2011 19:18:11]}    {[03-Oct-2011 18:59:02]}    ""                    "M"        "MR"          512       512         1           1      "RIGHT KNEE"        ""                   "1.3.6.1.4.1.9590.100.1.2.320418845013189618318250681693358291211"    "1.3.6.1.4.1.9590.100.1.2.287740981712351622214874344032214809569"    {["E:\jobarchive\Bdoc20b\2020_04_16_h05m48s37_job1364129_pass\matlab\toolbox\images\imdata\knee1.dcm"            ]}
    s5    {[03-Oct-2011 19:18:11]}    {[03-Oct-2011 19:05:04]}    ""                    "M"        "MR"          512       512         1           1      "RIGHT KNEE"        ""                   "1.3.6.1.4.1.9590.100.1.2.320498134711034521212730362051554545799"    "1.3.6.1.4.1.9590.100.1.2.316302984111738034326701385064023497963"    {["E:\jobarchive\Bdoc20b\2020_04_16_h05m48s37_job1364129_pass\matlab\toolbox\images\imdata\knee2.dcm"            ]}
    s6    {[30-Jan-1994 11:25:01]}    {0×0 double            }    "Anonymized"          ""         "US"          430       600         1          10      "Echocardiogram"    "PS LAX MR & AI"     "999.999.3859744"                                                     "999.999.94827453"                                                    {["E:\jobarchive\Bdoc20b\2020_04_16_h05m48s37_job1364129_pass\matlab\toolbox\images\imdata\US-PAL-8-10x-echo.dcm"]}

処理された DICOM ボリュームを格納する一時ディレクトリを作成します。

matFileDir = fullfile(pwd,'MATFiles');
if ~exist(matFileDir,'dir')
    mkdir(matFileDir)
end

コレクションの各スタディでループ処理を行います。

for idx = 1:size(collection,1)

スタディを構成するファイル名を取得します。複数ファイルの DICOM ボリュームのファイル名は、string 配列としてリストされています。

    dicomFileName = collection.Filenames{idx};
    if length(dicomFileName) > 1
        matFileName = fileparts(dicomFileName(1));
        matFileName = split(matFileName,filesep);
        matFileName = replace(strtrim(matFileName(end))," ","_");
    else
        [~,matFileName] = fileparts(dicomFileName);
    end
    matFileName = fullfile(matFileDir,matFileName);

データを読み取ります。イメージごとに次元数に違いがあり、異なる形式で格納されているため、さまざまな読み取り関数を試します。

1) 関数 dicomreadVolume を使用して、スタディのデータの読み取りを試します。

  • データが複数ファイルのボリュームの場合、dicomreadVolume は正常に実行され、単一の 4 次元配列で完全なボリュームを返します。このデータはデータストアに追加できます。

  • データが単一のファイルに含まれる場合、dicomreadVolume は正常に実行されません。

2) 関数 dicomread を使用して、スタディのデータの読み取りを試します。

  • dicomread が 4 次元配列を返す場合、スタディには完全な 3 次元ボリュームが含まれます。このデータはデータストアに追加できます。

  • dicomread が 2 次元行列または 3 次元配列を返す場合、スタディには単一の 2 次元イメージが含まれます。このデータをスキップし、コレクションの次のスタディに進みます。

    try
        data = dicomreadVolume(collection,collection.Row{idx});
    catch ME
        data = dicomread(dicomFileName);
        if ndims(data)<4
            % Skip files that are not volumes
            continue;
        end
    end    

4 次元配列で返された完全なボリュームの場合、データと絶対ファイル名を MAT ファイルに書き込みます。

    save(matFileName,'data','dicomFileName');

コレクションのスタディのループ処理を終了します。

end

DICOM ボリューム データを含む MAT ファイルから imageDatastore を作成します。この例の最後で定義されている補助関数 matRead として、ReadFcn プロパティを指定します。

imdsdicom = imageDatastore(matFileDir,'FileExtensions','.mat', ...
    'ReadFcn',@matRead);

イメージ データストアから最初の DICOM ボリュームを読み取ります。

[V,Vinfo] = read(imdsdicom);
[~,VFileName] = fileparts(Vinfo.Filename);

DICOM ボリュームはグレースケールです。関数 squeeze を使用して大きさが 1 のチャネル次元を削除してから、関数 volshow を使用してボリュームを表示します。

V = squeeze(V);
ViewPnl = uipanel(figure,'Title',VFileName);
volshow(V,'Parent',ViewPnl);

サポート関数

関数 matRead は、ファイル名 filename の MAT ファイルの最初の変数からデータを読み込みます。

function data = matRead(filename)
    inp = load(filename);
    f = fields(inp);
    data = inp.(f{1});
end

参考

| | | | |

関連するトピック