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

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

См. также

| | | | |

Похожие темы