Ejemplo n.º 1
0
def savenpy(id, filelist, prep_folder, data_path, use_existing=True):
    resolution = np.array([1, 1, 1])
    name = filelist[id]
    if use_existing:
        if os.path.exists(os.path.join(
                prep_folder, name + '_label.npy')) and os.path.exists(
                    os.path.join(prep_folder, name + '_clean.npy')):
            print(name + ' had been done')
            return
    try:
        im, m1, m2, spacing = step1_python(os.path.join(data_path, name))
        Mask = m1 + m2

        newshape = np.round(np.array(Mask.shape) * spacing / resolution)
        xx, yy, zz = np.where(Mask)
        box = np.array([[np.min(xx), np.max(xx)], [np.min(yy),
                                                   np.max(yy)],
                        [np.min(zz), np.max(zz)]])
        box = box * np.expand_dims(spacing, 1) / np.expand_dims(resolution, 1)
        box = np.floor(box).astype('int')
        margin = 5
        extendbox = np.vstack([
            np.max([[0, 0, 0], box[:, 0] - margin], 0),
            np.min([newshape, box[:, 1] + 2 * margin], axis=0).T
        ]).T
        extendbox = extendbox.astype('int')

        convex_mask = m1
        dm1 = process_mask(m1)
        dm2 = process_mask(m2)
        dilatedMask = dm1 + dm2
        Mask = m1 + m2
        extramask = dilatedMask ^ Mask
        bone_thresh = 210
        pad_value = 170

        im[np.isnan(im)] = -2000
        sliceim = lumTrans(im)
        sliceim = sliceim * dilatedMask + pad_value * (
            1 - dilatedMask).astype('uint8')
        bones = sliceim * extramask > bone_thresh
        sliceim[bones] = pad_value
        sliceim1, _ = resample(sliceim, spacing, resolution, order=1)
        sliceim2 = sliceim1[extendbox[0, 0]:extendbox[0, 1],
                            extendbox[1, 0]:extendbox[1, 1],
                            extendbox[2, 0]:extendbox[2, 1]]
        sliceim = sliceim2[np.newaxis, ...]
        np.save(os.path.join(prep_folder, name + '_clean'), sliceim)
        np.save(os.path.join(prep_folder, name + '_label'),
                np.array([[0, 0, 0, 0]]))

        img = sliceim[0]
        print sliceim.shape
        plt.imshow(img, cmap=plt.cm.gray)
        plt.savefig('/home/ly/data/dsb2017/sample_processing/666666.jpg')

    except:
        print('bug in ' + name)
        raise
    print(name + ' done')
Ejemplo n.º 2
0
def savenpy(id,annos,filelist,data_path,prep_folder):        
    resolution = np.array([1,1,1])
    name = filelist[id]
    label = annos[annos[:,0]==name]
    label = label[:,[3,1,2,4]].astype('float')
    
    im, m1, m2, spacing = step1_python(os.path.join(data_path,name))
    Mask = m1+m2
    
    newshape = np.round(np.array(Mask.shape)*spacing/resolution)
    xx,yy,zz= np.where(Mask)
    box = np.array([[np.min(xx),np.max(xx)],[np.min(yy),np.max(yy)],[np.min(zz),np.max(zz)]])
    box = box*np.expand_dims(spacing,1)/np.expand_dims(resolution,1)
    box = np.floor(box).astype('int')
    margin = 5
    extendbox = np.vstack([np.max([[0,0,0],box[:,0]-margin],0),np.min([newshape,box[:,1]+2*margin],axis=0).T]).T
    extendbox = extendbox.astype('int')



    convex_mask = m1
    dm1 = process_mask(m1)
    dm2 = process_mask(m2)
    dilatedMask = dm1+dm2
    Mask = m1+m2
    extramask = dilatedMask - Mask
    bone_thresh = 210
    pad_value = 170
    im[np.isnan(im)]=-2000
    sliceim = lumTrans(im)
    sliceim = sliceim*dilatedMask+pad_value*(1-dilatedMask).astype('uint8')
    bones = sliceim*extramask>bone_thresh
    sliceim[bones] = pad_value
    sliceim1,_ = resample(sliceim,spacing,resolution,order=1)
    sliceim2 = sliceim1[extendbox[0,0]:extendbox[0,1],
                extendbox[1,0]:extendbox[1,1],
                extendbox[2,0]:extendbox[2,1]]
    sliceim = sliceim2[np.newaxis,...]
    np.save(os.path.join(prep_folder,name+'_clean.npy'),sliceim)

    
    if len(label)==0:
        label2 = np.array([[0,0,0,0]])
    elif len(label[0])==0:
        label2 = np.array([[0,0,0,0]])
    elif label[0][0]==0:
        label2 = np.array([[0,0,0,0]])
    else:
        haslabel = 1
        label2 = np.copy(label).T
        label2[:3] = label2[:3][[0,2,1]]
        label2[:3] = label2[:3]*np.expand_dims(spacing,1)/np.expand_dims(resolution,1)
        label2[3] = label2[3]*spacing[1]/resolution[1]
        label2[:3] = label2[:3]-np.expand_dims(extendbox[:,0],1)
        label2 = label2[:4].T
    np.save(os.path.join(prep_folder,name+'_label.npy'),label2)

    print(name)
Ejemplo n.º 3
0
def savenpy(id,annos,filelist,data_path,prep_folder):        
    resolution = np.array([1,1,1])
    name = filelist[id]
    label = annos[annos[:,0]==name]
    label = label[:,[3,1,2,4]].astype('float')
    
    im, m1, m2, spacing = step1_python(os.path.join(data_path,name))
    Mask = m1+m2
    
    newshape = np.round(np.array(Mask.shape)*spacing/resolution)
    xx,yy,zz= np.where(Mask)
    box = np.array([[np.min(xx),np.max(xx)],[np.min(yy),np.max(yy)],[np.min(zz),np.max(zz)]])
    box = box*np.expand_dims(spacing,1)/np.expand_dims(resolution,1)
    box = np.floor(box).astype('int')
    margin = 5
    extendbox = np.vstack([np.max([[0,0,0],box[:,0]-margin],0),np.min([newshape,box[:,1]+2*margin],axis=0).T]).T
    extendbox = extendbox.astype('int')



    convex_mask = m1
    dm1 = process_mask(m1)
    dm2 = process_mask(m2)
    dilatedMask = dm1+dm2
    Mask = m1+m2
    extramask = dilatedMask - Mask
    bone_thresh = 210
    pad_value = 170
    im[np.isnan(im)]=-2000
    sliceim = lumTrans(im)
    sliceim = sliceim*dilatedMask+pad_value*(1-dilatedMask).astype('uint8')
    bones = sliceim*extramask>bone_thresh
    sliceim[bones] = pad_value
    sliceim1,_ = resample(sliceim,spacing,resolution,order=1)
    sliceim2 = sliceim1[extendbox[0,0]:extendbox[0,1],
                extendbox[1,0]:extendbox[1,1],
                extendbox[2,0]:extendbox[2,1]]
    sliceim = sliceim2[np.newaxis,...]
    np.save(os.path.join(prep_folder,name+'_clean.npy'),sliceim)

    
    if len(label)==0:
        label2 = np.array([[0,0,0,0]])
    elif len(label[0])==0:
        label2 = np.array([[0,0,0,0]])
    elif label[0][0]==0:
        label2 = np.array([[0,0,0,0]])
    else:
        haslabel = 1
        label2 = np.copy(label).T
        label2[:3] = label2[:3][[0,2,1]]
        label2[:3] = label2[:3]*np.expand_dims(spacing,1)/np.expand_dims(resolution,1)
        label2[3] = label2[3]*spacing[1]/resolution[1]
        label2[:3] = label2[:3]-np.expand_dims(extendbox[:,0],1)
        label2 = label2[:4].T
    np.save(os.path.join(prep_folder,name+'_label.npy'),label2)

    print(name)
Ejemplo n.º 4
0
def savenpy(id,filelist,prep_folder,data_path,use_existing=True):      
    resolution = np.array([1,1,1])
    name = filelist[id]
    if use_existing:
        if os.path.exists(os.path.join(prep_folder,name+'_label.npy')) and os.path.exists(os.path.join(prep_folder,name+'_clean.npy')):
            print(name+' had been done')
            return
    try:
        im, m1, m2, spacing = step1_python(os.path.join(data_path,name))
        Mask = m1+m2
        
        newshape = np.round(np.array(Mask.shape)*spacing/resolution)
        xx,yy,zz= np.where(Mask)
        box = np.array([[np.min(xx),np.max(xx)],[np.min(yy),np.max(yy)],[np.min(zz),np.max(zz)]])
        box = box*np.expand_dims(spacing,1)/np.expand_dims(resolution,1)
        box = np.floor(box).astype('int')
        margin = 5
        extendbox = np.vstack([np.max([[0,0,0],box[:,0]-margin],0),np.min([newshape,box[:,1]+2*margin],axis=0).T]).T
        extendbox = extendbox.astype('int')



        convex_mask = m1
        dm1 = process_mask(m1)
        dm2 = process_mask(m2)
        dilatedMask = dm1+dm2
        Mask = m1+m2
        extramask = dilatedMask ^ Mask
        bone_thresh = 210
        pad_value = 170

        im[np.isnan(im)]=-2000
        sliceim = lumTrans(im)
        sliceim = sliceim*dilatedMask+pad_value*(1-dilatedMask).astype('uint8')
        bones = sliceim*extramask>bone_thresh
        sliceim[bones] = pad_value
        sliceim1,_ = resample(sliceim,spacing,resolution,order=1)
        sliceim2 = sliceim1[extendbox[0,0]:extendbox[0,1],
                    extendbox[1,0]:extendbox[1,1],
                    extendbox[2,0]:extendbox[2,1]]
        sliceim = sliceim2[np.newaxis,...]
        np.save(os.path.join(prep_folder,name+'_clean'),sliceim)
        np.save(os.path.join(prep_folder,name+'_label'),np.array([[0,0,0,0]]))
    except:
        print('bug in '+name)
        raise
    print(name+' done')
Ejemplo n.º 5
0
def savenpy(id, filelist, prep_folder, data_path, use_existing=True):
    resolution = np.array([1, 1, 1])
    name = filelist[id]
    print 'lungSeg %s...' % name
    #if use_existing:
    if os.path.exists(
            os.path.join(prep_folder,
                         name.split('.')[0] + '_clean.npy')):
        print(name + ' had been done')
        return

    try:
        #if(1):
        im, m1, m2, spacing = step1_python(os.path.join(data_path, name))
        #	print m1.shape,m2.shape,spacing
        if m1.shape[0] == 0:
            print('save time: ' + name + ',using tutorial lungSeg...')
            tutorialLungSeg.lungSeg(im, prep_folder, name.split('.')[0])
            return
        Mask = m1 + m2
        newshape = np.round(np.array(Mask.shape) * spacing / resolution)
        xx, yy, zz = np.where(Mask)
        box = np.array([[np.min(xx), np.max(xx)], [np.min(yy),
                                                   np.max(yy)],
                        [np.min(zz), np.max(zz)]])
        box = box * np.expand_dims(spacing, 1) / np.expand_dims(resolution, 1)
        box = np.floor(box).astype('int')
        margin = 5
        extendbox = np.vstack([
            np.max([[0, 0, 0], box[:, 0] - margin], 0),
            np.min([newshape, box[:, 1] + 2 * margin], axis=0).T
        ]).T
        extendbox = extendbox.astype('int')

        convex_mask = m1
        dm1 = process_mask(m1)
        dm2 = process_mask(m2)
        dilatedMask = dm1 + dm2
        Mask = m1 + m2
        extramask = dilatedMask ^ Mask
        bone_thresh = 210
        pad_value = 170

        im[np.isnan(im)] = -2000
        sliceim = lumTrans(im)
        sliceim = sliceim * dilatedMask + pad_value * (
            1 - dilatedMask).astype('uint8')
        bones = sliceim * extramask > bone_thresh
        sliceim[bones] = pad_value
        #sliceim1,_ = resample(sliceim,spacing,resolution,order=1)
        #sliceim2 = sliceim1[extendbox[0,0]:extendbox[0,1],
        #            extendbox[1,0]:extendbox[1,1],
        #            extendbox[2,0]:extendbox[2,1]]
        #sliceim = sliceim2[np.newaxis,...]
        x, y, z = sliceim.shape
        np.save(os.path.join(prep_folder,
                             name.split('.')[0] + '_clean'),
                sliceim.reshape(1, x, y, z))
        np.save(os.path.join(prep_folder,
                             name.split('.')[0] + '_label'),
                np.array([[0, 0, 0, 0]]))
    except:
        print('bug in ' + name + ',using tutorial lungSeg...')
        itk_img = sitk.ReadImage(os.path.join(data_path, name))
        im = sitk.GetArrayFromImage(itk_img)
        tutorialLungSeg.lungSeg(im, prep_folder, name.split('.')[0])

        #raise
    print(name + ' done')
Ejemplo n.º 6
0
def savenpy(dirname, prep_folder, data_path, use_existing=True):
    print('saving %s...' % dirname)
    resolution = np.array([1, 1, 1])

    if use_existing:
        label_path = p.join(prep_folder, dirname + '_label.npy')
        clean_path = p.join(prep_folder, dirname + '_clean.npy')
        exists = p.exists(label_path) and p.exists(clean_path)
    else:
        exists = False

    if exists:
        print(dirname + ' already processed')
        processed = 0
    else:
        print(dirname + ' not yet processed')
        case_path = p.join(data_path, dirname)
        im, m1, m2, spacing = step1_python(case_path)
        Mask = m1 + m2

        newshape = np.round(np.array(Mask.shape) * spacing / resolution)
        xx, yy, zz = np.where(Mask)
        box = np.array(
            [
                [np.min(xx), np.max(xx)],
                [np.min(yy), np.max(yy)],
                [np.min(zz), np.max(zz)]])

        box = box * np.expand_dims(spacing,1) / np.expand_dims(resolution, 1)
        box = np.floor(box).astype('int')
        margin = 5
        extendbox = np.vstack(
            [
                np.max([[0, 0, 0], box[:,0] - margin], 0),
                np.min([newshape, box[:,1] + 2 * margin], axis=0).T]).T

        extendbox = extendbox.astype('int')

        convex_mask = m1
        dm1 = process_mask(m1)
        dm2 = process_mask(m2)
        dilatedMask = dm1 + dm2
        Mask = m1 + m2
        extramask = dilatedMask ^ Mask
        bone_thresh = 210
        pad_value = 170

        im[np.isnan(im)] =- 2000
        sliceim = lumTrans(im)
        sliceim = sliceim * dilatedMask + pad_value * (1 - dilatedMask).astype('uint8')
        bones = sliceim * extramask > bone_thresh
        sliceim[bones] = pad_value
        sliceim1 = resample(sliceim, spacing, resolution, order=1)[0]
        sliceim2 = sliceim1[
            extendbox[0, 0]:extendbox[0, 1],
            extendbox[1, 0]:extendbox[1, 1],
            extendbox[2, 0]:extendbox[2, 1]]

        sliceim = sliceim2[np.newaxis, ...]
        np.save(p.join(prep_folder, dirname + '_clean'), sliceim)
        np.save(p.join(prep_folder, dirname + '_label'), np.array([[0,0,0,0]]))
        print(dirname + ' done')
        processed = 1

    return processed
def savenpy(id, annos, filelist, data_path, prep_folder):
    resolution = np.array([1, 1, 1])
    name = filelist[id]
    shortname = name[:-7]
    label = annos[annos[:, 0] == shortname]
    label = label[:, [3, 1, 2, 4]].astype('float')

    im, m1, m2, spacing, origin = step1_python(os.path.join(data_path, name))
    Mask = m1 + m2

    newshape = np.round(np.array(Mask.shape) * spacing / resolution)
    xx, yy, zz = np.where(Mask)
    box = np.array([[np.min(xx), np.max(xx)], [np.min(yy),
                                               np.max(yy)],
                    [np.min(zz), np.max(zz)]])
    box = box * np.expand_dims(spacing, 1) / np.expand_dims(resolution, 1)
    box = np.floor(box).astype('int')
    margin = 5
    extendbox = np.vstack([
        np.max([[0, 0, 0], box[:, 0] - margin], 0),
        np.min([newshape, box[:, 1] + 2 * margin], axis=0).T
    ]).T
    extendbox = extendbox.astype('int')

    convex_mask = m1
    dm1 = process_mask(m1)
    dm2 = process_mask(m2)
    dilatedMask = dm1 + dm2
    Mask = m1 + m2
    extramask = dilatedMask.astype(np.int) - Mask.astype(np.int)
    bone_thresh = 210
    pad_value = 170
    im[np.isnan(im)] = -2000
    sliceim = lumTrans(im)
    sliceim = sliceim * dilatedMask + pad_value * (1 -
                                                   dilatedMask).astype('uint8')
    bones = sliceim * extramask > bone_thresh
    sliceim[bones] = pad_value
    sliceim1, _ = resample(sliceim, spacing, resolution, order=1)
    sliceim2 = sliceim1[extendbox[0, 0]:extendbox[0, 1],
                        extendbox[1, 0]:extendbox[1, 1],
                        extendbox[2, 0]:extendbox[2, 1]]
    sliceim = sliceim2[np.newaxis, ...]

    # save image into nii.gz to check
    #    import nibabel as nib
    #    new_image = nib.Nifti1Image(np.squeeze(sliceim), affine=np.eye(4))
    #    nib.save(new_image, os.path.join('./','test4d.nii.gz'))

    np.save(os.path.join(prep_folder, shortname + '_clean.npy'), sliceim)
    np.save(os.path.join(prep_folder, shortname + '_spacing.npy'), spacing)
    np.save(os.path.join(prep_folder, shortname + '_extendbox.npy'), extendbox)
    np.save(os.path.join(prep_folder, shortname + '_origin.npy'), origin)
    np.save(os.path.join(prep_folder, shortname + '_mask.npy'), Mask)

    if len(label) == 0:
        label2 = np.array([[0, 0, 0, 0]])
    else:
        label2 = np.copy(label).T
        label2[:3] = label2[:3][[0, 2, 1]]
        label2[:3] = label2[:3] * np.expand_dims(spacing, 1) / np.expand_dims(
            resolution, 1)
        label2[3] = label2[3] * spacing[1] / resolution[1]
        label2[:3] = label2[:3] - np.expand_dims(extendbox[:, 0], 1)
        label2 = label2[:4].T
    np.save(os.path.join(prep_folder, shortname + '_label.npy'), label2)
    print(name)
Ejemplo n.º 8
0
def savenpy(id, filelist, prep_folder, data_path, use_existing=True):
    resolution = np.array([1, 1, 1])
    name = filelist[id]
    if use_existing:
        if os.path.exists(os.path.join(
                prep_folder, name + '_label.npy')) and os.path.exists(
                    os.path.join(prep_folder, name + '_clean.npy')):
            print(name + ' had been done')
            return
    try:
        #        im, m1, m2, spacing = step1_python(os.path.join(data_path,name))
        im, m1, m2, spacing = step1_python(name)
        Mask = m1 + m2

        newshape = np.round(np.array(Mask.shape) * spacing / resolution)
        xx, yy, zz = np.where(Mask)
        box = np.array([[np.min(xx), np.max(xx)], [np.min(yy),
                                                   np.max(yy)],
                        [np.min(zz), np.max(zz)]])
        box = box * np.expand_dims(spacing, 1) / np.expand_dims(resolution, 1)
        box = np.floor(box).astype('int')
        margin = 5
        extendbox = np.vstack([
            np.max([[0, 0, 0], box[:, 0] - margin], 0),
            np.min([newshape, box[:, 1] + 2 * margin], axis=0).T
        ]).T
        extendbox = extendbox.astype('int')

        convex_mask = m1
        dm1 = process_mask(m1)
        dm2 = process_mask(m2)
        dilatedMask = dm1 + dm2
        Mask = m1 + m2
        extramask = dilatedMask ^ Mask
        bone_thresh = 210
        pad_value = 170

        im[np.isnan(im)] = -2000
        sliceim = lumTrans(im)
        sliceim = sliceim * dilatedMask + pad_value * (
            1 - dilatedMask).astype('uint8')
        bones = sliceim * extramask > bone_thresh
        sliceim[bones] = pad_value
        #        sliceim1,_ = resample(sliceim,spacing,resolution,order=1)
        #        sliceim2 = sliceim1[extendbox[0,0]:extendbox[0,1],
        #                    extendbox[1,0]:extendbox[1,1],
        #                    extendbox[2,0]:extendbox[2,1]]
        #        sliceim = sliceim2[np.newaxis,...]

        name, ext = os.path.splitext(os.path.split(name)[1])
        #        np.save(os.path.join(prep_folder, name + '.npy'), sliceim)
        #        np.save(os.path.join(prep_folder,name+'_clean'),sliceim)
        #        np.save(os.path.join(prep_folder,name+'_label'),np.array([[0,0,0,0]]))

        #        for idx, slice in enumerate(sliceim):
        #            slicename = "../output/test_masks/lung_masks/%d.jpg" % idx
        #            cv2.imwrite(slicename, slice)

        #sliceim = sliceim.reshape(sliceim.shape[1], sliceim.shape[2], sliceim.shape[0])
        #write_mhd_file(os.path.join(prep_folder, name + '.mhd'), sliceim, sliceim.shape)
        np.save(os.path.join(prep_folder, name + '.npy'), sliceim)

    except:
        print('bug in ' + name)
        raise
    print(name + ' done')
Ejemplo n.º 9
0
def savenpy(id, filelist, prep_folder, data_path, use_existing=True):
    resolution = np.array([1, 1, 1])
    name = filelist[id]
    if use_existing:
        if os.path.exists(os.path.join(
                prep_folder, name + '_label.npy')) and os.path.exists(
                    os.path.join(prep_folder, name + '_clean.npy')):
            print(name + ' had been done')
            return
    try:
        im, m1, m2, spacing = step1_python(os.path.join(data_path, name))
        Mask = m1 + m2

        newshape = np.round(np.array(Mask.shape) * spacing / resolution)
        xx, yy, zz = np.where(Mask)
        box = np.array([[np.min(xx), np.max(xx)], [np.min(yy),
                                                   np.max(yy)],
                        [np.min(zz), np.max(zz)]])
        box = box * np.expand_dims(spacing, 1) / np.expand_dims(resolution, 1)
        box = np.floor(box).astype('int')
        margin = 5
        extendbox = np.vstack([
            np.max([[0, 0, 0], box[:, 0] - margin], 0),
            np.min([newshape, box[:, 1] + 2 * margin], axis=0).T
        ]).T
        extendbox = extendbox.astype('int')

        convex_mask = m1
        dm1 = process_mask(m1)
        dm2 = process_mask(m2)
        dilatedMask = dm1 + dm2
        Mask = m1 + m2
        extramask = dilatedMask ^ Mask
        bone_thresh = 210
        pad_value = 170

        im[np.isnan(im)] = -2000
        sliceim = lumTrans(im)
        sliceim = sliceim * dilatedMask + pad_value * (
            1 - dilatedMask).astype('uint8')
        bones = sliceim * extramask > bone_thresh
        sliceim[bones] = pad_value
        sliceim1, _ = resample(sliceim, spacing, resolution, order=1)
        sliceim2 = sliceim1[extendbox[0, 0]:extendbox[0, 1],
                            extendbox[1, 0]:extendbox[1, 1],
                            extendbox[2, 0]:extendbox[2, 1]]
        sliceim = sliceim2[np.newaxis, ...]
        #save as npy
        np.save(os.path.join(prep_folder, name + '_clean'), sliceim)

        np.save(os.path.join(prep_folder, name + '_label'),
                np.array([[0, 0, 0, 0]]))
        #Save as nifti
        sliceim = sliceim.reshape(sliceim.shape[-3], sliceim.shape[-2],
                                  sliceim.shape[-1])
        matr = np.array([[0, 0, -1, 0], [0, -1, 0, 0], [1, 0, 0, 0],
                         [0, 0, 0, 1]])
        ni_img = nib.Nifti1Image(sliceim, matr)
        #activate the following line to keep conformity with old data
        #ni_img = nib.Nifti1Image(sliceim, np.eye(4))
        nib.save(ni_img, os.path.join(prep_folder, name + '_clean.nii.gz'))

    except Exception as e:
        print('bug in ' + name)
        print(e)
        #raise
    print(name + ' done')
Ejemplo n.º 10
0
def savenpy(id,
            filelist,
            prep_folder,
            data_path,
            use_existing=True,
            annos=None):
    """
    stage数据集处理并保存为numpy的格式(单个filelist对应一个npy文件,包括label.npy和clean.npy)
    :param id: os.listdir的list的index
    :param filelist: os.listdir的结果,list格式
    :param prep_folder: stage-2数据集处理过后的保存地址
    :param data_path: stage-2数据集的下载地址
    :param use_existing:
    :return:
    """
    resolution = np.array([1, 1, 1])
    name = filelist[id]
    print(id)
    if use_existing:
        if os.path.exists(os.path.join(
                prep_folder, name + '_label.npy')) and os.path.exists(
                    os.path.join(prep_folder, name + '_clean.npy')):
            print(name + ' had been done')
            return
    try:
        # step1.py中的3D图像数据预处理函数step1_python,用来返回:
        ##im:像素点的HU值
        ##m1:mask以内的像素
        ##m2:mask以外的像素
        ##spacing:像素距离
        im, m1, m2, spacing, origin, isflip = step1_python(
            os.path.join(data_path, name))

        ## 真实的mask边界
        Mask = m1 + m2
        ## mask世界CT坐标系到真实坐标系的转换
        newshape = np.round(np.array(Mask.shape) * spacing / resolution)
        ## mask真实坐标系下的位置坐标
        xx, yy, zz = np.where(Mask)
        ## 结节标注的边界,用一个刚好包裹下的cube-box代替,并padding部分像素
        box = np.array([[np.min(xx), np.max(xx)], [np.min(yy),
                                                   np.max(yy)],
                        [np.min(zz), np.max(zz)]])
        box = box * np.expand_dims(spacing, 1) / np.expand_dims(resolution, 1)
        box = np.floor(box).astype('int')
        margin = 5
        extendbox = np.vstack([
            np.max([[0, 0, 0], box[:, 0] - margin], 0),
            np.min([newshape, box[:, 1] + 2 * margin], axis=0).T
        ]).T
        extendbox = extendbox.astype('int')

        # 凸包+扩张情况下的mask提取,并把mask以外的像素灰度值均设为170,为避免肺结节分类干扰,扩张区域内的像素灰度值高于210(骨组织)也设为170
        convex_mask = m1
        dm1 = process_mask(m1)
        dm2 = process_mask(m2)
        dilatedMask = dm1 + dm2
        Mask = m1 + m2
        extramask = dilatedMask ^ Mask
        bone_thresh = 210
        pad_value = 170

        im[np.isnan(im)] = -2000
        sliceim = lumTrans(im)
        sliceim = sliceim * dilatedMask + pad_value * (
            1 - dilatedMask).astype('uint8')
        bones = sliceim * extramask > bone_thresh
        sliceim[bones] = pad_value
        sliceim1, _ = resample(sliceim, spacing, resolution, order=1)
        sliceim2 = sliceim1[extendbox[0, 0]:extendbox[0, 1],
                            extendbox[1, 0]:extendbox[1, 1],
                            extendbox[2, 0]:extendbox[2, 1]]
        sliceim = sliceim2[np.newaxis, ...]
        np.save(os.path.join(prep_folder, name + '_clean'), sliceim)
        # np.save(os.path.join(prep_folder,name+'_label'),np.array([[0,0,0,0]]))

        this_annos = np.copy(
            annos[annos[:, 0] == str(name)])  # 一行代表一个结节,一个病例可能对应多行标签
        label = []
        if len(this_annos) > 0:
            for c in this_annos:
                pos = worldToVoxelCoord(c[1:4][::-1],
                                        origin=origin,
                                        spacing=spacing)  # 将世界坐标转换为真实的体素坐标
                if isflip:
                    pos[1:] = Mask.shape[1:3] - pos[1:]
                label.append(np.concatenate([pos, [c[4] / spacing[1]]
                                             ]))  # 这1段dataframe的操作没看懂???

        label = np.array(label)
        if len(label) == 0:
            label2 = np.array([[0, 0, 0,
                                0]])  # #若没有结节则设为全0,第1次读取label_numpy就是全设为0的问题
        else:
            label2 = np.copy(label).T
            label2[:3] = label2[:3] * np.expand_dims(
                spacing, 1) / np.expand_dims(resolution, 1)  # 对标签应用新的分辨率
            label2[3] = label2[3] * spacing[1] / resolution[1]  # 对直径应用新的分辨率
            label2[:3] = label2[:3] - np.expand_dims(
                extendbox[:, 0], 1)  # 将box外的长度砍掉,也就是相对于box的坐标
            label2 = label2[:4].T
        np.save(os.path.join(prep_folder, name + '_label.npy'), label2)
        print(name, '\n')
    except:
        print('bug in ' + name)
        raise
    print(name + ' done')
Ejemplo n.º 11
0
def savenpy(id, annos, filelist, data_path, prep_folder):
    print('id', id)
    resolution = np.array([1, 1, 1])
    name = filelist[id]
    label = annos[annos[:, 0] == name]
    label = label[:, [3, 1, 2, 4]].astype('float')  #zxyd

    im, m1, m2, spacing = step1_python(os.path.join(data_path,
                                                    name))  #preprocess
    Mask = m1 + m2
    # print('Mask.shape',Mask.shape)#(104, 512, 512)
    newshape = np.round(np.array(Mask.shape) * spacing / resolution)
    # print('newshape',newshape)#[260. 350. 350.]
    xx, yy, zz = np.where(Mask)
    box = np.array([[np.min(xx), np.max(xx)], [np.min(yy),
                                               np.max(yy)],
                    [np.min(zz), np.max(zz)]])
    # print('box0',box, box.shape)#[[ 30. 235.][85.44924855 287.79306912][42.38282728 307.61729479]] (3, 2)
    box = box * np.expand_dims(spacing, 1) / np.expand_dims(
        resolution, 1)  #lung box np.expand_dims:(3,)to (3, 1)
    # print('spacing',spacing, np.expand_dims(spacing,1))#[2.5 0.664062 0.664062] [2.5 ][0.664062][0.664062]]
    # print('box1',box, box.shape)#[[45. 287.5][82.265625 303.046875][27.421875 336.796875]] (3, 2)
    #
    box = np.floor(box).astype('int')
    margin = 5
    extendbox = np.vstack([
        np.max([[0, 0, 0], box[:, 0] - margin], 0),
        np.min([newshape, box[:, 1] + 2 * margin], axis=0).T
    ]).T
    extendbox = extendbox.astype('int')

    convex_mask = m1
    dm1 = process_mask(m1)  #(凸包&扩张)
    dm2 = process_mask(m2)
    dilatedMask = dm1 + dm2
    Mask = m1 + m2
    # print('---0',im.shape,Mask.shape)
    extramask = dilatedMask ^ Mask
    bone_thresh = 210
    pad_value = 170
    im[np.isnan(im)] = -2000
    sliceim = lumTrans(im)  #归一化到0-255
    sliceim = sliceim * dilatedMask + pad_value * (1 -
                                                   dilatedMask).astype('uint8')
    bones = sliceim * extramask > bone_thresh
    sliceim[bones] = pad_value
    # print('---1',im.shape,sliceim.shape,Mask.shape)
    sliceim1, _ = resample(sliceim, spacing, resolution, order=1)
    Mask1, _ = resample(Mask, spacing, resolution, order=1)
    sliceim2 = sliceim1[extendbox[0, 0]:extendbox[0, 1],
                        extendbox[1, 0]:extendbox[1, 1],
                        extendbox[2, 0]:extendbox[2, 1]]
    Mask2 = Mask1[extendbox[0, 0]:extendbox[0, 1],
                  extendbox[1, 0]:extendbox[1, 1],
                  extendbox[2, 0]:extendbox[2, 1]]
    sliceim = sliceim2[np.newaxis, ...]
    Mask = Mask2[np.newaxis, ...]
    # print('---1',im.shape,sliceim.shape,Mask.shape)
    print('save mask clean label to', prep_folder)
    np.save(os.path.join(prep_folder, name + '_mask.npy'), Mask)
    np.save(os.path.join(prep_folder, name + '_clean.npy'), sliceim)

    if len(label) == 0:
        label2 = np.array([[0, 0, 0, 0]])
    elif len(label[0]) == 0:
        label2 = np.array([[0, 0, 0, 0]])
    elif label[0][0] == 0:
        label2 = np.array([[0, 0, 0, 0]])
    else:
        haslabel = 1
        label2 = np.copy(label).T
        label2[:3] = label2[:3][[0, 2, 1]]
        label2[:3] = label2[:3] * np.expand_dims(spacing, 1) / np.expand_dims(
            resolution, 1)
        label2[3] = label2[3] * spacing[1] / resolution[1]
        label2[:3] = label2[:3] - np.expand_dims(extendbox[:, 0], 1)
        label2 = label2[:4].T
    np.save(os.path.join(prep_folder, name + '_label.npy'), label2)

    print(name)
Ejemplo n.º 12
0
def savenpy(id, annos, filelist, data_path, prep_folder):
    """
    图像预处理重点-提取肺部区域ROI,以及提取的数据保存为numpy
    :param id: 
    :param annos: 
    :param filelist: 
    :param data_path: 
    :param prep_folder: 
    :return: 
    """
    resolution = np.array([1, 1, 1])
    name = filelist[id]
    label = annos[annos[:, 0] == name]
    # z轴坐标放在第一位
    label = label[:, [3, 1, 2, 4]].astype('float')
    # 切片后,im是像素点HU值,m1是只有目标标注的mask像素值,m2是只有非目标区域标的的mask像素值,spacing是体素距离
    im, m1, m2, spacing = step1_python(os.path.join(data_path, name))
    Mask = m1 + m2
    # mask世界坐标系到真实坐标系的转换
    newshape = np.round(np.array(Mask.shape) * spacing / resolution)
    xx, yy, zz = np.where(Mask)
    # box立方体的坐标表示形式
    box = np.array([[np.min(xx), np.max(xx)], [np.min(yy),
                                               np.max(yy)],
                    [np.min(zz), np.max(zz)]])
    # np.expand_dims:用于扩展数组的形状,spacing.shape=(3,2),resolution.shape=(3,2)
    box = box * np.expand_dims(spacing, 1) / np.expand_dims(resolution, 1)
    # np.floor:返回不大于输入参数的最大整数
    box = np.floor(box).astype('int')
    # 每个轴左右方向上的扩张像素值
    margin = 5
    # box向外扩张10个像素
    extendbox = np.vstack([
        np.max([[0, 0, 0], box[:, 0] - margin], 0),
        np.min([newshape, box[:, 1] + 2 * margin], axis=0).T
    ]).T
    extendbox = extendbox.astype('int')

    convex_mask = m1
    dm1 = process_mask(m1)
    dm2 = process_mask(m2)
    # 膨胀后的mask
    dilatedMask = dm1 + dm2
    # 原始的mask
    Mask = m1 + m2
    # 膨胀新增区域
    extramask = dilatedMask - Mask
    # 像素灰度值阈值(骨头区域)
    bone_thresh = 210
    # mask以外区域的像素值
    pad_value = 170
    # HU值初始化为(-1000,1000)?
    im[np.isnan(im)] = -2000
    # HU值([-1200, 600])线性变换至0~255内的灰度值
    sliceim = lumTrans(im)
    # 切片img中mask以外的像素灰度值均设为170
    sliceim = sliceim * dilatedMask + pad_value * (1 -
                                                   dilatedMask).astype('uint8')
    # 切片img中大于像素灰度值阈值的像素点(骨头区域)
    bones = sliceim * extramask > bone_thresh
    # 切片img中像素灰度值高于210的区域灰度值也设为170
    sliceim[bones] = pad_value
    # 像素距离标准化(体素值进行映射与归一化)
    sliceim1, _ = resample(sliceim, spacing, resolution, order=1)
    # 左右肺的凸包扩张处理
    sliceim2 = sliceim1[extendbox[0, 0]:extendbox[0, 1],
                        extendbox[1, 0]:extendbox[1, 1],
                        extendbox[2, 0]:extendbox[2, 1]]
    sliceim = sliceim2[np.newaxis, ...]
    # name+'_clean.npy':就是去除肺部周边噪声后的,3D切片图数组
    np.save(os.path.join(prep_folder, name + '_clean.npy'), sliceim)

    # name+'_label.npy':2D切片图相应的label数组
    if len(label) == 0:
        label2 = np.array([[0, 0, 0, 0]])
    elif len(label[0]) == 0:
        label2 = np.array([[0, 0, 0, 0]])
    elif label[0][0] == 0:
        label2 = np.array([[0, 0, 0, 0]])
    else:
        haslabel = 1
        label2 = np.copy(label).T
        label2[:3] = label2[:3][[0, 2, 1]]
        label2[:3] = label2[:3] * np.expand_dims(spacing, 1) / np.expand_dims(
            resolution, 1)
        label2[3] = label2[3] * spacing[1] / resolution[1]
        label2[:3] = label2[:3] - np.expand_dims(extendbox[:, 0], 1)
        label2 = label2[:4].T
    np.save(os.path.join(prep_folder, name + '_label.npy'), label2)

    print(name)