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

В этом примере показано, как разработать пользовательский datastore, который поддерживает операции записи. Datastore называют DICOMDatastore потому что это поддерживает DICOM ® (Цифровая Обработка изображений и Коммуникации в Медицине) данные, которые являются международным стандартом для медицинской информации обработки изображений.

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

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

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

Эта таблица содержит код и объяснения 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

Открытые методы

Раздел открытых методов задает общие методы datastore что использование класса, чтобы управлять данными. Открытые методы внешне доступны, так пользователи класса 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чтениесброс, и progress методы задают инфраструктуру для datastore, чтобы работать с маленькими фрагментами данных за один раз. Это абстрактные методы, которые должны быть реализованы подклассом.

        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\")
Эта команда создает копии файлов datastore в папке C:\Data2\DICOM\series-000001.

Для получения общей информации об авторских классах в MATLAB® смотрите Классы.

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

| |

Похожие темы