CT原理

了解了一下CT成像的原理。

通俗解释:像“切面包”一样看透身体

CT的全称是电子计算机断层扫描(Computed Tomography)。

要理解CT,可以先从普通X光说起。X光片就像把人体“压扁”了拍一张照片——骨头、器官、血管全部重叠在一起,很多细节看不清楚。而CT则完全不同:它让X射线管围绕人体旋转,从无数个角度发射X射线进行扫描,对面还有一排探测器负责接收穿过人体后的X光信号。

最形象的比喻是切面包:普通X光片是把整个面包压扁了看,而CT则是把面包切成无数薄片,逐片观察内部的每一处细节。无论是面包里的坚果、空洞,还是质地的细微变化,都能清晰呈现。CT最终得到的是一系列横断面图像(就像一片片面包切片),医生可以一层一层地观察,甚至还能通过计算机后处理技术重建出三维立体图像。

CT片子上黑白灰度的差异,反映的是不同组织对X射线吸收能力的差异:骨骼密度高,吸收大量X射线,呈白色;肺部充满空气,几乎不吸收X射线,呈黑色;肌肉、内脏等软组织介于两者之间,呈现不同深浅的灰色。

简单来说,CT的流程就是:X射线从多个角度穿透人体 → 探测器接收信号 → 计算机处理数据 → 重建出断层图像。


专业解释

CT成像是一个融合物理学与数学的精密过程。

一、物理学原理:X射线的衰减

CT的物理基础是比尔-朗伯定律(Beer-Lambert Law),即X射线在穿过物质时会发生衰减。

当一束单色X射线穿过一个均匀介质时,其出射强度与入射强度的关系为:

\[ I = I₀ · e^{(-μd)} \]

其中: - I₀ 为入射X射线强度 - I 为出射X射线强度 - μ 为该物质的线性衰减系数(与物质密度、原子序数等因素有关) - d 为X射线穿过的厚度

人体并非均匀介质,而是由骨骼、肌肉、脂肪、空腔等不同组织构成,每种组织都有不同的μ值。当X射线沿某一路径穿过人体时,总衰减是路径上所有组织衰减的累加。探测器记录下穿出人体后的X射线强度,就能反推出路径上组织的密度信息。

为了标准化不同组织的密度表达,CT采用CT值(Hounsfield Unit,亨氏单位)。CT值以水的衰减系数为基准:

\[ \text{CT值} = [(μ_{组织} - μ_水) / μ_水] × 1000 \]

在这个标尺上,水的CT值为0,空气约为-1000,骨骼约为+1000。这一标准化尺度使得不同设备、不同时间的CT图像具有可比性。

二、数学原理:图像重建

CT的核心数学问题可以追溯到1917年数学家拉东(J. Radon)证明的理论:任何物体都可以从其投影的无限集合来重建其图像。

具体而言:

1. 数据采集(投影)

X射线管围绕人体旋转,从多个角度(通常为360°或180°以上)发射X射线。探测器记录下每个角度下X射线穿透人体后的强度数据。这些数据被称为投影数据(或正弦图)。之所以必须旋转采集,是因为单次照射只能得到一个方向上的平均衰减信息,无法区分不同组织的具体位置;只有从多个角度获取投影数据,才能唯一确定人体内部各点的衰减系数分布。

2. 图像重建(数学反演)

采集到的投影数据需要经过重建算法才能转化为断层图像。主流重建算法主要有两类:

  • 滤波反投影(Filtered Back Projection, FBP):这是目前最经典、应用最广泛的重建算法。其数学基础是傅里叶切片定理——一维投影的傅里叶变换等同于二维图像傅里叶变换的一个“中心切片”。简单来说,FBP先将各角度投影数据进行滤波(以消除直接反投影带来的模糊效应),再将滤波后的数据沿原路径“反投”回图像空间,所有角度的反投影叠加后即得到断层图像。

  • 迭代重建(Iterative Reconstruction):这是一种更现代的方法,将成像过程建模为求解大型方程组的优化问题。它通过不断迭代修正重建图像,使其投影与实测投影尽可能一致。迭代算法在处理低剂量扫描、数据不完备等情况时表现更优,能在抑制噪声的同时保持图像边缘清晰。

3. 图像显示

重建后的数字图像经由监视器显示出来,也可通过激光相机打印成胶片,或存储在磁盘、光盘等介质上。

三、技术演进

现代CT已从最初的单排探测器、数分钟扫描,发展到多排螺旋CT、双源CT,扫描速度达到亚秒级,图像分辨率达到毫米级。更前沿的能谱CT(如双能CT、光子计数CT)还能分辨不同能量的X射线,实现物质成分的精确分离,从传统的“灰度图”向“彩色”定量分析迈进。

影响CT成像的参数

这些参数会直接决定你手中图像的像素值(CT值)、噪声水平、分辨率以及伪影情况,进而影响分割算法的准确性。

这些参数主要可以分为扫描采集参数、图像重建参数和患者/环境相关参数三大类。

1. 扫描采集参数 (影响原始数据)

这部分参数在扫描时设定,决定了原始数据的“原料”质量。

  • 管电压 (Tube Voltage, kVp):决定了X射线的“穿透力”。
    • 影响:kVp越高,射线穿透力越强,图像噪声降低,但软组织对比度下降;反之,低kVp能增强碘对比剂的显影效果(CT值更高),但会显著增加图像噪声和射线束硬化伪影的风险。
    • 分割影响:直接影响不同组织的CT值,可能导致基于阈值的分割算法失效。
  • 管电流 (Tube Current, mAs):决定了X射线的“强度”或“量”。
    • 影响:mAs越高,图像噪声越低,信噪比越好,但患者辐射剂量也越大。它是影响图像噪声最直接的因素之一。
    • 分割影响:低剂量(低mAs)扫描产生的高噪声图像会严重影响分割算法的性能,尤其是对边缘的检测。
  • 螺距 (Pitch):在螺旋CT中,指床移动速度与扫描层厚的比值。
    • 影响:螺距增大,扫描速度加快,覆盖范围更广,但图像噪声增加,纵向分辨率(Z轴)降低。
    • 分割影响:影响三维分割时体素在Z轴方向上的各向同性和连续性。
  • 扫描视野 (Scan Field of View, SFOV): X射线实际照射的范围。
    • 影响:决定了能被重建出来的最大解剖范围。如果患者体型超出SFOV,会导致截断伪影(Truncation Artifact)。
    • 分割影响:截断伪影会扭曲图像边缘,影响目标器官的完整分割。
  • 旋转时间 (Gantry Rotation Time):X射线管绕人体旋转一圈所需的时间。
    • 影响:时间越短,时间分辨率越高,对减少运动伪影(如心脏、呼吸)越有利。
    • 分割影响:运动伪影是分割算法的一大挑战,会造成边缘模糊和形状失真。
  • 探测器准直 (Detector Collimation):决定了Z轴方向上探测器的有效宽度。
    • 影响:准直越窄,Z轴分辨率越高,但覆盖范围变小,噪声可能增加。
    • 分割影响:直接决定了原始数据在Z轴上的分辨率极限。

2. 图像重建参数 (影响最终图像)

这部分参数在扫描后将原始数据“计算”成我们看到的图像,是影响分割结果的核心因素。

  • 重建算法 (Reconstruction Algorithm):最重要的参数之一。
    • 滤波反投影 (FBP):传统经典算法,速度快,但对噪声敏感。
    • 迭代重建 (IR):现代算法,能在低剂量下显著降低噪声,提高图像质量,但可能改变图像的纹理特征(“塑料感”)。
    • 分割影响:不同算法产生的图像纹理和噪声特征不同,分割模型(尤其是基于深度学习的)在一种算法上训练后,在另一种算法上性能可能下降。
  • 重建核 (Reconstruction Kernel):一种数学滤波器,用于控制图像的平滑度和锐利度。
    • 影响:软组织核(平滑):噪声低,图像平滑,适合观察软组织。骨核/锐利核(锐利):噪声高,边缘清晰,适合观察骨骼或高对比度结构。
    • 分割影响:直接影响边缘检测和分割精度。锐利核有助于分割精细结构,但也会放大噪声。
  • 层厚 (Slice Thickness):重建出的每一层图像的厚度。
    • 影响:层厚越薄,空间分辨率(尤其在Z轴)越高,能显示更精细的结构,但图像噪声会增加。
    • 分割影响:非常关键。薄层图像能提供更精确的边界信息,有利于三维重建,但噪声也更高。厚层图像则可能因部分容积效应(一个体素内包含多种组织)导致边界模糊和CT值不准。
  • 重建视野 (Reconstruction Field of View, DFOV):最终图像所显示的正方形区域的大小。
    • 影响:DFOV越小,像素尺寸越小,平面内空间分辨率越高,但前提是矩阵大小不变。
    • 分割影响:更高的空间分辨率有助于分割小病灶或精细解剖结构。
  • 重建矩阵 (Reconstruction Matrix):构成图像的像素网格,通常是512x512。
    • 影响:矩阵越大(如1024x1024),像素越小,空间分辨率越高。
    • 分割影响:与DFOV共同决定了像素的实际大小,影响分割的精细度。

3. 患者及环境相关因素

  • 患者体型与摆位:体型影响X射线的衰减。患者未置于扫描中心可能导致图像质量不均。
  • 运动:患者的呼吸、心跳、肠道蠕动等生理运动是产生运动伪影的主要原因。
  • 对比剂 (Contrast Medium):用于增强特定组织(如血管)的显示。
    • 影响:注射碘对比剂后,血管和富血供组织的CT值会显著升高。
    • 分割影响:使用对比剂与否,同一组织的CT值会完全不同,这会导致基于CT值阈值的分割方法完全失效。在分割前必须明确数据是否使用了对比剂。

总结与建议

对于一个图像分割任务,建议你:

  1. 记录元数据:在开始处理前,务必从DICOM文件中提取并记录所有关键参数,如kVp, mAs, Slice Thickness, Reconstruction Kernel, Contrast/Bolus Agent等。这是后续分析和模型泛化的基础。
  2. 保持一致性:如果可能,尽量使用同一台设备、相同的扫描协议和重建参数采集的数据来训练和测试你的分割模型,以消除参数差异带来的影响。
  3. 关注核心参数:在参数不一致时,需特别关注重建核、层厚和是否使用对比剂这三个对分割结果影响最大的因素。你的分割算法应具备应对这些变化的鲁棒性,或在预处理阶段进行标准化。

查看 nii.gz 格式CT图像尺寸

安装包如下

1
2
# pip install SimpleITK
conda install -c conda-forge simpleitk

代码如下,分别为shape(体素个数) 和 单个体素的尺寸

1
2
3
4
5
import SimpleITK as sitk

img = sitk.ReadImage("ct.nii.gz")
print("Size:", img.GetSize()) # (X, Y, Z)
print("Spacing:", img.GetSpacing()) # (x, y, z) mm

示例如下

1
2
3
4
5
6
7
8
9
10
In [1]: import SimpleITK as sitk

In [2]: img = sitk.ReadImage("0.nii.gz")

In [3]: print("Size:", img.GetSize())
Size: (138, 138, 216)

In [4]: print("Spacing:", img.GetSpacing())
Spacing: (0.5859379768371582, 0.5859379768371582, 0.5859379768371582)

查看CT值的取值范围,看看有没有被改动

1
2
arr = sitk.GetArrayFromImage(img)
print(arr.min(), arr.max())

如果看到数值在 -1200 ~ 3000,基本可以确定是 HU。

4️⃣ 什么情况下数组不是原始 CT 值?

有些公开数据集或预处理脚本会提前做:

  • 窗宽窗位裁剪(Windowing)

    比如只保留 [-1000, 400](肺窗)

  • 归一化

    缩放到 [0, 1] 或 [-1, 1]

  • 偏移校正

    加 1024 避免负数(变成 0~2000)

参考资料

  1. https://www.bohrium.com/sciencepedia/feynman/radiomics_undergraduate-computed_tomography_principles
  2. https://www.bilibili.com/video/BV1dh4y1D7M1/?vd_source=584d44ba7fed271fb82848e7894a53c8
  3. https://www.bilibili.com/video/BV1Bcm7BaEyv/?vd_source=584d44ba7fed271fb82848e7894a53c8
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2019-2026 Vincere Zhou
  • 访问人数: | 浏览次数:

请我喝杯茶吧~

支付宝
微信