# helpers fft = lambda x0: np.fft.ifftshift(np.fft.fft2(np.fft.fftshift( x0, axes=(0, 1)), axes=(0, 1)), axes=(0, 1)) ifft = lambda x0: np.fft.fftshift(np.fft.ifft2(np.fft.ifftshift( x0, axes=(0, 1)), axes=(0, 1)), axes=(0, 1)) # Sizes we want N, M, nc = 300, 192, 8 calib_lines = 20 # Make square kspace assert N >= M, 'First must be largest dim!' N2 = int(N/2) imspace = np.flipud( shepp_logan(N))[..., None]*gaussian_csm(N, N, nc) # Trim down to make nonsquare # 1st > 2nd trim = int((N - M)/2) pad = int(calib_lines/2) imspace1 = imspace[:, trim:-trim, :] kspace1 = fft(imspace1) calib1 = kspace1[N2-pad:N2+pad, ...].copy() kspace1[::2, ...] = 0 # Undersample: R=2 # 2nd > 1st imspace2 = imspace[trim:-trim, ...] kspace2 = fft(imspace2) calib2 = kspace2[:, N2-pad:N2+pad, :].copy() kspace2[:, ::2, :] = 0
'''Basic hp-GRAPPA usage.''' import numpy as np from mpl_toolkits.mplot3d import Axes3D # pylint: disable=W0611 # NOQA import matplotlib.pyplot as plt from phantominator import shepp_logan from pygrappa import hpgrappa, mdgrappa from utils import gaussian_csm if __name__ == '__main__': # The much abused Shepp-Logan phantom N, ncoil = 128, 5 ph = shepp_logan(N)[..., None]*gaussian_csm(N, N, ncoil) fov = (10e-2, 10e-2) # 10cm x 10cm FOV # k-space-ify it ax = (0, 1) kspace = np.fft.ifftshift(np.fft.fft2(np.fft.fftshift( ph, axes=ax), axes=ax), axes=ax) # Get an ACS region pad = 12 ctr = int(N/2) calib = kspace[ctr-pad:ctr+pad, ...].copy() # Undersample: R=3 kspace[0::3, ...] = 0 kspace[1::3, ...] = 0
from time import time import numpy as np import matplotlib.pyplot as plt from phantominator import shepp_logan from pygrappa import mdgrappa from utils import gaussian_csm if __name__ == '__main__': # Generate fake sensitivity maps: mps L, M, N = 128, 128, 2 ncoils = 4 mps = gaussian_csm(L, M, ncoils)[..., None, :] # generate 3D phantom ph = shepp_logan((L, M, N), zlims=(-.25, .25)) imspace = ph[..., None]*mps ax = (0, 1, 2) kspace = np.fft.fftshift(np.fft.fftn( np.fft.ifftshift(imspace, axes=ax), axes=ax), axes=ax) # calibrate a kernel kernel_size = (4, 5, 5) # undersample by a factor of 2 in both kx and ky mask = np.ones(kspace.shape, dtype=bool) mask[::2, 1::2, ...] = False mask[1::2, ::2, ...] = False
import numpy as np import matplotlib.pyplot as plt from phantominator import shepp_logan from skimage.metrics import normalized_root_mse as compare_nrmse # pylint: disable=E0611,E0401 from tqdm import tqdm from pygrappa import cgrappa as grappa from utils import gaussian_csm if __name__ == '__main__': # Simple phantom N = 128 ncoils = 5 csm = gaussian_csm(N, N, ncoils) ph = shepp_logan(N)[..., None] * csm # Put into k-space ax = (0, 1) kspace = np.fft.ifftshift(np.fft.fft2(np.fft.fftshift(ph, axes=ax), axes=ax), axes=ax) kspace_orig = kspace.copy() # 20x20 ACS region pad = 10 ctr = int(N / 2) calib = kspace[ctr - pad:ctr + pad, ctr - pad:ctr + pad, :].copy() # R=2x2
'''Basic usage of CG-SENSE implementation.''' import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable from phantominator import shepp_logan from pygrappa import cgsense from utils import gaussian_csm if __name__ == '__main__': N, nc = 128, 4 sens = gaussian_csm(N, N, nc) im = shepp_logan(N) + np.finfo('float').eps im = im[..., None] * sens kspace = np.fft.fftshift(np.fft.fft2(np.fft.ifftshift(im, axes=(0, 1)), axes=(0, 1)), axes=(0, 1)) # Undersample kspace[::2, 1::2, :] = 0 kspace[1::2, ::2, :] = 0 # SOS of the aliased image aliased = np.fft.ifftshift(np.fft.ifft2(np.fft.fftshift(kspace, axes=(0, 1)), axes=(0, 1)), axes=(0, 1)) aliased = np.sqrt(np.sum(np.abs(aliased)**2, axis=-1))