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

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

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

В теме «Разработка пользовательского 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

The hasdata, read, reset, и 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 используется для определения свойств. The 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 свойство. The 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®, см. Классы.

См. также

| |

Похожие темы