影览知微

技术恢复教程

DICOM 编码级恢复实战:从误删恢复文件到可验证影像

本文教你保护证据、区分故障、验证文件结构、提取已确认边界的候选对象,并为完整可解码影像生成兼容副本。真正的磁盘碎片重组仍需要文件系统记录或其他可靠证据;不能用一个万能脚本代替这些证据。

云影像下载 · 更新于

1. 为什么通用恢复工具找回 DCM 后仍可能打不开?

通用恢复软件可以正确恢复 DICOM。只要文件分配信息和原数据仍然完整,就可能恢复出原文件。

需要区分三个层次:

层次主要解决什么尚不能单独证明什么
文件系统恢复根据目录项、MFT 等分配记录找回文件的原始数据块数据块是否被覆盖,影像是否仍有正确内容
内容雕刻(carving)在数据区寻找文件特征,再推断范围非连续碎片的实际顺序、完整对象的边界
DICOM 验证与修复检查元信息、编码、像素、身份和序列,处理有依据的异常无副本且已消失的字节不能由格式修复生成

例如 PhotoRec 使用文件签名寻找内容,其文档明确说明:部分格式无法从头部确定大小,需要依靠后续特征决定停止位置。 DICOM 的额外难点包括:

  1. 文件名和大小还在,原数据可能已变化。旧目录记录并不证明相应磁盘区域仍保存原内容。
  2. 碎片不一定连续。按连续扇区导出,可能少取一段或混入其他文件;具备有效文件系统分配记录的工具则可能正确重组。
  3. DICOM 没有适用于所有对象的简单“起始标记到结束标记”切割规则。长度字段、嵌套序列和压缩片段共同决定解析边界。
  4. 同一个恢复文件里可能夹着多个真实对象。有些完整影像可以提取,外层文件本身却不是一份完整 DICOM。
  5. 压缩支持不足会被误认为损坏。没有 JPEG 2000 等解码插件,不能直接得出“像素已丢失”的结论。
  6. 一个文件可以含多帧,一次检查也可能包含多个序列。找回文件数量、看到第一张图,都不足以证明整套完整。

Decompress 之类的目录名只是线索,可以据此寻找压缩原件、解压副本或工作站缓存;不能凭名字断言覆盖原因。SSD 的 TRIM 表示释放区域通知,也不能仅凭当前设置推断某个文件是否已实际清除。

2. 保护原盘和恢复证据

停止向源盘写入。保留原盘、全部恢复目录、恢复软件项目与日志、目录信息和扫描映射。需要镜像时,应覆盖整个目标磁盘或完整分区的扇区范围,包括可能存有删除文件残留的未分配区域,而不是只复制当前使用中的文件。

Linux 镜像示例仅供熟悉磁盘操作的读者参考,本教程没有在你的真实磁盘上执行这些命令。先确认型号、容量和序列号,卸载源盘的所有分区;目标目录必须在另一块健康物理盘上,并使用本次新建的文件名。

lsblk -o NAME,SIZE,MODEL,SERIAL,TYPE,MOUNTPOINTS,RO

# 将源盘占位路径替换为已经核对的真实设备;目标必须在另一块盘。
sudo ddrescue --ask --no-scrape --retry-passes=0 \
  /dev/disk/by-id/REPLACE_WITH_SOURCE_ID \
  /mnt/OTHER_DISK/recovery/source.img \
  /mnt/OTHER_DISK/recovery/source.map

source.map 记录哪些区域读到了、哪些还未读取或读取失败,须与镜像一起保存。镜像中的零值可能来自未读区域或空洞,不能脱离 mapfile 将其当成真实原始像素。以上是首轮读取示例;已有异响、掉盘或持续读错的设备,应先评估物理读取风险,不反复盲扫。

Windows 用户可使用另一台电脑或 Live USB 制作镜像,不把工具安装到待恢复的系统盘。本文不提供修复源盘文件系统、格式化或补写源盘的操作。

3. 在只读副本上检查恢复文件

先记录文件大小、哈希、来源路径和恢复偏移,再检查 Part 10 文件封装、DICM 标记、文件元信息、传输语法 UID、SOP 标识及数据元素边界。发现标记不代表文件完整;所有操作都在副本上进行。

4. 区分解码兼容与真实缺损

核对行列数、像素位深、帧数、Pixel Data 长度与传输语法。JPEG/JPEG 2000 封装数据还需核对片段和帧边界。优先用独立解码器验证,不能把缺少解码插件直接判为像素丢失。

5. 定位并提取可确认的对象

在错位或混杂文件中,可结合签名、合理的数据元素结构及文件系统记录寻找候选对象。对象边界必须有可靠证据,不能简单按下一个 DICM 标记切割。只提取已确认的范围,保留来源位置和校验记录。

6. 依据证据修复结构与编码

数据集完整但封装缺失时,可在传输语法和 SOP 身份已确认的前提下重建 Part 10 封装。压缩影像能完整解码时,可生成未压缩兼容副本并逐像素核验。不能虚构缺失像素、患者身份、切片位置或编码参数。

7. 验证整套检查

逐张重新读取并解码,比较转换前后的像素与关键元数据;按检查和序列 UID 分组,核对空间几何、重复与缺片,并尽量对照原设备或 PACS 清单。部分恢复必须明确标注。

8. 分组、去重与整套检查核验

以 StudyInstanceUID、SeriesInstanceUID 为基础分组,同时核对身份和来源。PatientID 要结合发行方或来源系统理解,姓名与文件夹名不是唯一身份依据。

相同 SOP Instance UID 的对象应比较字节、解码像素和关键元数据:不同编码可以产生不同文件字节;如果像素、身份或几何发生冲突,必须隔离报告,不能静默覆盖。

对于同方向、普通单帧空间切片,可用方向与位置排序:

normal = np.cross(iop[:3], iop[3:])
position_on_normal = np.dot(normal, ipp)

该计算不适用于所有序列的简单合并。动态、多时相、不同回波、不同方向或增强多帧影像还要检查维度及逐帧信息;相同空间位置不一定是重复切片。编号连续也不证明所有序列齐全,最后应与原设备/PACS 清单对照。

逐张解码后,还需抽查代表性切片、相邻连续性及三平面显示,寻找不合理跳变或替换内容;观察正常仍不替代原始清单和来源核验。

9. 整理目录与交付

完整通过的对象、部分提取对象和待复核对象分别记录。使用 DICOMDIR 时,可以用 pydicom 的 FileSet 构建目录,并重新读取目录检查每个引用是否存在。

如果所需身份或目录字段缺失,先解决证据问题,不能为了生成目录而虚构患者信息。缺片清单、源文件到输出映射、转换方式和校验结果应随包交付。ZIP CRC 用于验证归档内容,不能代替 DICOM 或像素核验。

标准目录结构也不等于通过了全部 IOD 或媒体应用配置的符合性验证。仍有元数据问题时必须说明。