¿Qué es DICOM?
DICOM (Digital Imaging and Communications in Medicine, Imagen Digital y Comunicaciones en Medicina) es el estándar internacional para imágenes médicas e información relacionada. Desarrollado desde 1985, DICOM define todo lo relacionado con cómo se almacenan, transmiten y visualizan las imágenes médicas: desde tomografías computarizadas (TC) y resonancias magnéticas (RM) hasta ecografías, radiografías, mamografías e imágenes de endoscopia.
Un archivo DICOM no es simplemente una imagen — es un objeto de información que combina datos de píxeles con metadatos completos: identidad del paciente, parámetros de adquisición, información de la institución, datos de calibración del equipo y contexto clínico. Esta metainformación integral es lo que distingue a DICOM de los formatos de imagen de consumo como JPEG o PNG, y lo que lo hace médica y legalmente esencial.
DICOM es omnipresente en la sanidad: todo PACS hospitalario (Sistema de Archivo y Comunicación de Imágenes), toda estación de trabajo de radiología, todo sistema de planificación de radioterapia y toda modalidad (TC, RM, PET, ecografía) produce y consume DICOM.
Estructura del Archivo DICOM
Información Meta del Archivo
Todo archivo DICOM comienza con:
Bytes 0–127: 128 bytes de preámbulo (ceros por convención)
Bytes 128–131: Magia "DICM" (0x44 0x49 0x43 0x4D)
Bytes 132+: Dataset de Información Meta del Archivo (atributos Grupo 0002)
La Información Meta contiene:
- (0002,0002) Media Storage SOP Class UID: Tipo de imagen (Imagen TC, Imagen RM, etc.)
- (0002,0003) Media Storage SOP Instance UID: ID único global para esta imagen específica
- (0002,0010) Transfer Syntax UID: Reglas de codificación (orden de bytes, compresión)
Elementos de Datos
Después de la Información Meta, el dataset DICOM consiste en elementos de datos en formato Tag-Longitud-Valor:
|-- 4 bytes --|-- 2 bytes --|-- 2-4 bytes --|-- N bytes --|
| Tag (GG,EE)| VR | Longitud | Valor |
Ejemplos de tags:
(0008,0060) CS Modalidad = "TC"
(0008,0020) DA Fecha del Estudio = "20240315"
(0010,0010) PN Nombre del Paciente = "García^Juan^A"
(0010,0020) LO ID del Paciente = "PAC-123456"
(0010,0030) DA Fecha de Nacimiento = "19750822"
(0028,0010) US Filas = 512
(0028,0011) US Columnas = 512
(0028,0030) DS Espaciado de Píxeles = "0.703125\0.703125"
(0028,0100) US Bits Asignados = 16
(7FE0,0010) OW Datos de Píxel = [datos de píxel binarios]
Unidades Hounsfield en TC y Ventaneo
Unidades Hounsfield (UH) en TC
Las imágenes de TC almacenan valores de píxel en Unidades Hounsfield, una escala de radiodensidad estandarizada:
| Tejido | Rango UH |
|---|---|
| Aire | −1000 |
| Pulmón | −600 a −400 |
| Grasa | −120 a −90 |
| Agua | 0 |
| Tejido blando | +20 a +80 |
| Hueso | +400 a +1000 |
Los tags DICOM (0028,1052) Rescale Intercept y (0028,1053) Rescale Slope convierten valores almacenados a UH:
UH = valor_píxel_almacenado × RescaleSlope + RescaleIntercept
Ventaneo (Windowing)
Para mostrar datos en rango UH en pantallas de 8 bits se requiere ventaneo:
(0028,1050) Window Center: El valor UH mapeado al 50% de brillo(0028,1051) Window Width: El rango UH mapeado al 0–100% de brillo
Preajustes de ventana estándar:
- Abdomen: A=350, C=40
- Pulmón: A=1500, C=−600
- Cerebro: A=80, C=40
- Hueso: A=2000, C=300
Trabajo con Archivos DICOM
pydicom (Python)
import pydicom
import numpy as np
import matplotlib.pyplot as plt
# Cargar un archivo DICOM
ds = pydicom.dcmread('corte_tc.dcm')
# Acceder a metadatos
print(ds.PatientName) # "García^Juan"
print(ds.Modality) # "CT"
print(ds.Rows, ds.Columns) # 512, 512
# Obtener array de píxeles y aplicar rescalado
arr = ds.pixel_array.astype(float)
uh = arr * ds.RescaleSlope + ds.RescaleIntercept # en UH
# Aplicar ventaneo (abdomen)
img_min, img_max = 40 - 350/2, 40 + 350/2
windowed = np.clip(uh, img_min, img_max)
windowed = (windowed - img_min) / (img_max - img_min) * 255
plt.imshow(windowed.astype(np.uint8), cmap='gray')
plt.savefig('corte_tc.png', bbox_inches='tight')
DCMTK por Línea de Comandos
# Mostrar tags DICOM
dcmdump corte_tc.dcm | head -50
# Convertir DICOM a PNG (con ventaneo automático)
dcm2pnm --write-png corte_tc.dcm salida.png
# Anonimizar DICOM (eliminar datos del paciente)
dcmodify -ie "(0010,0010)" -ie "(0010,0020)" corte_tc.dcm
# Convertir serie DICOM a NIfTI
dcm2niix -z y -o ./salida ./serie_dicom/
Privacidad y Anonimización
Los archivos DICOM contienen extensa PHI (Información Protegida de Salud). Antes de compartir archivos DICOM para investigación, educación o desarrollo, siempre anonimiza:
Eliminaciones requeridas:
- Nombre del paciente, ID, fecha de nacimiento, dirección
- Fecha del estudio (reemplaza con offset de días)
- Nombre de la institución, nombre del médico
- Números de serie del equipo
- UIDs (reemplaza con nuevos UIDs generados)
Herramientas: pydicom deidentify(), DCMTK dcmodify, 3D Slicer Anonymizer, CTP (Clinical Trials Processor).
Visores DICOM
| Herramienta | Plataforma | Caso de Uso |
|---|---|---|
| Horos | macOS | Revisión clínica, reconstrucción 3D |
| 3D Slicer | Multiplataforma | Investigación, segmentación |
| Weasis | Multiplataforma (Java) | Visor PACS web/escritorio |
| dwv | Navegador | Visor DICOM en JavaScript |
| RadiAnt | Windows | Visor clínico rápido |
DICOM es conocimiento esencial para cualquiera que trabaje en informática de salud, IA médica o integración de sistemas de imagen.