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.
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
- โ 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
- โ 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
- โ 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
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
];
}
)
];
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.
# 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
nix run github:FullMetalEd/Dicom-Compare -- --help
# 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
# 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
# See what's inside ZIP files before comparing
dicom-compare inspect -f study1.zip -f study2.zip
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
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
dicom-compare inspect [OPTIONS]
Options:
-f, --file PATH
- ZIP files to inspect
โญโ ๐ 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% โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโดโโโโโโโโโโ
โญโ ๐ผ๏ธ 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
Simple tabular format with all differences, suitable for:
- Filtering and sorting in spreadsheet applications
- Further analysis with data science tools
- Integration with other systems
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
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%)
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
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)
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
# 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
# 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
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
- 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
- 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
- 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)
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
# 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
# Build package
nix build .#dicom-compare
# Run from source
nix run . -- --help
# Development shell
nix develop
MIT License - see LICENSE file for details.
- โ
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
- โ 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.