def get_synthetic_warped_circle(nslices): #get a subsampled circle fname_cicle = get_data('reg_o') circle = np.load(fname_cicle)[::4,::4].astype(floating) #create a synthetic invertible map and warp the circle d, dinv = vfu.create_harmonic_fields_2d(64, 64, 0.1, 4) d = np.asarray(d, dtype=floating) dinv = np.asarray(dinv, dtype=floating) mapping = DiffeomorphicMap(2, (64, 64)) mapping.forward, mapping.backward = d, dinv wcircle = mapping.transform(circle) if(nslices == 1): return circle, wcircle #normalize and form the 3d by piling slices circle = (circle-circle.min())/(circle.max() - circle.min()) circle_3d = np.ndarray(circle.shape + (nslices,), dtype=floating) circle_3d[...] = circle[...,None] circle_3d[...,0] = 0 circle_3d[...,-1] = 0 #do the same with the warped circle wcircle = (wcircle-wcircle.min())/(wcircle.max() - wcircle.min()) wcircle_3d = np.ndarray(wcircle.shape + (nslices,), dtype=floating) wcircle_3d[...] = wcircle[...,None] wcircle_3d[...,0] = 0 wcircle_3d[...,-1] = 0 return circle_3d, wcircle_3d
def get_warped_stacked_image(image, nslices, b, m): r""" Creates a volume by stacking copies of a deformed image The image is deformed under an invertible field, and a 3D volume is generated as follows: the first and last `nslices`//3 slices are filled with zeros to simulate background. The remaining middle slices are filled with copies of the deformed `image` under the action of the invertible field. Parameters ---------- image : 2d array shape(r, c) the image to be deformed nslices : int the number of slices in the final volume b, m : float parameters of the harmonic field (as in [1]). Returns ------- vol : array shape(r, c) if `nslices`==1 else (r, c, `nslices`) the volumed generated using the undeformed image wvol : array shape(r, c) if `nslices`==1 else (r, c, `nslices`) the volumed generated using the warped image References ---------- [1] Chen, M., Lu, W., Chen, Q., Ruchala, K. J., & Olivera, G. H. (2008). A simple fixed-point approach to invert a deformation field. Medical Physics, 35(1), 81. doi:10.1118/1.2816107 """ shape = image.shape # create a synthetic invertible map and warp the circle d, dinv = vfu.create_harmonic_fields_2d(shape[0], shape[1], b, m) d = np.asarray(d, dtype=floating) dinv = np.asarray(dinv, dtype=floating) mapping = DiffeomorphicMap(2, shape) mapping.forward, mapping.backward = d, dinv wimage = mapping.transform(image) if (nslices == 1): return image, wimage # normalize and form the 3d by piling slices image = image.astype(floating) image = (image - image.min()) / (image.max() - image.min()) zero_slices = nslices // 3 vol = np.zeros(shape=image.shape + (nslices, )) vol[..., zero_slices:(2 * zero_slices)] = image[..., None] wvol = np.zeros(shape=image.shape + (nslices, )) wvol[..., zero_slices:(2 * zero_slices)] = wimage[..., None] return vol, wvol
def get_warped_stacked_image(image, nslices, b, m): r""" Creates a volume by stacking copies of a deformed image The image is deformed under an invertible field, and a 3D volume is generated as follows: the first and last `nslices`//3 slices are filled with zeros to simulate background. The remaining middle slices are filled with copies of the deformed `image` under the action of the invertible field. Parameters ---------- image : 2d array shape(r, c) the image to be deformed nslices : int the number of slices in the final volume b, m : float parameters of the harmonic field (as in [1]). Returns ------- vol : array shape(r, c) if `nslices`==1 else (r, c, `nslices`) the volumed generated using the undeformed image wvol : array shape(r, c) if `nslices`==1 else (r, c, `nslices`) the volumed generated using the warped image References ---------- [1] Chen, M., Lu, W., Chen, Q., Ruchala, K. J., & Olivera, G. H. (2008). A simple fixed-point approach to invert a deformation field. Medical Physics, 35(1), 81. doi:10.1118/1.2816107 """ shape = image.shape # create a synthetic invertible map and warp the circle d, dinv = vfu.create_harmonic_fields_2d(shape[0], shape[1], b, m) d = np.asarray(d, dtype=floating) dinv = np.asarray(dinv, dtype=floating) mapping = DiffeomorphicMap(2, shape) mapping.forward, mapping.backward = d, dinv wimage = mapping.transform(image) if(nslices == 1): return image, wimage # normalize and form the 3d by piling slices image = image.astype(floating) image = (image - image.min()) / (image.max() - image.min()) zero_slices = nslices // 3 vol = np.zeros(shape=image.shape + (nslices,)) vol[..., zero_slices:(2 * zero_slices)] = image[..., None] wvol = np.zeros(shape=image.shape + (nslices,)) wvol[..., zero_slices:(2 * zero_slices)] = wimage[..., None] return vol, wvol