В этом примере показано, как создать datastore изображений, содержащий объемные данные DICOM, хранимые как один файл и как несколько файлов.
Задайте местоположение директории, содержащей данные DICOM. Данные включают 2D изображения, 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
возвращает 2D матрицу или трехмерный массив, затем исследование содержит одно 2D изображение. Пропустите эти данные и продолжите к следующему исследованию в наборе.
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);
matRead
функционируйте данные о загрузках из первой переменной файла MAT с именем файла filename
.
function data = matRead(filename) inp = load(filename); f = fields(inp); data = inp.(f{1}); end
dicomCollection
| dicominfo
| dicomread
| dicomreadVolume
| imageDatastore
| volshow