霍恩斯菲尔德部队可以转移吗?

时间:2019-06-18 18:55:40

标签: matlab image-processing dicom

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

  

每个肺部CT扫描的HU值范围为+2000至-2000HU。肺区域是从-1000到-450HU的低密度区域,称为非身体区域。

我为此目的使用Matlab,我的扫描范围不同,问题是,没有一个肺区域的范围在(-1000到-450HU)之间(或者至少据我所知) ,除边缘区域(扫描仪产生的区域)以外,所有区域范围都在0以上且

如何使那些扫描具有正常范围(移动hounsfield单位或其他),以使我的肺部窗口(宽度为1500,中心为-500)正常工作?

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

  • 寡妇中心:-600
  • 窗口宽度: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));

enter image description here enter image description here

2 个答案:

答案 0 :(得分:2)

从直方图看,函数dicomreadVolume()似乎没有考虑“重新缩放斜率”和“重新缩放拦截”。我假设图像的像素表示形式(0028,0103)为0(=无符号整数)。

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

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

我强烈建议您采用这种方式,而不是将范围从一个特定图像中获取某个随机值。这是因为HU在扫描的所有图像中均有效。

答案 1 :(得分:1)

除了 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 切片上。