亨斯菲尔德单位可以转移吗?

Can Hounsfield Units be shifted?

我正在从 LIDC 数据库中进行一些胸部扫描,我正在尝试对它们应用迭代(最佳)阈值以提取肺部区域。 尽管许多研究人员使用相同的数据库,但他们使用初始阈值(或大约 -500)。 我引用

The HU values in each Lung CT scan range from +2000 to -2000HU. The lung area is a low density area ranging from -1000 to -450HU, called non-body area.

我为此目的使用 Matlab,我的扫描有不同的范围,问题是,没有一个的肺面积在(-1000 到 -450HU)范围内(或至少在我的范围内)知道),所有区域范围都是从0到0以上除了边缘区域(扫描机产生的区域)。

如何使这些扫描具有正常范围(移动 hounsfield 单位或其他东西)以便我在 window 的肺(宽度为 1500,中心为 -500)下正常工作?

扫描示例: Here's a Dicom slice with the properties below:

我正在使用函数 dicomreadVolume 读取扫描:

% Read the scan volume: (the result will be in 4D )
[V,s,d] = dicomreadVolume(fullfile('scan folder...'));

% Convert into 3D:
V2 = squeeze(V);

% display the slice number 83
imtool(V2(:, :, 83));

查看直方图,函数 dicomreadVolume() 似乎没有考虑 Rescale Slope 和 Rescale Intercept。我假设图像的像素表示 (0028, 0103) 为 0(= 无符号整数)。

所以实际上,您不是在 Matlab 中处理 HU,而是在处理原始像素值。向 HU 的变换是通过对每个像素应用线性变换来实现的。线性变换由 Rescale Intercept (0028,1052) 和 Rescale Slope (0028,1053) 定义:

<pixel value in HU> := RescaleIntercept + RescaleSlope * <untransformed pixel value> 

我强烈建议采用这种方式,而不是通过从特定图像获得的某个随机值来移动范围。这是因为 HU 在扫描的所有图像中都有效。

添加到 kritzel_sw 的答案中,您可以使用 dicominfo 函数访问 MATLAB 中的任何重新缩放斜率和重新缩放截距,该函数提供对大多数 dicom 标签的访问:

files = fullfile('scan folder...')

% Read all meta information (dicom tags)
metaInfo = dicominfo(files{1});

% Read the scan volume: (the result will be in 4D )
[V,s,d] = dicomreadVolume();
V = metaInfo.RescaleIntercept + metaInfo.RescaleSlope * squeeze(V); 

这将正确地重新缩放像素值。对于一致的 dicom 堆栈,重新缩放截距和斜率应该相同,但是如果您想确保可以遍历所有切片(文件)并比较值或将它们应用于体积 V 的相应 z 切片。