Создайте Datastore изображений, содержащий один и многофайловые объемы DICOM

В этом примере показано, как создать 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

Смотрите также

| | | | |

Похожие темы