亨斯菲尔德单位可以转移吗?
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:
- 寡妇中心:-600
- Window宽度:1600
- 重新缩放截距:-1024
- 最小值:-1024
- 最大值:+4095
我正在使用函数 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 切片。
我正在从 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:
- 寡妇中心:-600
- Window宽度:1600
- 重新缩放截距:-1024
- 最小值:-1024
- 最大值:+4095
我正在使用函数 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 切片。