AI-based diagnosis of acute aortic syndrome from noncontrast CT
论文PDF
简介
对于不同厂商和医院,所使用的 CTA 存储方式和类型不同,读取的方式也有差别。这篇文章将介绍一些基本的 CTA 处理手段,以便于从海量 CTA 数据中准备训练数据。
阶段一:物理扫描与格式校验 (Physical Discovery)
这是清洗的第一步,目的是识别硬盘上杂乱的文件哪些是真正的影像。
- 文件头校验 (Magic Number Check): 忽略文件名后缀,经典的
slices文件的后缀名为.dcm,但是实际在存储的阶段,很多商家使用无文件名存储方式。因此,通常有两种方式来读取切片数据:- 采用程序读取文件偏移量 128 字节处的
DICM标志。- 优点: 极速: 只需要读取文件的前 132 个字节,不需要加载库或解析复杂的标签。初步分拣: 在处理 6620 例这种可能有杂质(Excel、PDF、临时文件)的数据集时,可以瞬间剔除非 DICOM 文件。
- 局限性: 不完全性: 极少数旧式的、不符合 PS3.10 标准的 DICOM 文件可能没有这 128 字节的导言区(直接从 Tag 开始)。这种文件虽然不标准,但依然包含医学数据。
pydicom.dcmread(file, stop_before_pixels=True)方式。- 原理: 它会解析文件的整个 Data Element 结构。stop_before_pixels=True 的作用是告诉程序:“读到像素数据(Pixel Data Tag)之前就停下”。
- 优点: 彻底性: 它不仅验证文件是否为 DICOM,还提取了 UID、层厚、间距等清洗所需的元数据;兼容性: 对于那些没有 128 字节导言区但数据格式正确的文件,pydicom 通过 force=True 参数依然可以读取。
- 局限性: 性能开销: 相比只读 4 个字节,它需要解析整个字典,速度相对慢一些。
所以一般是采用第一种方式先滤除(Excel, PDF, 临时文件等等)。再使用第二种方式解析
dicom文件。 - 采用程序读取文件偏移量 128 字节处的
- 非影像文件分离: 自动识别并归类
.xlsx/jpg/png(临床报告)、.pdf(扫描参数表)、.txt(剂量报告)以及文件夹内的DIRFILE(索引文件)等内容。 - 结构层级记录: 记录文件所在的物理路径,用于后续回溯。
阶段二:DICOM 逻辑解构 (Logical De-identification)
这一步不再看文件夹,而是通过 DICOM 标签(Tags)重构数据的“家族树”。
DICOM 标签有序号,序号被称为 数据元素标签 (Data Element Tag)。每一个标签由两部分组成:(Group Number, Element Number)。
-
Group Number(组号): 偶数通常代表标准属性。
-
0002: 文件元信息(Meta Information)。
-
0008: 识别信息(时间、医院、厂家)。
-
0010: 患者信息。
-
0018: 采集参数(电压、厚度、核)。
-
0020: 关系/坐标信息(UID、切片位置)。
-
0028: 图像显示信息(宽高、像素间距、窗位)。
-
-
Element Number(元素号): 在该组内的具体编号。
16 进制表示: 这些数字都是 16 进制的(例如 000D 代表 13)。
DICOM 标签中通常包含如下信息:
1. 身份与索引标签 (Identity & Hierarchy)
医学影像数据本质上是:
Patient
└─ Study
└─ Series
└─ Instance (slice)
这些身份层级标签定义了数据在医学逻辑中的层级关系,是清洗时用于去重、聚合和建立数据库索引的关键。
- (0010, 0010) Patient’s Name: 患者姓名。真实研究数据通常需
de-identification,即删除:PatientName PatientBirthDate PatientAddress这些属于 PHI(Protected Health Information)。
-
(0010, 0020) Patient ID: 患者唯一识别码。
属于医院的内部编号,但不同医院的 Patient ID 可能重复。所以跨医院研究不能只依赖Patient ID 。 -
(0020, 000D) Study Instance UID: 检查唯一 ID(一次就诊产生一个)。例如 1.2.840.113619.2.55.3.604688435.783.1599123456.467 。全球唯一,每一次扫描都会生成 新的 Study UID。
- (0020, 000E) Series Instance UID: 最关键标签。代表一个连续的 3D 体素。这是最关键标签,因为一个 study 中会包含很多序列,比如:
Scout Calcium score CTA thin CTA thick Bone reconstruction MPR每一个 SeriesInstanceUID 对应一个重建序列。例如:
Series 1 : Scout 定位片,扫描前的定位图。是1-3张 slice,帮助医生定位扫描空间。分辨率很低,不能做 3D图像。 Series 2 : Calcium scoring 特殊的 CT 扫描序列,用于计算钙化评分,而不是血管造影。这也是一个 3D Volume,只能用于计算钙化评分,不注射对比剂成像,噪声低,分辨率低。 Series 3 : Coronary CTA thin slice 薄层(CTA) CTA 数据中最重要的序列 也就是增强CT 血管造影。扫描过程 注射碘对比剂 --> 心脏 CT 扫描 --> 血管显影。非常适合用于 AI 训练 Series 4 : CTA thick 厚层 CTA ,属于 CTA 的降采样版本。通常情况下,医生在临床检查时因为薄层噪声很大,所以会用厚层来降低噪声,提高对比度,但是细节会损失。AI 训练中通常只用thin。 Series 5: Bone reconstruction 骨重建。是同一 CT 数据使用不同的重建核生成的骨核图像,通常骨头边缘很清晰,的的但是噪声巨大。所以骨核图像 骨头很好看,但是血管很难看。在CTA任务中通常不使用。 Series 6:MPR 多平面重建。把 3D volume 投影到其他平面。原始的 CT 通常是横断面,但是医生经常看冠状面(正面照和背面照)和失状面(侧面照)。这通常是工作在站后处理的,在 AI 数据清洗中通常要删除。但是无法通过这个 ID 直接区分这将将几种数据,还需要使用后续的信息进行区分。
-
(0008, 103E) Series Description: 序列描述(例如 “Coronary CTA”),用于分拣数据类别。但这个字段因为不同的医院命名不同所以通常不可靠。
- (0008, 0018) SOP Instance UID: 每一张 slice 的唯一 ID。
-
(0008, 0060) Modality: 数据模态 CT/MR/XA等。
2. 几何与空间标签 (Geometry & Physics)
这些标签描述了切片在 3D 空间中的具体位置,直接决定了数据是否能进行 3D 重建或模型训练。
- (0028, 0010/0011) Rows & Columns: 影像尺寸(如 $512 \times 512$)。在清洗数据的过程中通常会用来
区分是定位图还是标准影像。例如定位图可能是($512 \times 1024$)。 - (0028, 0030) Pixel Spacing: $x, y$ 轴的像素物理间距。
- (0018, 0050) Slice Thickness: 名义上的切片厚度。
- (0020, 0032) Image Position (Patient): 切片左上角在空间坐标系中的三维坐标。清洗时通常用它计算实际 Z 轴间距。
- (0020, 0037) Image Orientation (Patient): 切片的方向余弦。决定了影像是横断位、冠状位还是矢状位。
3. 图像显示标签 (Presentation & Gray Value)
这些标签定义了如何将原始 CT 值(HU 值)映射为人类肉眼可见的灰度图。
- (0028, 1050) Window Center: 窗位,显示灰度范围的中心点 -> 决定图像整体“亮度”。
- (0028, 1051) Window Width: 窗宽,显示灰度范围的宽度 -> 决定图像“对比度”。对于 CTA,标准的显示通常是 $WW: 800$ / $WL: 300$。
- (0028, 1052) Rescale Intercept: 截距。
- (0028, 1053) Rescale Slope: 斜率。
- 注:原始存储的数据通常是 raw 值,转换公式为:$\text{HU} = \text{Pixel Value} \times \text{Slope} + \text{Intercept}$。
原始 CT 像素值 –(通过斜截公式)–> 转换成 HU –(通过窗位和窗宽)–> 再映射成灰度图
- (0028, 0004) Photometric Interpretation: 常见值:MONOCHROME1 / MONOCHROME2 表示灰度是否反转;CTA 标准:MONOCHROME2。如果是 MONOCHROME1则需要反转图像。
4. 设备与技术标签 (Acquisition & Technical)
描述了扫描时的物理参数,对于数据质量评价(Quality Assessment)至关重要。
- (0008, 0070) Manufacturer: 设备厂家(GE, Siemens 等)。
- (0018, 0060) KVP: 峰值电压(影响图像对比度)。
- (0018, 1151) X-Ray Tube Current: 管电流(影响噪声水平)。
- (0018, 1210) Convolution Kernel: 重构核。例如
B30f(平滑,适合血管)或B70f(锐利,适合看骨头但噪声大)。
5. 校验与元信息标签 (Meta Information)
这些标签通常位于文件的最头部(File Meta Elements),用于底层文件的读取。
- (0002, 0002) Media Storage SOP Class UID: 标识这是 CT 影像、还是结构化报告、还是二次截图。
- (0002, 0010) Transfer Syntax UID: 传输语法。定义了数据是否经过压缩(如 JPEG 无损压缩或 RLE 压缩)。如果清洗程序打不开某个文件,通常是这里的压缩格式不匹配。
数据清洗中的“黄金原则和准确步骤”
第一阶段:硬性排除(Hard Filtering)
首先通过元标签快速剔除绝对不符合要求的数据。
- Modality (0008, 0060): 必须为
CT。排除掉 XA(造影机截图)、SR(结构化报告)或 OT(其他)。 - SOP Class UID (0002, 0002): 必须是
CT Image Storage。排除掉 Secondary Capture(二次截图,通常是医生处理后的静态图,丢失了原始 HU 值)。 -
Image Orientation (0020, 0037): 这个轴角的格式为 [row_x, row_y, row_z, col_x, col_y, col_z],normal = cross(row_vector, col_vector),定义单位z轴 z_axis = [0, 0, 1],计算夹角cos_theta = dot(normal, z_axis)。判定条件为:cos_theta > 0.95;等价于夹角 θ < 18°。
- 理由: 原始扫描序列必须是轴位(Axial)。MPR(多平面重建)产生的冠状位或矢状位虽然也是 3D,但属于后处理数据,重采样过程会损失精度。
- Samples per Pixel (0028, 0002): 必须为
1。排除彩色截图。 - Series Instance UID (0020,000E): 用于唯一识别和去重序列。
- ECG Gating 信息: 通过有没有 ECG Gating 信息: (0018,1060) Trigger Time (0020,9241) Cardiac Number of Images (0018,1090) Cardiac Reconstruction ;三个部分判断是不是 CTA。
第二阶段:几何维度校验(Geometry Validation)
这是区分 Thin(薄层) 与 Scout(定位片)/ Thick(厚层) 的关键。
注意,在这个阶段要新先区分是 多帧 DICOM 还是 单帧 DICOM,如果是多帧,后续的所有计数文件数量的操作全都要换成 读取该文件的 pixel_array[] 。
- 切片数量 (Instance Count):
- Scout: 通常只有 1-3 张。
- CTA Thin: 冠脉扫描范围通常在 12-15cm,如果是 0.5mm-0.75mm 层厚,序列总张数通常在 200 - 450 张 之间。
- 判定公式: 序列张数需 $> 150$ 张,同时图像高宽应该相等。
- Slice Thickness (0018, 0050) & Spacing Between Slices:
- Thin 标准: 层厚应 $\le 0.75\text{mm}$(常见为 0.5mm, 0.625mm, 0.75mm)。
- Thick 标准: 通常 $\ge 2.0\text{mm}$。
- 注意: 不要只看
Slice Thickness,要计算相邻两张 Slice 的Image Position (0020, 0032)的 Z 轴差值,这才是真实的重建间距。 - 断层检查: 同时必须通过 Image Position (Patient) 提取序列中所有 Slice 的 $Z$ 坐标,按升序排列。
- 校验: 计算相邻切片间的间距 $\Delta z_i = \mid z_{i+1} - z_i\mid $。 * 判定:
- 各向同性/等间距性: 所有 $\Delta z_i$ 的标准差 $\sigma_{\Delta z}$ 应趋于 $0$(允许误差 $< 0.01\text{mm}$)。
- 空隙检测: 如果 $\max(\Delta z_i) > 2 \times \text{median}(\Delta z)$,说明该序列丢片或扫描范围不连续,必须剔除。
- 层厚判定: 最终以 $\text{median}(\Delta z)$ 作为重建层厚。对于 CTA,该值必须 $\le 0.75\text{mm}$。
第三阶段:图像质量与算法特征(Kernel & Contrast)
区分 CTA(增强) 与 Calcium Scoring(平扫) 及 Bone(骨重建)。
- Convolution Kernel (0018, 1210) - 核心判别点:
- CTA Thin: 需要软组织算法(Soft Kernel),如 GE 的
STANDARD、Siemens 的Bv36/B30f、Philips 的B/A。 - Bone: 算法非常锐利,如 Siemens 的
B70f/B80f。这种序列噪声极大,由于血管边界会被算法过度增强导致边缘伪影,必须剔除。
- CTA Thin: 需要软组织算法(Soft Kernel),如 GE 的
- Pixel Intensity (HU 值检测):
- CTA: 血管内注有对比剂,主动脉(Aorta)管腔内的平均 HU 值通常在 250 - 500 HU。
- Calcium Scoring: 血管内无对比剂,管腔 HU 值接近血液/肌肉(30 - 50 HU)。
- 处理建议: 对序列中间 1/3 的切片进行均值采样。判定: 中心区域 = [0.3H : 0.7H, 0.3W : 0.7W] 的平均 HU 值应 $> 250\text{HU}$。若 $< 150\text{HU}$,则判定为平扫(Plain Scan)。若 $> 200\text{HU}$,判定为增强期(Contrast Enhanced)。
阶段三:异常与冲突检测 (Conflict Detection)
针对复杂数据集,必须自动检测以下异常:
- 尺寸不一致 (Size Mismatch): 同一序列文件夹下,有的图是 $512 \times 512$,有的由于后期裁剪变成了 $512 \times 400$(你之前遇到的报错)。
- 空间不连续 (Slice Gaps): 检测相邻切片的间距是否恒定。不恒定的数据无法直接做 3D 卷积。
阶段四:记录必要的逻辑结构参数 (Result Persistence)
阶段二中分析得到的必要逻辑结构参数需要被记录
阶段五:清洗结果持久化 (Result Persistence)
最终生成的不是下游任务的输入,而是一份 “数据百科全书” 。
- Index File: 包含所有 UID 到物理路径的映射。
- Quality Report: 每例数据的评分(如:完整、丢帧、低分辨率)。
- Category Tagging: 最终将每一个文件夹定性。例如:
CTA-686例/1326842_CTA/S10-> [定位像];S40-> [薄层增强CTA]。