|
基于LIDC-IDRI肺结节肺癌数据集的放射组学深度学习分类良性和恶性肺癌(Python全代码)全流程解析(一)1LIDC-IDRI数据集介绍1.1数据集预处理1.1.1图像读取-(python库pylidc安装)1.1.2图像读取-(读取CT图像的patch和分割标注)1.1.3图像归一化-(读取CT图像的patch和分割标注)1.2图像标注信息预处理-(读取肺结节是良性还是恶性)1.2肺结节图像切片处理处理-(切片并保存)1.3总结第二部分传送门第三部分传送门1LIDC-IDRI数据集介绍LIDC-IDRI数据集是用于医学影像分析的公开数据集,包含1010例低剂量CT扫描和人工标注的肺部结节信息。这些数据对于肺癌早期检测和算法开发至关重要。由美国国立卫生研究院(NIH)资助,该数据集为研究人员提供了宝贵资源,促进了医学影像处理和人工智能在肺部疾病诊断方面的进展,。数据集下载地址如下:*https://www.cancerimagingarchive.net/collection/lidc-idri/*该数据集大小为133GB,数据集的下载需要下载器和稳定的网络,否则可能失败。下载方面存在问题的私信我,我有完成数据集1.1数据集预处理数据集的预处理一共分为三个部分,图像的归一化,肺结节感兴趣区域分割,良恶性肺结节标注提取。LIDC-IDRI数据结构如下:1.1.1图像读取-(python库pylidc安装)在预处理图像过程中,我们不需要自己写程序去解析所有的文件。已经有人早就写好了免费的库文件去解析数据集。即为python的pylidc库。该库的安装如下:打开anacondaprompt输入pipinstallpylidc1注意在安装完该库后,需要在系统用户文件夹下,新建pylidc.conf文件,为该库的运行指明文件存放的位置。[dicom]path=G:\dataset_zhang\LIDC-IDRI将以上路径修改为数据集存放的路径。测试该库是否安装成功代码如下:importpylidcasplfrompylidc.utilsimportconsensusimportosdataset_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)123456789101.1.2图像读取-(读取CT图像的patch和分割标注)我们以数据集中的’LIDC-IDRI-0001’病例数据为例,使用pylidc库中的按照病例文件夹名字的查询的方式,将该病例的所有的数据储存在scan中。而后提取所有专家对图像分割的标注坐标和肺结节的体素立方体。一个病例中含有多个肺结节默认提取第一个。使用的plt画图功能展示。代码如下importnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlib.animationasmanimfromskimage.measureimportfind_contoursimportcv2importpylidcasplfrompylidc.utilsimportconsensusimportosdataset_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)#聚类注释(noduleannotations)以获取一组注释nods=scan.cluster_annotations()try:anns=nods[0]#尝试获取第一个注释(annotation)Malignancy=anns[0].Malignancy#获取注释中的恶性程度(Malignancy)信息exceptIndexError:#如果没有注释,或者无法获取第一个注释,则继续下一个DICOM文件夹continue#执行共识合并(consensusconsolidation)和50%的一致性水平(agreementlevel)。#我们在切片周围添加填充以提供上下文以进行查看。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']forjinrange(len(masks)):forcinfind_contours(masks[j][:,:,k].astype(float),0.5):label="Annotation%d"%(j+1)plt.plot(c[:,1],c[:,0],colors[j],label=label)#绘制50%共识轮廓线forcinfind_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()#显示图像123456789101112131415161718192021222324252627282930313233343536373839404142434445结果如下:图片中,一共有4个专家对图像的分割的结果。和黑色的所有的专家对图像分割的平均的结果,一般情况下我们使用平均结果作为我们的实验参考。1.1.3图像归一化-(读取CT图像的patch和分割标注)图像归一化是一种将图像的像素值重新缩放到特定范围的处理方法,通常是将像素值映射到0,1或者−1,1之间。这有助于提高模型的稳定性和收敛速度,使得不同图像具有相似的数据分布,有利于深度学习模型的训练和性能提升。代码如下#归一化defnormalize_hu(image): #将输入图像的像素值(-4000~4000)归一化到0~1之间MIN_BOUND=-1000.0MAX_BOUND=400.0image=(image-MIN_BOUND)/(MAX_BOUND-MIN_BOUND)image[image>1]=1.image[image1]=1.image[image
|
|