DICOM viewer and de-identification check
Open DICOM files or a folder of slices in the browser — every tag including private ones, flagged against the PS3.15 Annex E de-identification profile; Hounsfield units, window presets, distances in mm and region statistics; what the slice thickness can support; and an anonymised copy with a list of what changed.
Added
How to use it
Educational — not a medical device. Not for diagnosis, treatment, monitoring or dosing. Imaging data is patient data from the first file: information governance applies before you open a clinical image, not after. Practise on public, already de-identified data such as The Cancer Imaging Archive (TCIA) or the 3D Slicer sample data, or press Load a sample (synthetic). Every file is read in your browser; nothing is uploaded or stored.
How to use it
-
Open files… takes one or more
.dcmfiles; Open folder… (or dropping a folder) takes a whole series. Slices are grouped by Series Instance UID and ordered by their position along the slice normal (Image Position and Orientation), falling back to Slice Location or Instance Number. -
Load a sample (synthetic) builds a five-slice CT-like phantom in your browser: air, a soft-tissue body (+40 HU) with a fat layer (−100 HU), a lung-like region (−800 HU), a bone rod exactly 20.0 mm across (cortical +1200 HU around cancellous +400 HU) and a water vial (0 HU) in the middle slices, at 0.75 mm pixels and 5 mm slices. Its identifiers are fictional — and it has a fictional ID burned into the pixels while its header says
Burned In Annotation = NO, because that is exactly the trap the book warns about. -
Window — the file’s own window, the four CT presets from the book (brain 40/80, soft tissue 40/400, lung −600/1500, bone 400/2000; level/width in HU), the full range, or your own level and width. The mapping is the DICOM linear VOI function (PS3.3 C.11.2.1.2). The window is a display transform, not the data.
-
Probe shows the stored value and the value after Rescale Slope and Intercept — Hounsfield units for CT. Distance (drag) gives the length in mm from Pixel Spacing (row and column spacing separately); with only Imager Pixel Spacing it says the length is at the detector. Region (drag a rectangle) gives the pixel count, area, mean, SD, minimum and maximum — the exercise in ch16 of measuring air, fat, muscle and bone.
-
What it can support shows the pixel size, slice thickness and the spacing between slices (from their positions, so gaps and overlaps show), and checks a size you want to claim against them. A 5 mm slice cannot support a 0.5 mm claim.
-
Every tag lists the file meta header and every element, nested sequences included, with its VR, name and value. Private tags (odd groups) are shown with their raw bytes or text.
-
De-identification check flags each attribute that PS3.15 Annex E Table E.1-1 lists for the Basic Application Level Confidentiality Profile, with the profile’s action (X remove, Z empty, D dummy, U new UID, C clean), plus every private tag, and adds warnings about burned-in text and head volumes. Export anonymised copy applies the profile and lists every change; a series exports as a
.zipwith UIDs replaced consistently across the files. Open the anonymised copy here re-reads the result so you can check what remains.
File formats
Explicit and implicit VR little endian, explicit VR big endian, and deflated explicit VR little endian are parsed, with or without the 128-byte preamble. Uncompressed pixel data of 1, 8, 16 or 32 bits (signed or unsigned, any Bits Stored and High Bit, MONOCHROME1/2 and RGB, multi-frame) is displayed. JPEG Baseline (8-bit lossy) is decoded with the browser’s JPEG decoder. Other compressed transfer syntaxes — JPEG Lossless, JPEG-LS, JPEG 2000, RLE — are named, and their headers and tags are shown, but the tool says plainly that it does not decode their pixels.
⛶ Full screen (or F) gives the image the whole screen, scaled to fit — the browser’s full screen
where it is allowed, otherwise a full-window layer (iPhone). The file panel and the information
column start hidden; ◫ Panels brings them back. Escape leaves.
Limits
-
Not a diagnostic viewer: no calibrated display, no reporting, no clinical use.
-
The anonymised copy follows the basic profile only. It does not remove burned-in text, deface head CT or MR (a face can be reconstructed from them), clean free text in attributes it keeps, or shift dates (it empties them). Where Annex E offers a choice that depends on the IOD (X/Z, X/D, Z/D, X/Z/D) it keeps the attribute with an empty or dummy value. Treat the result as a draft for someone qualified to verify; de-identification is a verified process, not a best effort (ch15).
-
“Direct identifier” versus “quasi-identifier” is this tool’s reading of each attribute name; Annex E gives only the action.
-
JPEG Baseline pixels are lossy, so values read from them are approximate. Palette colour and YBR uncompressed images are not displayed.
-
Sampling is only the floor of accuracy. Segmentation threshold, partial volume, smoothing and decimation each move a surface further (ch15).
Sources: DICOM PS3.15 2026d Annex E, Table E.1-1 (Basic Profile column), and PS3.6 2026d Table 6-1 for attribute names and VRs (https://dicom.nema.org/medical/dicom/current/); window presets and Hounsfield ranges from ch16 of the book.
Companion to Measurement, imaging and diagnostics, Diagnostic devices and Health data, software and security of Human Biology for the Medical Maker.
Related: health data and medical software (k-anonymity, HIPAA Safe Harbor, FHIR, audit logs), binary format decoder, image tools, STL viewer.
Feedback is a gift. Something to improve, a feature to add, or a bug? Tell me.
Runs entirely in your browser; nothing you type leaves this page.