基于LIDC-IDRI肺结节肺癌数据集的放射组学机器学习分类良性和恶性肺癌(Python 全代码)全流程解析 (一)
+ [1.2 图像标注信息预处理-(读取肺结节是良性还是恶性)](#12__109)
+ [1.2 肺结节图像切片处理处理-(切片并保存)](#12__125)
+ [1.3 总结](#13__140)
1 LIDC-IDRI数据集介绍
LIDC-IDRI作为医学影像分析领域的重要公开数据集,在该领域具有不可替代的作用。它包含了来自低剂量CT扫描的1010例患者数据以及经人工标注确认的肺部结节信息。这些高质量的数据对于实现肺癌早期检测及算法优化发挥着关键作用。由美国国立卫生研究机构(NIH)资助支持的研究团队已经利用该数据库取得了显著成果,并将研究成果广泛应用于临床实践。
该数据库不仅为研究人员提供了丰富的学习资源,在提升医学影像处理技术和人工智能诊断能力方面也发挥了重要作用。
具体而言:
- 数据集大小达到了133GB
- 完整性和准确性得到了严格保证
- 下载过程需确保安装正确并拥有稳定的网络环境
- 遇到下载问题的朋友可联系我咨询
- 我已提供所需资源包以供获取

1.1数据集预处理
该数据集的预处理主要包含三个步骤:首先是图像归一化过程的设计与实现, 其次是完成肺结节感兴趣区域的精准定位, 最后是对良恶性肺结节进行分类标记. LIDC-IDRI数据结构如下:

1.1.1 图像读取-(python库pylidc安装)
在图像预处理阶段进行操作时,无需自行编写代码来解析所有文件。已有的现成免费Python库(如pylidc)专门用于解析数据集。安装该库的具体步骤如下:打开anaconda prompt窗口输入

pip install pylidc
注意在安装完该库后,需要在系统用户文件夹下,新建pylidc.conf文件,为该库的运行指明文件存放的位置。
[dicom]
path = G:\dataset_zhang\LIDC-IDRI
将以上路径修改为数据集存放的路径。
测试该库是否安装成功代码如下:
import pylidc as pl
from pylidc.utils import consensus
import os
dataset_path = r'G:\dataset\_zhang\LIDC-IDRI\ '#修改路径哦
dicom_name = 'LIDC-IDRI-0001'
PathDicom = os.path.join(example) # 构建当前病例文件夹的完整路径
# 查询当前病例的扫描数据,并将第一个扫描结果存储到scan变量中
scan = pl.query(pl.Scan).filter(pl.Scan.patient_id == example).first()
print(scan)
1.1.2图像读取-(读取CT图像的patch和分割标注)
我们选取了LIDC-IDRI-0001病例的数据样本作为研究对象,并通过pylidc库实现按文件夹名称自动查找对应的数据集。随后将所有相关数据存储到scan变量中以便后续处理工作开展。接着我们从医学影像专家那里获取了每个切片图像的空间定位信息以及对应的肺结节中心位置坐标信息并将其整合到数据库系统中完成初步的数据清洗工作。对于单个病例而言,默认情况下我们仅提取最大的或最显著的一个肺结节进行分析处理以减少计算复杂度并提高分析效率。为了直观展示各切片之间的空间分布关系我们采用matplotlib模块中的plt模块绘制图形用于展示
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as manim
from skimage.measure import find_contours
import cv2
import pylidc as pl
from pylidc.utils import consensus
import os
dataset_path = r'G:\dataset\_zhang\LIDC-IDRI\ '
dicom_name = 'LIDC-IDRI-0001'
print(dicom_name) # 打印当前DICOM文件夹的名称
PathDicom = os.path.join(dataset_path, dicom_name) # 构建当前DICOM文件夹的完整路径
# 查询当前病例的扫描数据,并将第一个扫描结果存储到scan变量中
scan = pl.query(pl.Scan).filter(pl.Scan.patient_id == dicom_name).first()
vol = scan.to_volume()# 将该扫描数据转换成数组形式的体积(volume)
# 聚类注释(nodule annotations)以获取一组注释
nods = scan.cluster_annotations()
try:
anns = nods[0] # 尝试获取第一个注释(annotation)
Malignancy = anns[0].Malignancy # 获取注释中的恶性程度(Malignancy)信息
except IndexError:
# 如果没有注释,或者无法获取第一个注释,则继续下一个DICOM文件夹
continue
# 执行共识合并(consensus consolidation)和50%的一致性水平(agreement level)。
# 我们在切片周围添加填充以提供上下文以进行查看。
cmask, cbbox, masks = consensus(anns, clevel=0.5, pad=[(0,0), (7,7), (20,20)])
# 提取相应的切片进行可视化
image = vol[cbbox]
k = int(0.5 \* (cbbox[2].stop - cbbox[2].start))
fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.imshow(vol[cbbox][:, :, k], cmap=plt.cm.gray, alpha=1)
# 标记不同注释的边界
colors = ['r', 'g', 'b', 'y']
for j in range(len(masks)):
for c in find_contours(masks[j][:, :, k].astype(float), 0.5):
label = "Annotation %d" % (j+1)
plt.plot(c[:, 1], c[:, 0], colors[j], label=label)
# 绘制50%共识轮廓线
for c in find_contours(cmask[:, :, k].astype(float), 0.5):
plt.plot(c[:, 1], c[:, 0], '--k', label='50% Consensus')
ax.axis('off') # 关闭坐标轴
ax.legend() # 显示图例
plt.tight_layout() # 调整布局以适应图像
plt.show() # 显示图像
结果如下 :
在图片中,共有4位专家对图像进行了分割处理并得到了各自的结果数据。随后将这些结果与所有黑色背景专家处理后的数据进行对比分析,并通过计算这些结果的均值来确定最终的整体结果作为本实验的基本参考依据。

1.1.3图像归一化-(读取CT图像的patch和分割标注)
图像归一化是一种用于将图像像素值调整至预设数值范围的方法,这一处理技术通常会将其像素值映射至
在[-1, 1]范围内进行调整。这一操作有助于提升模型的稳定性以及加快其收敛速度;从而促进来自不同图像的数据分布趋于一致;有利于深度学习模型的训练和性能提升。代码如下
#归一化
def normalize\_hu(image):
#将输入图像的像素值(-4000 ~ 4000)归一化到0~1之间
MIN_BOUND = -1000.0
MAX_BOUND = 400.0
image = (image - MIN_BOUND) / (MAX_BOUND - MIN_BOUND)
image[image > 1] = 1.
image[image < 0] = 0.
return image
1.2 图像标注信息预处理-(读取肺结节是良性还是恶性)
基于变量Malignancy的不同取值(如'Maximally Unlikely'、'Moderately Unlikely'等),该代码会分配给label1相应的数字评分(1至5)。在这一过程中,我们采用数值形式来替代原有的文本标签,并将其转换为统一的数字形式以提高后续机器学习模型的处理效率和训练效果。
if Malignancy == 'Highly Unlikely':
label1 = 1
elif Malignancy == 'Moderately Unlikely':
label1 = 2
elif Malignancy == 'Indeterminate':
label1 = 3
elif Malignancy == 'Moderately Suspicious':
label1 = 4
elif Malignancy == 'Highly Suspicious':
label1 = 5
print(label1)
1.2 肺结节图像切片处理处理-(切片并保存)
处理流程如下:首先根据输入的一组二维切片样本数据(即Image序列),结合预先定义好的mask序列(即Mask序列),完成了一系列的空间采样切割操作并保存相关结果。
第一部分是文件名列表,例如:0.jpg、1.jpg等。
第二部分为每张图片对应的标签,每个标签都是一个整数,表示每张图片所属的类别或属性特征。
在这个文件中,具体来说:
5: Highly Suspicious (高度可疑)
3: Indeterminate (不确定)
2: Moderately Suspicious (中度可疑)


1.3 总结
我们成功获得了所需训练的数据集

如果您有关于医学图像处理或机器学习项目的任何技术需求,请随时通过私信与我联系。
import numpy as np
import matplotlib.pyplot as plt
from skimage.measure import find_contours
import cv2
import pylidc as pl
from pylidc.utils import consensus
import os
dataset_path = r'G:\dataset\_zhang\LIDC-IDRI\ '
dicom_name = 'LIDC-IDRI-0001'
#归一化
def normalize\_hu(image):
#将输入图像的像素值(-4000 ~ 4000)归一化到0~1之间
MIN_BOUND = -1000.0
MAX_BOUND = 400.0
image = (image - MIN_BOUND) / (MAX_BOUND - MIN_BOUND)
image[image > 1] = 1.
image[image < 0] = 0.
return image
ii = 0
# Query for a scan, and convert it to an array volume.
for dicom_name in os.listdir(dataset_path):
print(dicom_name)
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。** **深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!** **因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img]()
![img]()
![img]()
![img]()
![img]()
![img]()
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!** **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新** **如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
n/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!** **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新** **如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
<img src="" alt="img" style="zoom:50%;" />
