从Dicom的xml文件中获取结节坐标并生成mask

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

使用数据集:LIDC
代码作用:从xml文件中获取结节坐标并生成mask
备注:没有学过python,都是边写边查,有的地方可能看起来不简洁,请自行优化

21-05-13 Debug 在我训练完Unet之后发现它笨的要死,于是倒回发现数据集有问题!这里有bug。因为不能保证slices和nodule_pos在list中的位置是一一对应的,所以肺实质和肺结节图片会在一个list范围内乱序

效果

肺实质
肺实质mask
结节mask

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
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值