使用数据集:LIDC
代码作用:从xml文件中获取结节坐标并生成mask
备注:没有学过python,都是边写边查,有的地方可能看起来不简洁,请自行优化
21-05-13 Debug 在我训练完Unet之后发现它笨的要死,于是倒回发现数据集有问题!这里有bug。因为不能保证slices和nodule_pos在list中的位置是一一对应的,所以肺实质和肺结节图片会在一个list范围内乱序

效果:

requirements
import os
import SimpleITK
import pydicom
import numpy as np
import glob
from tqdm import tqdm
import bs4
from PIL import Image
from scipy import ndimage as ndi
from skimage.segmentation import clear_border
from skimage.measure import label, regionprops
from skimage.morphology import disk, dilation, binary_erosion, binary_closing
from skimage.filters import roberts, sobel
import cv2
import xml
functions
dataset_size = 300000 # 生成的数据集大小
def is_dicom_file(filename):
'''
判断某文件是否是dicom格式的文件
:param filename: dicom文件的路径
:return:
'''
file_stream = open(filename, 'rb')
file_stream.seek(128)
data = file_stream.read(4)
file_stream.close()
if data == b'DICM':
return True
return False
def load_patient(dir_list,type):
'''
读取某文件夹内的所有dicom文件
:param src_dir: dicom文件夹路径,,!最终文件夹
:return: dicom list
'''
uids=[]
# print(dir_list)
if (type == "nodule"):
uids,nodule_pos = find_nodule_frame(dir_list)
if (uids == None):
return None, None
slices = [0] * len(uids)
file_list = os.listdir(dir_list)
for file in file_list:
if file.endswith("xml"):
continue
file_path = os.path.join(dir_list, file)
ds = pydicom.dcmread(file_path)
#print(ds.SOPInstanceUID)
if (ds.SOPInstanceUID in uids):
#print(file)# 这里的0x0008,0x0018是SOP_Instance_UID
#slices.append(pydicom.read_file(file_path))
slices[uids.index(ds.SOPInstanceUID)]=pydicom.read_file(file_path)
#slices.insert(uids.index(ds.SOPInstanceUID),pydicom.read_file(file_path))
#slices.remove(0)
# print(count)
if (type == "non-nodule"):
uids,nodule_pos = find_nodule_frame(dir_list)
if (uids == None):
return None
file_list = os.listdir(dir_list)
num = 0
around_nodule = 5
for fi

本文介绍了一种从LIDC数据集中提取肺结节坐标并生成mask的方法。使用Python和相关库,如pydicom及SimpleITK,对DICOM格式的医学影像进行处理,实现了肺实质和结节的分割。
最低0.47元/天 解锁文章
2380





