Skip to main content

DICOM De-identification & Redaction Engine

Project description

DICOM-DRE

A fast, deterministic DICOM de-identification and redaction engine.

dicom-dre removes protected health information (PHI) from DICOM instances in two places where it commonly hides:

  • Burned-in pixel PHI. A declarative device catalog matches each instance to a known device and acquisition variant (by manufacturer, model, modality, software version, image dimensions, SOP class, and image type) and blanks the fixed pixel regions where that device is known to burn in text. For JPEG Baseline images, regions are zeroed directly in the DCT domain, so unblanked pixels are preserved bit-for-bit with no recompression loss.
  • Free-text metadata PHI. Description fields that frequently carry PHI (SeriesDescription, StudyDescription, ProtocolName) are redacted token-by-token against an allowlist: any token not on the allowlist is masked, while known clinical terms pass through.

Instance metadata is also scrubbed against a configurable de-identification profile, and instance/study/series UIDs are deterministically re-derived, so the same input plus the same parameters always yields the same output.

Deterministic by design

The engine performs no hashing lookups, no network calls, and no randomization of its own. De-identification parameters (patient ID, accession number, UID root, salt, etc.) are consumed exactly as supplied. Given identical inputs and parameters, output is byte-reproducible. Callers are responsible for supplying already-hashed or already-mapped identifier values.

This determinism is guarded by a regression test suite built from sampled DICOM studies. Each fixture records the technical matching tags and the expected catalog filtering and pixel-scrub decisions (with no PHI or pixel data), and the tests assert that the engine still reaches the recorded decision for every case, so catalog or profile changes that alter existing outcomes are caught.

Provenance and portability caveat

The bundled device catalog and free-text allowlist were derived from studies on a single PACS at one medical research center. The catalog's device rules, pixel scrub regions, and allowlisted vocabulary reflect the scanner fleet and reporting conventions observed there. They are unlikely to be complete or correct for a different site. Before relying on dicom-dre elsewhere:

  • Validate pixel scrubbing against your own devices; unmatched or mismatched devices will not have their burned-in text blanked.
  • Review and extend the allowlist for your local vocabulary to avoid over-redaction (masking legitimate terms) or under-redaction (leaking PHI).

Treat the shipped catalog and allowlist as a starting point that requires local validation, not as a turnkey configuration.

Outcomes

Each instance resolves to one terminal outcome:

  • DEIDENTIFIED — metadata scrubbed, pixel regions blanked as required, written to the output directory.
  • FILTERED — the instance matched a deny rule (for example an unsupported modality or device) and was intentionally not emitted.
  • QUARANTINED — processing failed; the instance was not emitted.

Installation

This project uses uv for package management and requires Python 3.12.

uv pip install -e .

Command-line usage

De-identify files or directories into an output directory:

# Single file
dicom-dre deidentify scan.dcm -o out/

# Recurse a directory tree (mirrored under out/)
dicom-dre deidentify studies/ -o out/ -r

# Mixed sources, parallel workers, chosen profile and parameters
dicom-dre deidentify a.dcm b.dcm dir/ -o out/ \
    --profile default \
    -p PATIENT_ID=TEST -p ACCESSION_NUMBER=TESTING \
    -j 8

Sources are read but never modified. The command exits non-zero if any instance is QUARANTINED; FILTERED instances are a normal outcome.

Profiles

Select a de-identification profile with --profile:

  • default — full metadata scrub with re-derived UIDs.
  • lds — HIPAA limited data set (retains dates).
  • lds-no-dob — limited data set without date of birth.
  • pixels-only — pixel scrubbing with minimal metadata changes.

Free-text redaction tools

The redactor subcommands operate on CSV files of free text, using the same allowlist mechanism as description-field redaction:

# Redact every cell of a CSV against the allowlist
dicom-dre redactor redact --input input.csv --output output.csv

# Preview redactions side by side
dicom-dre redactor quality-check input.csv

# List unique tokens to help curate an allowlist
dicom-dre redactor show-tokens --input input.csv

Pass --allowlist <file.csv-or-path> to use a custom allowlist and --preserve-dates to keep dates and times intact for limited data sets.

These commands are useful when you can dump every SeriesDescription, StudyDescription, and ProtocolName value from your PACS: run them over that export to review the distinct tokens and build an allowlist tailored to your site's vocabulary.

Library usage

from dicom_dre import deidentify_paths, ProfileSpec

for item in deidentify_paths(
    sources=["studies/"],
    output_dir="out/",
    recursive=True,
    profile_spec=ProfileSpec(name="default", parameters={"PATIENT_ID": "TEST"}),
):
    print(item.input_file, item.result.outcome)

The public API also exposes deidentify_file, build_profile, get_default_catalog, DeviceCatalog, TextRedactor, and the profile factories. See the module docstrings and docs/ for details.

Development

uv run pytest        # run the test suite

License

Apache-2.0. The JPEG DCT-domain scrubber is a port of the PixelMed JPEG Selective Block Redaction Codec and is distributed under that codec's BSD license; see the source header in src/dicom_dre/jpeg_dct_scrubber.py and the NOTICE file.

Acknowledgements

This project would not have been possible without our years of working with and learning from the MIRC CTP (Clinical Trial Processor) engine, for which we are grateful.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dicom_dre-1.0.0.dev1.tar.gz (343.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dicom_dre-1.0.0.dev1-cp312-cp312-win_amd64.whl (228.3 kB view details)

Uploaded CPython 3.12Windows x86-64

dicom_dre-1.0.0.dev1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (252.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

dicom_dre-1.0.0.dev1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (251.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

dicom_dre-1.0.0.dev1-cp312-cp312-macosx_11_0_arm64.whl (221.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

Details for the file dicom_dre-1.0.0.dev1.tar.gz.

File metadata

  • Download URL: dicom_dre-1.0.0.dev1.tar.gz
  • Upload date:
  • Size: 343.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for dicom_dre-1.0.0.dev1.tar.gz
Algorithm Hash digest
SHA256 3a43d24288fa0bd22d0a1c9da8609f33f921172ef02642abcbe7e017415a38a6
MD5 a9860c56aca8fd5b427f9a00de36e371
BLAKE2b-256 49fdd480cd7d27b43dcd0ada85a9a286c444c83fd80af1769a7df912ed453d7d

See more details on using hashes here.

Provenance

The following attestation bundles were made for dicom_dre-1.0.0.dev1.tar.gz:

Publisher: deploy.yml on susom/dicom-dre

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dicom_dre-1.0.0.dev1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for dicom_dre-1.0.0.dev1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 679f3ae5277f3bc086ed662f174f05a9f07f730ee9eaad4b53d1b385142539b2
MD5 0f3052d375a0dfacad897afc174c4f48
BLAKE2b-256 67d4cf45ccccd2480d836df400c1ec45d3e58f1767f01e01955e86f3eb7b28ca

See more details on using hashes here.

Provenance

The following attestation bundles were made for dicom_dre-1.0.0.dev1-cp312-cp312-win_amd64.whl:

Publisher: deploy.yml on susom/dicom-dre

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dicom_dre-1.0.0.dev1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for dicom_dre-1.0.0.dev1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 917acf6b31cad1353a8a04df2ed45990cb8f778f06b9df2e4383e4e1d13a0426
MD5 eafd4f885551d481fa3ef280e14409bb
BLAKE2b-256 216f7be463c1a6de95a6f291221e6868886fe83b3b64d24b9469768d9a856322

See more details on using hashes here.

Provenance

The following attestation bundles were made for dicom_dre-1.0.0.dev1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: deploy.yml on susom/dicom-dre

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dicom_dre-1.0.0.dev1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for dicom_dre-1.0.0.dev1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 d754bbefc3c68897882d9cd9c8a3091210a640d65e2b1a25f250af3ae9059c4b
MD5 21d8756086866ad9d2bd876e05e56cee
BLAKE2b-256 2b2275a8f7b2dda03317b3155c0d37fc05ca0bc487cc6fede52f45777c7ab660

See more details on using hashes here.

Provenance

The following attestation bundles were made for dicom_dre-1.0.0.dev1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: deploy.yml on susom/dicom-dre

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dicom_dre-1.0.0.dev1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dicom_dre-1.0.0.dev1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a8fb92c4773715e8eda70fcdc89e8bf445aa22aab3dae4fd0f99125b68105299
MD5 5753eadd14769132b0c2d2976e780d09
BLAKE2b-256 d32519a6cf555d340ec7c597b7bc006ee33fedc3fbcd4e7975f101eebed21456

See more details on using hashes here.

Provenance

The following attestation bundles were made for dicom_dre-1.0.0.dev1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: deploy.yml on susom/dicom-dre

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page