В этом примере показано, как разработать пользовательский 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 | Заголовок класса
|
properties Files matlab.io.datastore.FileSet end | Общественная собственность
|
properties (Constant) SupportedOutputFormats = ... [matlab.io.datastore.ImageDatastore.SupportedOutputFormats, "dcm"]; DefaultOutputFormat = "dcm"; end |
|
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, которые класс использует для манипулирования данными. Общедоступные методы доступны извне, поэтому пользователи классов Конструктор
|
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 |
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 | Защищенные методы Защищенные методы переопределяют методы, которые были унаследованы классом, и они доступны только для Защищенный |
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 | Защищенный |
function files = getFiles(myds) files = myds.Files.FileInfo.Filename; end end | Защищенный |
end | Завершите |
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®, см. Классы.
matlab.io.Datastore
| matlab.io.datastore.FileWritable
| matlab.io.datastore.FoldersPropertyProvider