Ejemplo n.º 1
0
def generate_radoncdt():
    with np.load(join('optrans','datasets','adni_data.npz')) as data:
        X = data['X']
        y = data['y']

    img0 = signal_to_pdf(X.mean(axis=0))

    radoncdt = RadonCDT()
    rcdt = []
    transport_map = []
    displacements = []

    for i,img1 in enumerate(X):
        print('R-CDT {} of {}'.format(i+1, X.shape[0]))
        rcdt.append(radoncdt.forward(img0, img1))
        transport_map.append(radoncdt.transport_map_)
        displacements.append(radoncdt.displacements_)

    rcdt = np.array(rcdt)
    transport_map = np.array(transport_map)
    displacements = np.array(displacements)

    np.save(join('optrans','datasets','adni_img0'), img0)
    np.savez(join('optrans','datasets','adni_rcdt'), rcdt=rcdt, y=y)
    np.savez(join('optrans','datasets','adni_rcdt_maps'), y=y,
             transport_map=transport_map)
    np.savez(join('optrans','datasets','adni_rcdt_disp'), y=y,
             displacements=displacements)

    return
Ejemplo n.º 2
0
def generate_radoncdt():
    X, y = gaussians.load_data()

    n_imgs, h, w = X.shape
    img0 = signal_to_pdf(np.ones((h,w)))

    radoncdt = RadonCDT()
    rcdt = []
    transport_map = []
    displacements = []

    for i,img1 in enumerate(X):
        print('R-CDT {} of {}'.format(i+1, n_imgs))
        rcdt.append(radoncdt.forward(img0, img1))
        transport_map.append(radoncdt.transport_map_)
        displacements.append(radoncdt.displacements_)

    rcdt = np.array(rcdt)
    transport_map = np.array(transport_map)
    displacements = np.array(displacements)

    np.save(join('optrans','datasets','gaussians_img0'), img0)
    np.savez(join('optrans','datasets','gaussians_rcdt'), rcdt=rcdt, y=y)
    np.savez(join('optrans','datasets','gaussians_rcdt_maps'), y=y,
             transport_map=transport_map)
    np.savez(join('optrans','datasets','gaussians_rcdt_disp'), y=y,
             displacements=displacements)

    return
Ejemplo n.º 3
0
- SPOT2D

Liam Cattell -- June 2018
"""

# Load sample data
img0 = oasis.load_img0()
X, _, _ = oasis.load_data()
img1 = X[0]

# Convert images to PDFs
img0 = signal_to_pdf(img0, sigma=1., total=100.)
img1 = signal_to_pdf(img1, sigma=1., total=100.)

# Initialise optimal transport methods
methods = [RadonCDT(),
           VOT2D(alpha=0.001),
           MultiVOT2D(alpha=0.001),
           CLOT(lr=1e-7, tol=1e-4),
           SPOT2D()]

# Plot settings
fs = 16
vmin = min(img0.min(), img1.min())
vmax = max(img0.max(), img1.max())

# Initialise figure and plot original images
fig, ax = plt.subplots(3, len(methods)+1, sharex=True, sharey=True,
                       figsize=(12,6))
ax[0,0].imshow(img0, vmin=vmin, vmax=vmax)
ax[0,0].set_frame_on(False)
Ejemplo n.º 4
0
Liam Cattell -- June 2018
"""

# Create a reference image that integrates to 1
img0 = np.zeros((128, 128))
img0[96, 24] = 1.
img0 = signal_to_pdf(img0, sigma=5., total=1.)

# Create an image that also integrates to 1
img1 = np.zeros((128, 128))
img1[32, 78] = 1.
img1 = signal_to_pdf(img1, sigma=5., total=1.)

# Compute the forward transform of img1 w.r.t. img0
radoncdt = RadonCDT()
rcdt = radoncdt.forward(img0, img1)

# Reconstruct the original images
img1_recon = radoncdt.inverse()
img0_recon = radoncdt.apply_forward_map(radoncdt.transport_map_, img1)

# Plot the results
fig, ax = plt.subplots(3, 2, figsize=(6, 8))
ax[0, 0].imshow(img0)
ax[0, 0].set_title('Reference')
ax[0, 1].imshow(img1)
ax[0, 1].set_title('Image')
ax[1, 0].imshow(img0_recon)
ax[1, 0].set_title('Reconstructed\nreference')
ax[1, 1].imshow(img1_recon)
Ejemplo n.º 5
0
from optrans.visualization import plot_mode_image
from optrans.continuous import RadonCDT
"""
Perform PCA on Radon-CDT data, and plot a PCA mode of variation (in image
space) as a single image.

Liam Cattell -- March 2018
"""

# Load some Radon-CDT maps
X, y = adni.load_rcdt_maps()
img0 = adni.load_img0()

# Reshape data to be n_imgs-by-n_features
n_imgs, h, w = X.shape
X = X.reshape((n_imgs, h * w))

# Fit PCA transform
pca = PCA(n_components=5)
X_pca = pca.fit_transform(X)

# Plot mode of variation image
ax = plot_mode_image([pca],
                     component=0,
                     shape=(h, w),
                     transform=RadonCDT(),
                     img0=img0,
                     n_std=3,
                     n_steps=5)
plt.show()
Ejemplo n.º 6
0
"""

# Load a sample image
img = img_as_float(data.camera()[::2, ::2])

# Select two patches to be our sample images
img0 = img[50:162, 70:134]
img1 = img[32:144, 64:128]

# Convert images to PDFs
img0 = signal_to_pdf(img0, sigma=1.)
img1 = signal_to_pdf(img1, sigma=1.)

# Compute Radon-CDT of img1 w.r.t img0
theta = np.arange(0, 179, 2)
radoncdt = RadonCDT(theta=theta)
img1_hat = radoncdt.forward(img0, img1)

# Apply transport map in order to reconstruct images
img0_recon = radoncdt.apply_forward_map(radoncdt.transport_map_, img1)
img1_recon = radoncdt.apply_inverse_map(radoncdt.transport_map_, img0)
# img1_recon = radoncdt.inverse()

fig, ax = plt.subplots(3, 2)
ax[0, 0].imshow(img0)
ax[0, 0].set_title('Reference img0')
ax[0, 1].imshow(img1)
ax[0, 1].set_title('Image img1')
ax[1, 0].imshow(img0_recon)
ax[1, 0].set_title('Reconstructed img0')
ax[1, 1].imshow(img1_recon)
Liam Cattell -- January 2018
"""

# Create two translated delta functions as test signals
n = 128
img0 = np.zeros((n,n))
img1 = np.zeros((n,n))
img0[96,32] = 1.
img1[32,96] = 1.

# Smooth the delta functions into Gaussians and convert to PDFs
img0 = signal_to_pdf(img0, sigma=6.)
img1 = signal_to_pdf(img1, sigma=6.)

# Compute the Radon-CDT of img1 w.r.t. img0
radoncdt = RadonCDT()
rcdt = radoncdt.forward(img0, img1)

# Get the domain of our signal
x = radoncdt.transport_map_ + radoncdt.displacements_

# Get min/max intensities for plotting purposes
vmin = img0.min()
vmax = img0.max()

# Plot linear interpolation in signal space and Radon-CDT space
fig, ax = plt.subplots(2, 5, figsize=(10,6))
for i,alpha in enumerate(np.linspace(0, 1, 5)):
    # Interpolation in image space
    img_interp = (1. - alpha) * img0 + alpha * img1
    ax[0,i].imshow(img_interp, vmin=vmin, vmax=vmax)
Ejemplo n.º 8
0
    a.set_title("Component {}".format(i))

# Plot data projected along first two components
fig1, ax1 = plt.subplots(1, 1)
ax1.scatter(X_pca[:, 0], X_pca[:, 1])
ax1.set_xlabel('1st component')
ax1.set_ylabel('2nd component')

# Get the mode of variation along the first component
ind = 0
n_std = 2.
n_steps = 5
mode = get_mode_variation(pca, component=ind, n_std=n_std, n_steps=n_steps)

# Initialise Radon-CDT so we can compute inverse transform
radoncdt = RadonCDT()

# Get std dev. along component
std = np.sqrt(pca.explained_variance_[ind])
std_range = np.linspace(-n_std / 2, n_std / 2, n_steps)

# Plot mode of variation
fig2, ax2 = plt.subplots(1, n_steps)
for m, s, a in zip(mode, std_range, ax2):
    img_recon = radoncdt.apply_inverse_map(m.reshape((h, w)), img0)
    a.imshow(img_recon)
    a.set_title("{:.2f}$\sigma$".format(s))

# Get histogram of data projected on to component
hist, bin_centers = get_mode_histogram(X_pca / std,
                                       y,