Skip to content

chafey/dicom-parser-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

87 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dicom-parser-rs

dicom parser written in Rust

Design Goals

  • Parse all standards compliant DICOM P10 files
  • First class support for WebAssembly builds
  • Streaming compatible API
  • SAX Style callback based parsing
  • Does not utilize a DICOM data dictionary
  • Modular design enabling flexible re-use of the library functionality

Read about the design rationale for this library

Features

  • Callback based parsing
  • Cancel Parsing
  • DICOM P10 Meta Information
  • Explicit Little Endian Transfer Syntax
  • Streaming Parser
  • Implicit Little Endian Transfer Syntax
  • Explicit Big Endian Transfer Syntax
  • Encapsulated Pixel Data
  • Sequences with known lengths
  • Sequences with undefined lengths
  • UN with undefined lengths
  • Deflate Transfer Syntax

Status

Actively being developed (June 20, 2020)

To Do's (before first version release)

  • Add no_std configuration?
  • Add example applications
    • dump to DICOM JSON format
    • dump to text (in DCMTK dcmdump format) - requires data dictionary though
  • Test library with large number of images (GDCM test images, etc)
    • Would be nice to build an automated regression suite

Performance Benchmarking

Add performance benchmark to understand parser performance for various use cases and data variations. Establishing a baseline here will help avoid performance regressions due to future changes and also serve as a useful comparsion agains other parsing implementations.

  • Use Cases
    • SOP Instance Identification - extract Study,Series and SOPInstanceUID Only
    • Basic Image Display - Extract minimum attributes to display image (ImagePixel Module)
    • Basic Encoding Validation - make sure the entire dataset can be parsed (ignore data though)
    • Basic Metadata - extract basic metadata like patietn demographics, study description, etc
    • Metadata ingestion - parse all metadata fields
    • Pixel Ingestion - parse all pixel data
  • Data Variations
    • Transfer Syntaxes (Implicit Little Endian, Explicit Little Endian, Explicit Big Endian)
    • Pixel Data (uncompressed, compressed/encapsulated not fragmented, encapsulated fragmented)
    • Lengths (defined and undefined)
    • Sizes (large multiframe, small single frame)
    • Private Attributes (large, small)
    • Stream Parsing - full dataset, chunked, single bytes

Possible Future Functionality

  • Consider helpers to convert attribute data into rust types (e.g. strings, numbers, etc)
    • Note: meta_information already has functionality to convert to utf8 strings
  • Create handler that produces DICOM JSON?
  • Consider adding FilterHandler that filters out handler calls for specific attributes.
  • Consider adding TagCancelHandler to cancel parsing on specific tag (or tags)
  • Consider making a cancelled parse resumable? Should work given that the parser is streaming capable
  • Add P10StreamParser which provides a simplified interface for stream parsing by buffering data from incomplete parses
  • Consider adding a Handler that aggregates mutliple data callbacks into a single buffer
  • Explore ways to automate mapping from Handler to types in a struct, perhaps using macros?
    • would be nice to be able to do something like: !map(0x0020, 0x000D, &self.study_instance_uid);
    • could use this for creating the MetaInformation struct rather than a custom Handler

Refactorings

  • Separate undefined length logic from known length logic
    • SequenceItemDataParser->SequenceItemDataUndefinedLengthParser
    • SequenceParser -> SequenceUndefinedLengthParser
  • Refactor parse_tag_and_length() so we don't have two of them - perhaps replace with parse_attribute()?
  • replace unit test dependencies on actual P10 files with synthetic data

About

dicom parser written in Rust

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published