def greedy(stack, temp): # clean the temp directory for file in os.listdir(temp): os.remove(temp + file) h, slc, w = stack.shape if slc % 2 == 1: r = int((slc - 1) / 2) else: raise ValueError("Slice Number as to be odd.") stack_opt = np.zeros(stack.shape, dtype=np.float32) # non-stepwise deformable registration im_fix = stack[:, r, :] util.nii_saver(im_fix, temp, 'im_fix.nii') for i in range(slc): im_mov = stack[:, i, :] util.nii_saver(im_mov, temp, 'im_mov.nii') subprocess.call("/home/dewei/tool/greedy.sh") stack_opt[:, i, :] = util.nii_loader(temp + 'warped.nii') return stack_opt
dataroot = '/home/dewei/Desktop/octa/data/' temp = '/home/dewei/Desktop/octa/temp/' volume = ["vol_octa"] radius = 3 for i in range(len(volume)): vol = util.nii_loader(dataroot + volume[i] + '.nii.gz') vol = np.transpose(vol, [1, 0, 2]) h, slc, w = vol.shape n_slc = slc - 2 * radius # define the output volume vol_reg = np.zeros([h, n_slc, w], dtype=np.float32) vol_non_reg = np.zeros([h, n_slc, w], dtype=np.float32) for j in range(radius, slc - radius): stack = vol[:, j - radius:j + radius + 1, :] stack_rg = tool.greedy(stack, temp) vol_non_reg[:, j - radius, :] = util.ImageRescale(tool.sf(stack, temp), [0, 255]) vol_reg[:, j - radius, :] = util.ImageRescale(tool.sf(stack_rg, temp), [0, 255]) # save the volume util.nii_saver(vol_non_reg, dataroot, 'sf_' + volume[i] + '.nii.gz') util.nii_saver(vol_reg, dataroot, 'sf_reg_' + volume[i] + '.nii.gz') print('volume {} self-fused.'.format(volume[i])) print('Execution finished.')
import sys sys.path.insert(0, 'E:\\tools\\') import util import numpy as np import matplotlib.pyplot as plt import os, imageio root = 'E:\\Fish\\' # iterate through different fish for item in os.listdir(root): if not (np.int(item) >= 27 and np.int(item) <= 41): raise NameError('file not exist.') item_root = root + item + '\\' # iterate through sessions for session in os.listdir(item_root): session_root = item_root + session + '\\' # left & right eye for vol_name in os.listdir(session_root): if vol_name.endswith('.tif'): print('fish: {}, session: {}, eye: {}'.format( item, session[-1], vol_name[-5])) vol = imageio.volread(session_root + vol_name) util.nii_saver(vol, session_root, vol_name[:-4] + '.nii.gz')
seg_enc = (8, 16, 32, 64, 64) syn_enc = (8, 16, 32) t = 3 num = 6 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # denoise: orig -> LF{orig} = dn{orig} model_dn = arch.res_UNet(dnoi_enc).to(device) model_dn.load_state_dict(torch.load(modelroot + 'dn_orig_proj(orig).pt')) # contrast enhance: dn{orig} -> CE-LF{orig} = ce{orig} model_refine = arch.VAE(seg_enc, syn_enc, t).to(device) model_refine.load_state_dict(torch.load(modelroot + 'vae_refine.pt')) # segmentation: seg{orig} -> LF{orig} model_vae = arch.VAE(seg_enc, syn_enc, t).to(device) model_vae.load_state_dict(torch.load(modelroot + 'vae.pt')) #%% input volume vol = util.nii_loader(dataroot + 'fovea5.nii.gz') vol_AR = util.nii_loader(dataroot + 'AR_fovea5.nii.gz') vol = vol[30:433, 30:40, :] vol_AR = vol_AR[30:433, 30:40, :] vol_dn, vol_seg, vol_syn = SegVAE(vol_AR, num, model_dn, model_refine, model_vae) util.nii_saver(vol_AR, saveroot, 'orig5.nii.gz') util.nii_saver(vol_dn, saveroot, 'vol_dn5.nii.gz') util.nii_saver(vol_seg, saveroot, 'vol_seg5.nii.gz') util.nii_saver(vol_syn, saveroot, 'vol_syn5.nii.gz')
file = 'fish_test.csv' df = pd.read_csv(root + file) row, col = df.shape opt = () for i in range(row): # index 0 in col indicate ID of the fish fish_root = dataroot + np.str(df.loc[i][0]) + '\\' print('fish: {}, samples: {}'.format(df.loc[i][0], len(opt))) # get session number for session in os.listdir(fish_root): session_root = fish_root + session + '\\' j = np.int(session[-1]) for item in os.listdir(session_root): if item.endswith('L.nii.gz'): vol_L = util.nii_loader(session_root + item) elif item.endswith('R.nii.gz'): vol_R = util.nii_loader(session_root + item) if type(df.loc[i][j]) == str: lib = df.loc[i][j] rng_left, rng_right = string2idx(lib) vol = np.float32(vol_L[10:-10, rng_left[0]:rng_left[1], 210:690]) vol = util.ImageRescale(vol, [0, 255]) util.nii_saver(vol, dataroot + 'test_data\\', 'v30s{}.nii.gz'.format(j))
r_var = 3 r_proj = 7 for file in os.listdir(dataroot): if file.startswith('AR') and file.endswith('.nii.gz'): vol = util.nii_loader(dataroot + file) h, slc, w = vol.shape # local_proj{orig} orig_proj = loc_Proc(vol, 3, 3, slc - 3, 'mean') # var var = loc_Proc(vol, r_var, r_var, slc - r_var, 'var') # local_proj{var} _, slc, _ = var.shape var_proj = loc_Proc(var, r_proj, r_proj, slc - r_proj, 'mean') vol_vp, vol_v = cutter(var_proj, var) _, vol_op = cutter(var_proj, orig_proj) _, vol_orig = cutter(var_proj, vol) for i in range(w): vol_op[:, :, i] = ContrastEnhance(vol_op[:, :, i]) idx = file.find('_') util.nii_saver(vol_orig, saveroot, 'orig{}'.format(file[idx:])) util.nii_saver(util.ImageRescale(vol_op, [0, 255]), saveroot, 'proj(orig){}'.format(file[idx:])) util.nii_saver(util.ImageRescale(vol_v, [0, 255]), saveroot, 'var{}'.format(file[idx:])) util.nii_saver(util.ImageRescale(vol_vp, [0, 255]), saveroot, 'proj(var){}'.format(file[idx:]))
for i in range(len(data)): # define fix image pack = data[i] x = pack[radius, :, :] im_fix = Image.fromarray(x) im_fix.save(Dir + 'fix_img.tif') # define atlases for j in range(radius * 2 + 1): im_mov = Image.fromarray(pack[j, :, :]) im_mov.save(Dir + 'atlas{}.tif'.format(j)) # call self-fusion function subprocess.call('/home/hud4/Desktop/20-summer/src/self_fusion.sh') v_sf[i, :, :] = io.imread(Dir + 'synthResult.tif') # display a sample if i == 200: Display(x, v_sf[i, :, :]) # clean up the temp directory for tif in os.listdir(Dir): os.remove(Dir + tif) util.nii_saver(v_sf, '/home/hud4/Desktop/2020/', 'SF_' + file[:-7] + '.nii.gz') idx += 1 t2 = time.time() print('Self-fusion done. Time: {} min'.format((t2 - t1) / 60))
Nsf = NetworkArch.MS_UNet(gpu, nch_1).to(device) Nsf.load_state_dict(torch.load(modelroot + 'noi2sf_MSUNet.pt')) Ndn = NetworkArch.MS_UNet(gpu, nch_2).to(device) Ndn.load_state_dict(torch.load(modelroot + '1_12.pt')) #%% load the raw data if __name__ == '__main__': root = 'E:\\human\\' volumelist = [] for file in os.listdir(root): if file.startswith('Retina2_Fovea') and file.endswith('.tif'): volumelist.append(file) volumelist.sort() volume = volumelist[0] raw = util.ImageRescale(io.imread(root + volume), [0, 255]) FrameNum = 5 nch = 7 t1 = time.time() V = PMFN_main(raw, FrameNum, nch, Nsf, Ndn, False, False) t2 = time.time() print('Denoised finish, time used: {} min'.format((t2 - t1) / 60)) util.nii_saver(V, 'E:\\Retina2_Fovea\\101_1\\', 'MSUN_101.nii.gz')
saveroot = dataroot+file[3:-8] depth = len(data) H,d,W = data[0].shape opt = np.zeros([H,depth,W],dtype=np.float32) org = np.zeros([H,depth,W],dtype=np.float32) if not d == 2*radius+1: raise ValueError('radius not matching') for i in range(depth): # clean up the temp directory for the next input for weightmap in os.listdir(temp): os.remove(temp+weightmap) stack = data[i] im_fix = Image.fromarray(stack[:,radius,:]) im_fix.save(temp + 'fix_img.tif') org[:,i,:] = stack[:,radius,:] # create atlases for j in range(2*radius+1): im_mov = Image.fromarray(stack[:,j,:]) im_mov.save(temp + 'atlas{}.tif'.format(j)) # call the self-fusion function & take the result subprocess.call("/home/dewei/self_fusion.sh") opt[:,i,:] = io.imread(temp+'synthResult.tif') util.nii_saver(np.transpose(opt,(2,1,0)),saveroot,'{}.nii.gz'.format(file[:-8])) util.nii_saver(np.transpose(org,(2,1,0)),saveroot,'{}.nii.gz'.format(file[3:-8]))
import sys sys.path.insert(0, 'E:\\tools\\') import util import numpy as np def cca(vol_cca, size_th=30): num_component = int(vol_cca.max()) hist = np.histogram(vol_cca, num_component) size_vec = hist[0] cca_th = np.sum(np.uint8(size_vec > size_th)) - 1 h, d, w = vol_cca.shape vol_opt = np.zeros(vol_cca.shape, dtype=np.int) for i in range(h): for j in range(d): for k in range(w): if (vol_cca[i, j, k] <= cca_th and vol_cca[i, j, k] > 0): vol_opt[i, j, k] = 1 return vol_opt if __name__ == "__main__": dataroot = 'E:\\OCTA\\binarize\\' vth = 15 vol_cca = util.nii_loader(dataroot + 'vol_cca.nii.gz') vol_opt = cca(vol_cca, vth) util.nii_saver(vol_opt, dataroot, 'mask_TH={}.nii.gz'.format(vth))
sf_r = 3 saveroot = 'E:\\real-time-PMFN\\data\\' t1 = time.time() for i in range(len(vlist)): print('Creating low noise volume....') name = vlist[i] # rescaling -> crop-out the massive back ground -> reshape HN = util.ImageRescale(io.imread(dataroot + name), [0, 255]) HN = Re_Arrange(HN[:, :512, :]) # Frame-average LN = FrameAver(HN, fixFrame) util.nii_saver(HN[fixFrame, :, :, :], saveroot, 'HN_{}.nii.gz'.format(name[8:-4])) util.nii_saver(LN, saveroot, 'LN_{}.nii.gz'.format(name[8:-4])) # display a sample plt.figure(figsize=(10, 5)) plt.axis('off'), plt.title('Volume #{}:'.format(i + 1) + name, fontsize=15) plt.imshow(np.concatenate((HN[0, 100, :, :], LN[100, :, :]), axis=1), cmap='gray') plt.show() # Bscan registration for self-fusion print('Creating self-fusion data....') sf_data = BscanRegist(LN, sf_r, True) with open(saveroot + name[8:-4] + '.pickle', 'wb') as handle: pickle.dump(sf_data, handle) del sf_data, HN, LN
im_x = x[0,0,:,:].detach().cpu().numpy() im_x = util.ImageRescale(im_x,[0,255]) # latent image im_latent = latent[0,0,:,:].detach().cpu().numpy() im_latent = util.ImageRescale(-im_latent,[0,255]) # synthetic image im_syn = syn[0,0,:,:].detach().cpu().numpy() im_syn = util.ImageRescale(im_syn,[0,255]) vol_latent[:,step,:] = im_latent vol_syn[:,step,:] = im_syn if step % 5 == 0: plt.figure(figsize=(15,5)) plt.imshow(np.concatenate((im_x,im_latent,im_syn),axis=1),cmap='gray') plt.axis('off') plt.show() util.nii_saver(vol_latent,'E:\\Fish\\test_result\\',file[:-7]+'_latent.nii') util.nii_saver(vol_syn,'E:\\Fish\\test_result\\',file[:-7]+'_syn.nii')
idx -= 1 im_n = vol_crop[:,:,idx] # histogram matching im_hm = util.hist_match(im_abn,im_n) vol_opt[:,:,i] = im_hm else: vol_opt[:,:,i] = vol_crop[:,:,i] return vol_crop, vol_opt if __name__=="__main__": dataroot = 'E:\\OCTA\\data\\R=3\\' saveroot = 'E:\\OCTA\\data\\AR_result\\' volume = ("fovea","fovea3","fovea5") slc_range = ([76,104],[13,43],[13,43]) for file in os.listdir(dataroot): for i in range(len(volume)): vol = util.nii_loader(dataroot+volume[i]+'.nii.gz') vol_crop,vol_opt = artifact_removal(vol,slc_range[i]) util.nii_saver(vol_crop,saveroot,volume[i]+'_crop.nii.gz') util.nii_saver(vol_opt,saveroot,volume[i]+'_AR.nii.gz')
vol = util.nii_loader(dataroot + 'orig5.nii.gz') vol_seg = util.nii_loader(dataroot + 'vol_seg5.nii.gz') vol_base = util.nii_loader(dataroot + 'binary5_base_2.nii.gz') vol_binary = util.nii_loader('E:\\OCTA\\result5_TH=30.nii.gz') vol_mseg = util.nii_loader('E:\\OCTA\\manualseg_fovea5.nii.gz') #%% h, slc, w = vol.shape crop = np.zeros([100, slc, 100], dtype=np.float32) crop_seg = np.zeros([100, slc, 100], dtype=np.float32) crop_mseg = np.zeros([100, slc, 100], dtype=np.float32) crop_base = np.zeros([100, slc, 100], dtype=np.float32) crop_binary = np.zeros([100, slc, 100], dtype=np.float32) for i in range(slc): crop[:, i, :] = vol[220:320, i, 180:280] crop_seg[:, i, :] = vol_seg[220:320, i, 180:280] crop_mseg[:, i, :] = vol_mseg[220:320, i, 180:280] crop_base[:, i, :] = vol_base[220:320, i, 180:280] crop_binary[:, i, :] = vol_binary[220:320, i, 180:280] util.nii_saver(crop, saveroot, 'crop.nii.gz') util.nii_saver(crop_seg, saveroot, 'crop_seg.nii.gz') util.nii_saver(crop_mseg, saveroot, 'crop_mseg.nii.gz') util.nii_saver(crop_base, saveroot, 'crop_base.nii.gz') util.nii_saver(crop_binary, saveroot, 'crop_binary.nii.gz') #plt.figure(figsize=(12,12)) #plt.imshow(vol_seg[:,10,:],cmap='gray') #plt.show()
plt.imshow(top, cmap='gray') # plt.savefig("E:\\OCTA\\result\\vis.jpg") plt.show() plt.figure(figsize=(15, 5)) plt.axis('off') plt.imshow(bot, cmap='gray') # plt.savefig("E:\\OCTA\\result\\vis.jpg") plt.show() return vol_base_1, vol_base_2, vol_opt #%% import warnings warnings.filterwarnings("ignore") result_root = 'E:\\Fish\\test_result\\' data_root = 'E:\\Fish\\test_data\\' for i in range(1, 7): vol_latent = util.nii_loader(result_root + 'v30s{}_latent.nii'.format(i)) vol_x = util.nii_loader(data_root + 'v30s{}.nii.gz'.format(i)) vol_base_1, vol_base_2, vol_opt = binarize(vol_x, vol_latent, True) util.nii_saver(vol_base_1, result_root, 'v30s{}_bin_kmean.nii.gz'.format(i)) util.nii_saver(vol_base_2, result_root, 'v30s{}_bin_otsu.nii.gz'.format(i)) util.nii_saver(vol_opt, result_root, 'v30s{}_bin_LIFE.nii.gz'.format(i))
im_seg = Int8(vol_seg[:, i, :]) diffuse_seg = anisotropic_diffusion(im_seg, niter=5, option=2).astype(np.float32) im_enhance = ContrastEnhance(diffuse_seg) otsu_th_opt = threshold_otsu(im_enhance) vol_opt[:, i, :] = np.uint8(im_enhance > otsu_th_opt) * 255 if verbose == True and i == idx: plt.figure(figsize=(18, 8)) plt.axis('off') plt.title('base1 -- base2 -- proposed', fontsize=15) plt.imshow(np.concatenate( (vol_base_1[:, i, :], vol_base_2[:, i, :], vol_opt[:, i, :]), axis=1), cmap='gray') plt.show() return vol_base_1, vol_base_2, vol_opt if __name__ == "__main__": dataroot = "E:\\OCTA\\result\\" vol_seg = util.nii_loader(dataroot + "vol_seg5.nii.gz") vol = util.nii_loader(dataroot + "orig5.nii.gz") vol_base_1, vol_base_2, vol_opt = binarize(vol, vol_seg, True) util.nii_saver(vol_opt, dataroot, 'binary5.nii.gz') util.nii_saver(vol_base_1, dataroot, 'binary5_base_1.nii.gz') util.nii_saver(vol_base_2, dataroot, 'binary5_base_2.nii.gz')