我正在从LIDC数据库中进行一些胸部扫描,我正在尝试对它们进行迭代(最佳)阈值提取肺区域。 尽管他们使用相同的数据库,但许多研究人员使用的初始阈值(或大约-500)。 我引用
每个肺部CT扫描的HU值范围为+2000至-2000HU。肺区域是从-1000到-450HU的低密度区域,称为非身体区域。
我为此目的使用Matlab,我的扫描范围不同,问题是,没有一个肺区域的范围在(-1000到-450HU)之间(或者至少据我所知) ,除边缘区域(扫描仪产生的区域)以外,所有区域范围都在0以上且。
如何使那些扫描具有正常范围(移动hounsfield单位或其他),以使我的肺部窗口(宽度为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));
答案 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 切片上。>