В этом примере показано, как создать datastore, содержащее объемные данные DICOM, хранящиеся в одном файле и в нескольких файлах.
Укажите местоположение директории, содержащей данные DICOM. Данные включают 2-D изображения, 3-D том в одном файле и мультифайл 3-D том.
dicomDir = fullfile(matlabroot,'toolbox/images/imdata');
Соберите подробности о файлах DICOM с помощью dicomCollection
функция. Эта функция возвращает детали как таблицу, где каждая строка представляет одно исследование. Для многофайловых томов 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 имена файлов перечислены как строковые массивы.
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-D массиве. Можно добавить эти данные к datastore.
Если данные содержатся в одном файле, то dicomreadVolume
не выполняется успешно.
2) Попробуйте считать данные исследования при помощи dicomread
функция.
Если dicomread
возвращает 4-D массив, затем исследование содержит полный 3-D том. Можно добавить эти данные к datastore.
Если dicomread
возвращает 2-D матрицу или трехмерные массивы, затем исследование содержит одно 2-D изображение. Пропустите эти данные и продолжите следующее исследование в наборе.
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-D массив, запишите данные и абсолютное имя файла в файл MAT.
save(matFileName,'data','dicomFileName');
Завершите цикл над исследованиями в наборе.
end
Создайте imageDatastore
из файлов MAT, содержащих объемные данные DICOM. Задайте ReadFcn
свойство как вспомогательная функция matRead
, заданный в конце этого примера.
imdsdicom = imageDatastore(matFileDir,'FileExtensions','.mat', ... 'ReadFcn',@matRead);
Считайте первый том DICOM из datastore.
[V,Vinfo] = read(imdsdicom); [~,VFileName] = fileparts(Vinfo.Filename);
Том DICOM имеет полутоновый цвет. Удалите размерность синглтонного канала при помощи squeeze
, затем отобразите громкость при помощи volshow
функция.
V = squeeze(V); ViewPnl = uipanel(figure,'Title',VFileName); volshow(V,'Parent',ViewPnl);
The matRead
функция загружает данные из первой переменной файла MAT с именем файла filename
.
function data = matRead(filename) inp = load(filename); f = fields(inp); data = inp.(f{1}); end
dicomCollection
| dicominfo
| dicomread
| dicomreadVolume
| imageDatastore
| volshow