このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
単一ファイルおよび複数ファイルの 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" {["Z:\21\jbernier.Bdoc22b.j1990784.1\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" {["Z:\21\jbernier.Bdoc22b.j1990784.1\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" {["Z:\21\jbernier.Bdoc22b.j1990784.1\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" {["Z:\21\jbernier.Bdoc22b.j1990784.1\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" {["Z:\21\jbernier.Bdoc22b.j1990784.1\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); volshow(V);
サポート関数
関数 matRead
は、ファイル名 filename
の MAT ファイルの最初の変数からデータを読み込みます。
function data = matRead(filename) inp = load(filename); f = fields(inp); data = inp.(f{1}); end
参考
dicominfo
| dicomread
| dicomreadVolume
| dicomCollection
| volshow
| imageDatastore
関連するトピック
- DICOM イメージを含むイメージ データストアの作成
- ボリュームの深層学習向け前処理 (Deep Learning Toolbox)