超声学习笔记

分割线

超声成像模式

内容来源: B站 - 超声视频中级

超声不是只有一种"拍片子", 不同模式解决不同问题. 了解这些基本概念后, 看 DICOM 文件时才能理解它存的是哪类数据.

模式全称原理简述典型用途
B-modeBrightness mode二维灰阶, 回波幅度用亮度表示常规解剖成像, 看结构形态
M-modeMotion mode单一声束线上随时间变化的位移曲线心脏瓣膜运动、室壁运动分析
Doppler多普勒血流成像检测红细胞散射的频移, 计算血流速度和方向血流速度测量、狭窄/反流评估
TDITissue Doppler Imaging低通滤波滤除高速血流, 保留低速组织(心肌)运动信号心肌运动速度、应变/应变率分析

B-mode

最基础的二维灰阶成像. 探头向体内发射超声波, 接收组织界面的回波, 按回波强度用不同灰度显示. 亮度高 = 回声强(如骨骼、钙化), 亮度低 = 回声弱(如血液、囊肿).

常说的"B超"就是这个模式. 腹部、产科、浅表器官检查都以 B-mode 为主.

M-mode

在 B-mode 图像上选定一条取样线, 记录该线上各点随时间运动的位移曲线. 横轴是时间, 纵轴是深度, 亮度表示回声强度.

时间分辨率极高, 是分析心脏瓣膜开放/关闭时序、室壁运动幅度的经典工具.

Doppler

利用多普勒效应: 超声遇到运动的红细胞时, 回波频率会发生偏移, 频移大小与血流速度成正比. 通过检测频移可以:

  • 判断血流方向 (朝向/远离探头)
  • 测量血流速度
  • 评估血管狭窄、瓣膜反流

TDI

组织多普勒成像 (Tissue Doppler Imaging) 是 Doppler 技术的变体. 普通彩色多普勒检测的是高速血流(红细胞运动), TDI 通过低通滤波器把高速血流信号滤掉, 只保留低速高振幅的组织运动信号(心肌).

临床应用:

  • 测量二尖瓣环/三尖瓣环组织速度 (e’, a’, s’)
  • 评估左室舒张功能 (E/e’ 比值)
  • 心脏再同步化治疗 (CRT) 的优化

TDI 有角度依赖性, 取样线需尽量与心肌运动方向平行. 新一代斑点追踪超声 (STE) 已部分取代 TDI, 但 TDI 因时间分辨率高、操作简便仍在临床广泛使用.

分割线

多部位对比的产品设计思路

看超声诊断时注意到几个实际需求, 记录一下:

1780814888801.png

1780814959315.png

一些诊断需要结合病史来看, 基础病会影响诊断结果.

1780814923226.png

很多诊断需要结合多部位, 有些病也需要其他检查来结合判断 (比如 CT).

1780814976057.png

很有使用价值的图, 我觉得这才是我们应该做的. 超声设备无法简单的做出这种界面, 我们很容易做出来, 又很有应用价值. 医生在分析和案例分享学习时, 能比 PDF/PPT 更高效.

1780814992274.png

切入邻床实际, 医生接到一位患者, 拿到病例表现, 去做部位检查. 因为涉及到多部位, 有需要频繁切换来对比观看, 超声机器上不方便. 他可能想要这么个界面: 多个部位对比着看, 左右点击一下就方便多部位参照.

分割线

DICOM 文件格式

文件结构

DICOM 文件包含两部分:

File Meta Header(文件头)
包括标识信息 (如 SOP Class、Transfer Syntax UID、创建时间等).

Data Set(数据集)
由一个个 Data Element(标签)组成, 比如:

标签含义
(0010,0010)PatientName
(0028,0010)Rows
(7FE0,0010)Pixel Data ← 真正的图像像素在这里!

按内容类型划分

类型含义Pixel Data 结构常见 SOP Class
单帧图像一张静态医学图像(如X光、CT单层)一帧像素矩阵e.g. CT Image Storage, MR Image Storage
多帧图像同一序列的多帧(可看作图像堆栈或短视频)多帧像素数组(帧数在 (0028,0008) Number of Frames)Enhanced MR Image Storage, Ultrasound Multi-frame Image Storage
视频(动态序列)超声、透视、内窥镜常见多帧像素序列,通常以时间轴索引Ultrasound Image Storage, Video Endoscopic Image Storage
多视频(多序列)某些设备一次扫描会输出多个 DICOM 序列文件夹,每个序列对应一个视频或体积每个序列一组帧多个 SOP Instance UID 不同
3D/体积数据CT、MRI 扫描生成的多切片组成三维体积每个切片一帧,按 Z 坐标排列Enhanced CT/MR Image Storage
结构化报告(DICOM SR)文本或标注信息,如测量值、病灶标注无像素数据Structured Report Storage
RT系列(放疗)包括结构集、剂量、计划等可混合使用图像与向量数据RT Structure Set Storage
场景DICOM 表现文件数量Pixel Data 特征
普通胸片单个 .dcm1单帧,2D 灰度
MRI 扫描(100层)100个 .dcm 或一个多帧 .dcm多个或1个每帧代表一个切片
超声动态视频1个 .dcm1多帧,含时间轴
超声多序列多个 .dcm 文件,每个一个视频序列多个每个有多帧
内窥镜或术中记录有时封装 MPEG-2 / H.264 视频流1个 .dcmPixel Data 中是压缩视频流

Pixel Data 编码方式

压缩方式含义示例
未压缩原始像素矩阵(Raw)常见于 CT、MR
JPEG / JPEG2000有损或无损压缩超声、CR、DR
MPEG-2 / H.264视频流压缩内窥镜、超声视频
RLE无损游程编码某些老设备

超声 DICOM 的特殊性

超声设备导出的 DICOM 有三种形态, 处理时必须先判断是哪种, 否则读图或转视频时会踩坑.

静态图像

医生按键冻结画面时, 设备保存的"单张截图", 用于测量、诊断、报告等场景.

属性示例
(0028,0008) Number of Frames不存在 或 值为 1
(7FE0,0010) Pixel Data单帧灰度或彩色图像
常见 SOP ClassUltrasound Image Storage (1.2.840.10008.5.1.4.1.1.6.1)

动态序列

超声扫描过程中记录的动态视频序列, 可用于回放或导出为 AVI/MP4.

实际就是时间轴连续的图片, 如需导出视频的话, 需要做编码转换 (有较大性能占用).

属性示例
(0028,0008) Number of Frames存在且 > 1(例如 120)
(0018,1063) Frame Time每帧间隔(单位 ms)
(7FE0,0010) Pixel Data多帧像素序列或视频流
常见 SOP ClassUltrasound Multi-frame Image Storage (1.2.840.10008.5.1.4.1.1.3.1)

视频流

一些高端设备(尤其是内窥或心超)还可能使用 MPEG-2 或 H.264 编码的视频流嵌入在 (7FE0,0010) 的 Pixel Data 中.

对应 SOP Class 例如: Video Ultrasound Image Storage (1.2.840.10008.5.1.4.1.1.6.2)

实际就是编码压缩过的多帧图像, 占用体积比多帧小很多, 本身就是视频所以可直接导出 (几乎无性能占用).

import pydicom

ds = pydicom.dcmread("example.dcm")

frames = getattr(ds, "NumberOfFrames", 1)
sop_class = ds.SOPClassUID

if frames == 1:
print("静态图像 DICOM")
elif "Video" in str(sop_class):
print("视频流 DICOM (MPEG/H.264)")
else:
print(f"多帧 DICOM ({frames} 帧)")

分割线

DICOM 导出与转换

标准导出层级

导出批次(Export Batch)
└─ 20251015_100893_0001_20251015_100047534
├─ 病人1(Patient 1
│ └─ Anonymous_0001
│ ├─ DICOMDIR
│ └─ DICOM
│ └─ PAT00001
│ ├─ STU00001 ← 第一次扫描 (Study)
│ │ ├─ SER00001 ← B 模序列 (Series)
│ │ │ ├─ I0000001 ← 单张图像 (Instance)
│ │ │ ├─ I0000002
│ │ │ └─ I0000003
│ │ └─ SER00002 ← 彩色血流序列
│ │ ├─ I0000001
│ │ └─ I0000002
│ └─ STU00002 ← 第二次扫描
│ └─ SER00001
│ ├─ I0000001
│ └─ I0000002

├─ 病人2(Patient 2
│ └─ Anonymous_0002
│ ├─ DICOMDIR
│ └─ DICOM
│ └─ PAT00002
│ ├─ STU00001
│ │ ├─ SER00001
│ │ │ ├─ I0000001
│ │ │ └─ I0000002
│ │ └─ SER00002
│ │ └─ I0000001
│ └─ STU00002
│ └─ SER00001
│ ├─ I0000001
│ └─ I0000002

└─ 病人3(Patient 3
└─ Anonymous_0003
├─ DICOMDIR
└─ DICOM
└─ PAT00003
└─ STU00001
└─ SER00001
├─ I0000001
├─ I0000002
└─ I0000003

层级关系: Patient → Study (一次检查) → Series (一个序列/模式) → Instance (单张图像/帧)

逸超设备导出格式

C:.
├─20251015_100893_0001_20251016_114732235 ← 患者ID_导出时间ID
│ └─Anonymous Anonymous Anonymous_20251015_100893_0001 ← 病人目录(患者级别)
│ │ DICOMDIR ← DICOM目录文件(索引)
│ └─DICOM
│ └─PAT00001 ← 病人ID(内部编号)
│ └─STU00001 ← Study(一次检查/研究)
│ ├─SER00001 ← Series(一次采集序列)
│ │ │ I0000001, I0000002 ← 图像帧(DICOM文件)
│ │ └─converted ← 转换后文件夹(MP4、JPG等)
│ ├─SER00002
│ └─SER00003

逸超设备会在每个 Series 下自动创建 converted 文件夹, 预转好 MP4/JPG, 方便非 DICOM 系统直接使用. 这点很贴心, 不用自己写脚本转视频了.

视频格式转换

格式编码方式特点推荐场景
MP4 (H.264)有损压缩通用、兼容性极高、文件小、质量较好✅ 推荐:用于展示、教学、科研报告等
AVI (无压缩或MJPEG)可无损文件大,但保真医学分析、算法训练前数据准备
MOV (H.264 / ProRes)有损或轻压缩苹果生态友好,质量高视频编辑、科研展示
MKV (H.264 / H.265)有损压缩可封装多通道音视频、元数据特殊研究项目
H.265 / HEVC有损高效压缩同质量体积更小,但编码慢长序列或云端传输

从 DICOM 多帧 Pixel Data 导出视频时, 要逐帧解码再编码, CPU 占用很高. 如果 DICOM 本身是视频流编码 (MPEG/H.264), 可以直接提取流封装到 MP4, 几乎零性能消耗.

分割线

医学影像标注

标注类型与格式

在医学影像中, 「标注(Annotation)」可能包含以下几种形式:

类型示例数据格式
像素级分割(Segmentation)器官或病灶maskDICOM SEG、NIfTI、PNG mask
二维标记(点/框/多边形)ROI、测量线、医生手动圈选DICOM Presentation State (PR)、私有JSON
结构化描述(诊断结论)“前列腺体积xxml,疑似病灶区域xx”DICOM SR(Structured Report)
AI推理结果模型输出mask、评分、概率通常自定义JSON + DICOM SEG
格式用途优点工具/库
DICOM SEG存储分割Mask标准化、兼容各厂商dcmqi, pydicom, dcm4che
DICOM SR (Structured Report)存储测量/文字诊断可机器解析、符合IHE标准highdicom, dcm4che
DICOM PR (Presentation State)存储显示用标注支持图形ROI,但非语义化dcm4che, pydicom
自定义 JSON 标注训练数据集常用简单灵活,非标准Python自定义
需求推荐格式生成方式解析方式
影像分割结果(AI/手动mask)DICOM SEGPython: highdicom / dcmqiJava: dcm4che-seg
定量测量、文字报告DICOM SRPython: highdicomJava: dcm4che-sr
仅内部使用训练标注JSON + mask 文件Python 自定义Java/Python 通用解析
目标推荐做法原因
构建标准化医学标注系统DICOM SR + SEG符合国际标准,方便医院/PACS对接
简单AI数据集标注JSON + NIfTI/PNG mask简单易操作
Java 环境dcm4che-sr / dcm4che-seg 解析与生成官方支持
Python 预处理或AIhighdicom / dcmqi社区主流

Python vs Java 标注生态对比

为什么不推荐"让 Java 来做标注生成"? 主要是以下几个现实原因:

  1. 标注生成往往依赖图像数据处理

    医学标注不仅是元信息写入, 还涉及像素、mask、坐标、图像空间映射. Java 没有成熟的医学影像处理库:

    • 没有 SimpleITK、nibabel、numpy
    • 坐标系、体素、spacing、affine matrix 等都需要自己实现
    • Python 则有成熟生态 (highdicom, SimpleITK, dcmqi), 能直接读写、变换、验证

    ✅ 在 Python: seg = highdicom.seg.Segmentation(...) 就能生成符合标准的 SEG 文件.
    ❌ 在 Java: 你得手工拼 DICOM dataset 结构, 几百行 XML 树状属性.

  2. DICOM SR 的语义编码复杂

    SR 文件需要使用标准化术语编码 (SNOMED CT、UCUM、LOINC). Python 的 highdicom.sr 封装了各种编码模板 (如 TID 1500、TID 300), 可直接使用. Java 的 dcm4che-sr 层次较低, 需要你手动创建 Attributes 树、填 CodeSequence, 非常繁琐.

    ✅ Python: MeasurementReport(...) 一行构建完整报告
    ❌ Java: 你得手工拼 ContentSequence、ValueType、ConceptNameCodeSequence、ConceptCodeSequence

  3. 医学标注多与 AI / 图像算法绑定

    实际上, 标注文件常来自 AI 推理结果或人工审阅系统. AI 推理 → 通常是 Python 环境 (PyTorch / MONAI). 标注后生成 DICOM SEG/SR → Python 一站式完成更自然. Java 若要参与标注生成, 反而要跨语言调用 Python 算法输出, 增加复杂度.

分割线

常见问题

为什么一个 Study 会有多个 Series

场景说明
不同成像模式比如 B 模、彩色多普勒(CFM)、脉冲多普勒(PW)、M 模等。每种模式会生成一个独立的 Series。
不同探头如果在同一次检查中切换了探头(如腹部探头、腔内探头),也会分成不同 Series。
静态图像 vs 动态视频一些超声仪器会把保存的"视频片段"和"静态截图"分别保存为独立 Series。
参数变化比如改变了深度、焦点、增益或测量设置后,设备可能重新开始一个 Series。
复合图像或测量图测量报告图(带测量线的图像)或复合模式(Compound Imaging)也可能单独作为 Series。

分割线

借物表