В этом примере показано, как создать хранилище данных изображения, содержащее объемные данные 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. Эти данные можно добавить в хранилище данных.
Если данные содержатся в одном файле, то dicomreadVolume не выполняется успешно.
2) Попробуйте прочитать данные исследования, используя dicomread функция.
Если dicomread возвращает массив 4-D, затем исследование содержит полный объем 3-D. Эти данные можно добавить в хранилище данных.
Если dicomread возвращает 2-D матрицу или массив 3-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 из хранилища данных образа.
[V,Vinfo] = read(imdsdicom); [~,VFileName] = fileparts(Vinfo.Filename);
Объем DICOM имеет оттенки серого. Удалите размер одиночного канала с помощью squeeze затем отобразите громкость с помощью volshow функция.
V = squeeze(V); ViewPnl = uipanel(figure,'Title',VFileName); volshow(V,'Parent',ViewPnl);

matRead функция загружает данные из первой переменной файла MAT с именем файла filename.
function data = matRead(filename) inp = load(filename); f = fields(inp); data = inp.(f{1}); end
dicomCollection | dicominfo | dicomread | dicomreadVolume | imageDatastore | volshow