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')
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)
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)
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')
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')
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)
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')
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')
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')
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)
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)