Skip to content

For comparing 2 or more sets of dicom file together. i.e. Original and edited studies. To Determine what changed.

Notifications You must be signed in to change notification settings

FullMetalEd/Dicom-Compare

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

11 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

DICOM Compare Tool

A powerful CLI tool for comparing DICOM studies from different ZIP exports to identify differences and troubleshoot export inconsistencies at both metadata and pixel data levels.

Overview

The DICOM Compare tool helps medical imaging professionals and DICOM system administrators validate DICOM exports by comparing studies from different systems or export methodologies. This is particularly useful for:

  • Troubleshooting export functionality - Identify which tags or pixels differ between export methods
  • System validation - Ensure DICOM exports maintain data integrity
  • Migration testing - Verify data consistency when moving between systems
  • Quality assurance - Compare original studies with processed/anonymized versions
  • Image integrity validation - Verify pixel data preservation across different export methods

Features

๐Ÿท๏ธ Tag Comparison

  • โœ… Multi-file comparison - Compare one baseline against multiple comparison files
  • โœ… Recursive ZIP extraction - Handles nested folder structures in ZIP files
  • โœ… Comprehensive tag analysis - Compares all DICOM tags including sequences
  • โœ… Rich terminal output - Beautiful formatted results with statistics
  • โœ… CSV/Excel reporting - Detailed exportable reports with charts
  • โœ… Instance matching - Matches DICOM instances using SOPInstanceUID
  • โœ… Difference categorization - Identifies missing, extra, and modified tags

๐Ÿ–ผ๏ธ Image Comparison

  • โœ… Pixel-level validation - Compare actual image pixel data
  • โœ… Tolerance support - Allow minor differences (useful for lossy compression)
  • โœ… DICOM normalization - Apply rescale slope/intercept and windowing
  • โœ… Similarity scoring - Calculate percentage of matching pixels
  • โœ… Statistical analysis - RMSE, max/mean differences, and more
  • โœ… Dimension validation - Detect image size differences
  • โœ… Missing pixel data detection - Identify instances without image data

๐Ÿ“Š Reporting & Analytics

  • โœ… Professional Excel reports with charts and conditional formatting
  • โœ… CSV exports for further analysis
  • โœ… Terminal dashboards with color-coded results
  • โœ… Quality grading (A+ to D) for export assessment
  • โœ… Statistical breakdowns by difference type and impact level

Installation

Prerequisites

Nix

Support for Nix flakes out of the box. You can add it to your flake like this:

Add the input:

dicom-compare.url = "github:FullMetalEd/Dicom-Compare";

Then you add it as a package in the packages section of your modules in the nixosConfiguration:

modules = [
            # List of the config files this profile needs.
            ./configuration.nix
            (
              {nixpkgs, ...}:
                {
                  environment.systemPackages = [
                    inputs.dicom-compare.packages."${systemSettings.system}".default
                  ];
                }
            )
          ];

Run as a python module from source

uv packages manager required.

Download the repo, and run uv sync this will download and setup the venv you need. you can then run commands like uv run dicom_compare/main.py --help, this will print the command help information.

Install Dependencies

# Using uv (recommended)
uv add typer[all] pydicom rich pandas openpyxl matplotlib numpy

# Or using pip
pip install typer[all] pydicom rich pandas openpyxl matplotlib numpy

Or run without installing from Nix

nix run github:FullMetalEd/Dicom-Compare -- --help

Quick Start

Tag Comparison

# Compare DICOM metadata tags
dicom-compare compare -f original.zip -f export1.zip

# Compare original against multiple exports with reporting
dicom-compare compare -f original.zip -f method1.zip -f method2.zip -r analysis.xlsx

# Verbose output for debugging
dicom-compare compare -f original.zip -f export1.zip -v

Image Comparison

# Compare image pixel data (exact match)
dicom-compare image -f original.zip -f export1.zip

# Allow small differences (useful for lossy compression)
dicom-compare image -f original.zip -f export1.zip -t 1.0

# Image comparison with Excel report
dicom-compare image -f original.zip -f export1.zip -r image_analysis.xlsx

# Disable DICOM normalization
dicom-compare image -f original.zip -f export1.zip --no-normalize

Inspection

# See what's inside ZIP files before comparing
dicom-compare inspect -f study1.zip -f study2.zip

Command Reference

compare - Tag Comparison

dicom-compare compare [OPTIONS]

Options:

  • -f, --file PATH - ZIP files to compare (minimum 2 required, first is baseline)
  • -r, --report PATH - Save detailed report to CSV/Excel file
  • -v, --verbose - Enable verbose debugging output
  • --help - Show help message

What it compares:

  • All DICOM metadata tags
  • Tag values, presence/absence
  • Instance matching by SOPInstanceUID
  • Study/Series organization

image - Image Pixel Data Comparison

dicom-compare image [OPTIONS]

Options:

  • -f, --file PATH - ZIP files to compare (minimum 2 required, first is baseline)
  • -r, --report PATH - Save image comparison report to CSV/Excel file
  • -t, --tolerance FLOAT - Tolerance for pixel differences (default: 0.0 = exact match)
  • --normalize/--no-normalize - Apply DICOM normalization (default: enabled)
  • -v, --verbose - Enable verbose debugging output
  • --help - Show help message

What it compares:

  • Actual pixel values in DICOM images
  • Image dimensions and data types
  • Statistical similarity measures
  • Pixel-level differences with tolerance

Tolerance Examples:

# Exact pixel match only
dicom-compare image -f original.zip -f export.zip -t 0.0

# Allow differences up to 1 pixel value (good for minor compression)
dicom-compare image -f original.zip -f export.zip -t 1.0

# Allow larger differences (useful for lossy compression)
dicom-compare image -f original.zip -f export.zip -t 5.0

Normalization:

  • Enabled (default): Applies DICOM rescale slope/intercept and windowing
  • Disabled: Compares raw pixel values as stored in the file

inspect - ZIP Content Inspector

dicom-compare inspect [OPTIONS]

Options:

  • -f, --file PATH - ZIP files to inspect

Understanding the Results

Tag Comparison Output

โ•ญโ”€ ๐Ÿ“‹ DICOM Comparison Summary โ”€โ•ฎ
โ”‚ Baseline: original.zip         โ”‚
โ”‚ Comparisons: 2                 โ”‚
โ”‚ Total Studies: 1               โ”‚
โ”‚ Total Instances: 1,247         โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

๐Ÿ” Detailed Comparison Results
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ File                           โ”ƒ Perfect Matches โ”ƒ Tag Differences โ”ƒ Missing Instances โ”ƒ Extra Instances โ”ƒ Data    โ”ƒ
โ”ƒ                                โ”ƒ                 โ”ƒ                 โ”ƒ                   โ”ƒ                 โ”ƒ Integrityโ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ export1.zip                    โ”‚ 1,200 (96.2%)   โ”‚ 47 (3.8%)       โ”‚ 0 (0.0%)          โ”‚ 0 (0.0%)        โ”‚ 96.2%   โ”‚
โ”‚ export2.zip                    โ”‚ 1,156 (92.7%)   โ”‚ 91 (7.3%)       โ”‚ 0 (0.0%)          โ”‚ 0 (0.0%)        โ”‚ 92.7%   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Image Comparison Output

โ•ญโ”€ ๐Ÿ–ผ๏ธ DICOM Image Comparison Summary โ”€โ•ฎ
โ”‚ Baseline: original.zip               โ”‚
โ”‚ Comparison Mode: Image Pixel Data    โ”‚
โ”‚ Tolerance: 1.0                       โ”‚
โ”‚ Normalization: Applied               โ”‚
โ”‚ Images Compared: 189                 โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

๐Ÿ–ผ๏ธ Image Comparison Results
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ File                    โ”ƒ Exact โ”ƒ Pixel   โ”ƒ Avg         โ”ƒ Missing   โ”ƒ Extra     โ”ƒ Match   โ”ƒ
โ”ƒ                         โ”ƒ Match โ”ƒ Diffs   โ”ƒ Similarity  โ”ƒ Images    โ”ƒ Images    โ”ƒ %       โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ export1.zip             โ”‚ 150   โ”‚ 39      โ”‚ 95.2%       โ”‚ 0         โ”‚ 0         โ”‚ 79.4%   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Column Meanings:

Tag Comparison:

  • Perfect Matches - Instances where all tags are identical
  • Tag Differences - Instances with one or more differing tags
  • Missing Instances - Instances in baseline but not in comparison
  • Extra Instances - Instances in comparison but not in baseline
  • Data Integrity - Overall quality score (0-100%)

Image Comparison:

  • Exact Match - Images with identical pixel values (within tolerance)
  • Pixel Diffs - Images with pixel value differences
  • Avg Similarity - Average percentage of matching pixels
  • Missing Images - Images in baseline but not in comparison
  • Extra Images - Images in comparison but not in baseline
  • Match % - Percentage of exactly matching images

Report Formats

CSV Reports

Simple tabular format with all differences, suitable for:

  • Filtering and sorting in spreadsheet applications
  • Further analysis with data science tools
  • Integration with other systems

Excel Reports

Professional multi-sheet reports with:

  • Executive Summary - Key metrics and charts
  • Detailed Results - Every comparison result
  • Tag/Image Analysis - Breakdown by difference type
  • Statistics - Comprehensive statistical analysis
  • Settings & Info - Configuration and explanations

Real-World Use Cases

Scenario 1: Export Method Validation

Problem: Testing two different export methods from the same PACS system.

# Tag comparison to check metadata preservation
dicom-compare compare -f original_export.zip -f new_export_method.zip -r validation.xlsx

# Image comparison to verify pixel data integrity
dicom-compare image -f original_export.zip -f new_export_method.zip -r pixel_validation.xlsx

Expected Results:

  • Tag comparison: High percentage of perfect matches (>95%)
  • Image comparison: Exact pixel matches or very high similarity (>99%)

Scenario 2: Lossy Compression Analysis

Problem: Evaluating the impact of JPEG compression on DICOM images.

# Compare with tolerance for compression artifacts
dicom-compare image -f uncompressed.zip -f jpeg_compressed.zip -t 2.0 -r compression_analysis.xlsx

Expected Results:

  • Some pixel differences due to compression
  • Similarity scores depend on compression level
  • Statistical analysis shows compression impact

Scenario 3: Anonymization Validation

Problem: Verifying that anonymization properly removes/modifies patient data while preserving clinical data.

# Tag comparison to check anonymization
dicom-compare compare -f original.zip -f anonymized.zip -r anonymization_check.xlsx

# Image comparison to ensure pixel data is unchanged
dicom-compare image -f original.zip -f anonymized.zip -r image_integrity_check.xlsx

Expected Results:

  • Tag comparison: Differences in patient-related tags, clinical data unchanged
  • Image comparison: Perfect pixel matches (anonymization shouldn't affect images)

Scenario 4: System Migration Testing

Problem: Ensuring data integrity when migrating between DICOM systems.

# Comprehensive validation
dicom-compare compare -f source_system.zip -f target_system.zip -r migration_tags.xlsx
dicom-compare image -f source_system.zip -f target_system.zip -r migration_images.xlsx

Expected Results:

  • Most instances should match perfectly
  • Acceptable differences in system-specific tags
  • Critical clinical tags and pixel data must be identical

Troubleshooting

Common Issues

"No DICOM files found"

# Use inspect to see ZIP contents
dicom-compare inspect -f yourfile.zip

# Common causes:
# - ZIP contains folders but no actual DICOM files
# - Files don't have DICOM headers
# - Files are compressed or encrypted

"Only a few instances compared from large ZIP"

# Enable verbose mode to see extraction details
dicom-compare compare -f file1.zip -f file2.zip -v

# Common causes:
# - DICOM files are in nested folders not being discovered
# - Files are corrupted or non-standard format
# - Permission issues during extraction

"High pixel differences but tags match"

This often indicates:

  • Lossy compression applied to one set
  • Different bit depths (16-bit vs 8-bit)
  • Normalization differences - try --no-normalize
  • Different transfer syntaxes

"Low similarity scores"

  • Check if normalization should be disabled: --no-normalize
  • Increase tolerance for minor differences: -t 1.0 or higher
  • Verify you're comparing the same study data

Performance Tips

  • Large studies: Use verbose mode (-v) to monitor progress
  • Multiple comparisons: Process one comparison at a time for large datasets
  • Memory usage: Image comparison loads pixel data into memory - monitor RAM usage
  • Image comparison: Much slower than tag comparison due to pixel processing

File Format Support

  • Input: ZIP files containing DICOM studies
  • DICOM Detection: Automatic detection of DICOM files regardless of extension
  • Nested Folders: Full support for complex directory structures
  • Output: CSV reports (basic) and Excel reports (advanced with charts)

Development & Contributing

Project Structure

dicom_compare/
โ”œโ”€โ”€ __init__.py
โ”œโ”€โ”€ main.py              # CLI entry point with multiple commands
โ”œโ”€โ”€ models.py            # Tag comparison data structures
โ”œโ”€โ”€ image_models.py      # Image comparison data structures
โ”œโ”€โ”€ dicom_extractor.py   # ZIP extraction logic
โ”œโ”€โ”€ dicom_loader.py      # DICOM file discovery and loading
โ”œโ”€โ”€ dicom_comparator.py  # Tag comparison logic
โ”œโ”€โ”€ image_comparator.py  # Image comparison logic
โ”œโ”€โ”€ image_command.py     # Image comparison command implementation
โ””โ”€โ”€ utils.py             # Helper functions

Running from Source

# Clone repository
git clone https://github.com/FullMetalEd/Dicom-Compare.git
cd Dicom-Compare

# Install dependencies
uv sync

# Run directly
uv run dicom_compare/main.py --help

Building with Nix

# Build package
nix build .#dicom-compare

# Run from source
nix run . -- --help

# Development shell
nix develop

License

MIT License - see LICENSE file for details.

Changelog

v0.2.0 (Latest)

  • โœ… Added image pixel data comparison - New image command
  • โœ… Multi-command CLI structure - compare, image, inspect
  • โœ… Tolerance support for image comparison
  • โœ… DICOM normalization options
  • โœ… Enhanced Excel reports with charts and conditional formatting
  • โœ… Statistical analysis for image similarities
  • โœ… Improved error handling and progress reporting

v0.1.0

  • โœ… Basic tag comparison functionality
  • โœ… ZIP extraction and DICOM discovery
  • โœ… CSV reporting
  • โœ… Terminal output with Rich formatting
  • โœ… Multi-file comparison support

For more information, bug reports, or feature requests, please visit the GitHub repository.

About

For comparing 2 or more sets of dicom file together. i.e. Original and edited studies. To Determine what changed.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published