exponenta event banner

Разработка пользовательского хранилища данных для данных DICOM

В этом примере показано, как создать пользовательское хранилище данных, поддерживающее операции записи. Имя хранилища данных DICOMDatastore потому что он поддерживает данные DICOM ® (Digital Imaging and Communications in Medicine), который является международным стандартом для медицинской информации.

Разработка пользовательских хранилищ данных

В разделе Разработка пользовательского хранилища данных описывается общий процесс создания пользовательского хранилища данных, а также конкретные требования к добавлению различных функциональных возможностей. Существует множество суперклассов, из которых можно выполнить подкласс в зависимости от необходимых функциональных возможностей (параллельная оценка, операции записи, перетасовка и т.д.). В частности, можно добавить поддержку операций записи путем подкласса из matlab.io.datastore.FileWritable. Однако для самого широкого набора функций записи необходимо также выполнить подкласс из matlab.io.datastore.FoldersPropertyProvider, что добавляет Folders в хранилище данных. Полные требования к добавлению поддержки записи в пользовательское хранилище данных описаны в разделе Добавление поддержки записи данных.

Определение класса

Эта таблица содержит код и пояснения для DICOMDatastore класс.

classdef DICOMDatastore < matlab.io.Datastore & ...
                          matlab.io.datastore.FileWritable & ...
                          matlab.io.datastore.FoldersPropertyProvider 
                          

Заголовок класса

DICOMDatastore наследует от Datastore для базовой функциональности, а также из FileWritable и FoldersPropertyProvider для обеспечения возможности записи файлов.

    properties
        Files matlab.io.datastore.FileSet
    end

Общедоступные свойства

DICOMDatastore определяет общедоступный Files свойство, которое является FileSet объект. DICOMDatastore наследует Folders свойство из FoldersPropertyProvider, чтобы свойство не требовалось инициализировать.

    properties (Constant)
        SupportedOutputFormats = ...
          [matlab.io.datastore.ImageDatastore.SupportedOutputFormats, "dcm"];
        DefaultOutputFormat = "dcm";
    end

DICOMDatastore определяет SupportedOutputFormats и DefaultOutputFormat в качестве свойств константы со значениями по умолчанию. "dcm" является пользовательским форматом для данных DICOM.

    methods(Access = public)
        function myds = DICOMDatastore(location)
            % The class constructor to set properties of the datastore. 
            myds.Files = matlab.io.datastore.FileSet(location, ...
                "IncludeSubfolders", true);
            populateFoldersFromLocation(myds,location);
            reset(myds);
        end

Общедоступные методы

Раздел общих методов определяет общие методы хранилища данных, используемые классом для управления данными. Общедоступные методы доступны извне, поэтому пользователи классов DICOMDatastore может вызывать эти методы (в дополнение к другим общедоступным методам, унаследованным от суперклассов).

Конструктор DICOMDatastore создает новый DICOMDatastore путем установки значений для Files и Folders свойства.

  • Использовать FileSet для установки значения Files собственность.

  • Используйте populateFoldersFromLocation способ FoldersPropertyProvider для установки значения Folders собственность.

        function tf = hasdata(myds)
            %HASDATA   Returns true if more data is available.
            %   Return logical scalar indicating availability of data.
            %   This method should be called before calling read. This
            %   is an abstract method and must be implemented by the
            %   subclasses. hasdata is used in conjunction with read to
            %   read all the data within the datastore.
            tf = hasNextFile(myds.Files);
        end

hasdata, read, reset, и progress методы определяют инфраструктуру хранилища данных для одновременной работы с небольшими порциями данных. Это абстрактные методы, которые должны быть реализованы подклассом.

        function [data, info] = read(myds)
            %READ   Read data and information about the extracted data.
            %   Return the data extracted from the datastore in the
            %   appropriate form for this datastore. Also return
            %   information about where the data was extracted from in
            %   the datastore. Both the outputs are required to be
            %   returned from the read method and can be of any type.
            %   info is recommended to be a struct with information
            %   about the chunk of data read. data represents the
            %   underlying class of tall, if tall is created on top of
            %   this datastore. This is an abstract method and must be
            %   implemented by the subclasses.
            
            % In this example, the read method reads data from the
            % datastore using a custom reader function, MyFileReader,
            % which takes the resolved filenames as input.
            if ~hasdata(myds)
                error("No more data to read.\nUse reset method to " ...
                    + "reset the datastore to the start of the data. Before " ...
                    + "calling the read method, check if data is available " ...
                    + "to read by using the hasdata method.");
            end

            file = nextfile(myds.Files);
            try
                data = dicomread(file.Filename);
            catch ME
                error("%s has failed", file.FileName);
            end

            info.FileSize = size(data);
            info.Filename = file.Filename;
        end
        function reset(myds)
            %RESET   Reset to the start of the data.
            %   Reset the datastore to the state where no data has been
            %   read from it. This is an abstract method and must be
            %   implemented by the subclasses.
            
            % In this example, the datastore is reset to point to the
            % first file (and first partition) in the datastore.
            reset(myds.Files);
        end
        function frac = progress(myds)
            %PROGRESS   Percentage of consumed data between 0.0 and 1.0.
            %   Return fraction between 0.0 and 1.0 indicating progress as a
            %   double. The provided example implementation returns the
            %   ratio of the index of the current file from FileSet
            %   to the number of files in FileSet. A simpler
            %   implementation can be used here that returns a 1.0 when all
            %   the data has been read from the datastore, and 0.0
            %   otherwise.
            %
            %   See also matlab.io.Datastore, read, hasdata, reset, readall,
            %   preview.
            frac = progress(myds.Files);
        end
    end
methods(Access = protected)
        function dsCopy = copyElement(myds)
            %COPYELEMENT   Create a deep copy of the datastore
            %   Create a deep copy of the datastore. We need to call
            %   copy on the datastore's property FileSet because it is
            %   a handle object. Creating a deep copy allows methods
            %   such as readall and preview, which call the copy method,
            %   to remain stateless.
            dsCopy = copyElement@matlab.mixin.Copyable(myds);
            dsCopy.Files = copy(myds.Files);
        end

Защищенные методы

Защищенные методы переопределяют методы, унаследованные классом, и они доступны только для DICOMDatastore. Дополнительные сведения см. в разделе Изменение унаследованных методов.

Защищенный copyElement метод требуется всякий раз, когда FileSet используется для определения свойств. copyElement метод допускает такие методы, как readall и preview остаться без гражданства.

        function tf = write(myds, data, writeInfo, outFmt, varargin)
            if outFmt == "dcm"
                dicomwrite(data, writeInfo.SuggestedOutputName, varargin{:});
            else
                write@matlab.io.datastore.FileWritable(myds, data, ...
                    writeInfo, outFmt, varargin{:});
            end
            tf = true;
        end

Защищенный write способ записывает порции данных. С тех пор DICOMDatastore поддержки ImageDatastore форматы, а также пользовательский формат "dcm", write метод использует различные функции для записи данных в зависимости от формата вывода.

        function files = getFiles(myds)
            files = myds.Files.FileInfo.Filename;
        end
    end

Защищенный getFiles метод необходим, так как DICOMDatastore использование FileSet объекты для Files собственность. Files свойство, как правило, требуется для возврата cellstr, так что getFiles метод использует FileSet объект для создания cellstr пути к файлам.

end

Завершить classdef раздел.

 Развернуть для кода класса

Использование DICOMDatastore Класс

После реализации DICOMDatastore класс, можно использовать конструктор для создания нового DICOMDatastore объект, который ссылается на расположение набора файлов DICOM. Например, если в папке находятся файлы DICOM C:\Data\DICOM\series-000001\:

ds = DICOMDatastore("C:\Data\DICOM\series-000001")
ds = 

  DICOMDatastore with properties:

                     Files: [1×1 matlab.io.datastore.FileSet]
    SupportedOutputFormats: ["png"    "jpg"    "jpeg"    "tif"    "tiff"    "dcm"]
       DefaultOutputFormat: "dcm"
                   Folders: {'C:\Data\DICOM\series-000001'}

Пользователи класса DICOMDatastore иметь доступ к этим публичным методам:

methods(ds)
Methods for class DICOMDatastore:

DICOMDatastore   copy      isPartitionable  preview    read     reset      writeall         
combine          hasdata   isShuffleable    progress   readall  transform        

Methods of DICOMDatastore inherited from handle.

В частности, при поддержке writeall, можно записать файлы в новое расположение:

writeall(ds,"C:\Data2\DICOM\")
Эта команда создает копии файлов хранилища данных в папке C:\Data2\DICOM\series-000001.

Общие сведения о создании классов в MATLAB ® см. в разделе Классы.

См. также

| |

Связанные темы