我正在做一些来自LIDC数据库的胸部扫描,我正在尝试应用迭代(最优)阈值来提取肺部区域。许多研究人员使用的初始阈值为(或-500左右),尽管他们使用的是相同的数据库。我引用
每次肺CT扫描的HU值为+2000 ~-2000 HU。肺区是一个低密度区域,范围从-1000到-450 to,称为非身体区。
为此,我正在使用Matlab,我的扫描有不同的范围,问题是,它们中没有一个肺面积在(-1000到-450 the )范围内(或者至少据我所知),所有的区域范围都是从0到以上,除了边缘区域(扫描机产生的区域)。
如何使这些扫描有正常范围(移动hounsfield单位或其他东西),使我能够正常工作在一个肺窗口(宽度为1500,中心为-500)?
扫描示例:下面是一个Dicom片段,其属性如下:
我使用函数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));


发布于 2019-06-19 11:38:11
从直方图来看,函数dicomreadVolume()似乎没有考虑渐升斜率和渐强拦截。我假设图像的像素表示(0028,0103)是0 (=无符号整数)。
所以实际上,你不是在Matlab中处理HU,而是处理原始像素值。通过对每个像素进行线性变换,实现了对HU的变换。线性变换由Rescale Intercept (0028,1052)和Rescale斜率(0028,1053)定义:
<pixel value in HU> := RescaleIntercept + RescaleSlope * <untransformed pixel value> 我强烈建议这样做,而不是用从某一特定图像中获得的随机值来改变范围。这是因为HU在扫描的所有图像上都是有效的。
发布于 2021-01-14 11:38:50
除了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堆栈,rescale截取和斜率应该是相同的,但是如果您想确保可以遍历所有的切片(文件)并比较这些值,或者将它们应用于卷V的对应z片。
https://stackoverflow.com/questions/56655398
复制相似问题