问题描述
我有 CT 扫描图像,我想使用 python 或 MATLAB 从中仅提取(分割)肺部部分。
解决方法
在 MATLAB 中对我有用的解决方案是 Hill Climbing algorithm。这是MATLAB implementation。它使用无监督机器学习算法:k-means。您将需要根据您的要求试验不同数量的段。请参见下面的示例:
从 MATLAB Central 下载上述代码(文件 HillClimbingSegment.m
和 RGB2Lab.m
)并将其放置在您的工作区中。然后你可以像这样分段:
image_path = 'CT.jpg';
segmented_img = HillClimbingSegment(image_path,4);
其中第二行 (4
) 中的第二个参数是所需段的数量。
在我的图像中,仅使用 4 个片段,可以观察到右肺的异常,但右肺顶部的另一个器官与肺合并。使用7段,将其分开。使用 7-9 段可提供最佳视图。超过 9 会导致混乱。
,我建议您将 png 转换为 NIfTI 文件 (nii),然后使用 python。 对于转换,您可以使用它:Convert .png files to .nii (NiFti files)
之后就可以加载图片使用了
nii = nibabel.load(path to the nifti file)
获取 numpy 数组
np_array = nii.get_fdata()
通过 -500 到 2000 之间的过滤器阈值从 nifti 文件中分割所有正文。 身体内外的所有空气都会被1-身体分割。
然后取最大的连通分量,将其从segmentation(也就是比肺大的外界空气)中去掉
air_seg = skimage.measure.label(air_seg)
largest_connected_air = air_seg == numpy.argmax(nump.bincount(air_seg.flat)[1:]) + 1
现在再做一次取肺。 这是我得到的:
如果您需要更多解释,请回复。