diff --git a/attendance5.py b/attendance5.py new file mode 100644 index 0000000000000000000000000000000000000000..c2128965c253cfe58d818fedb28b804a54bc3f55 --- /dev/null +++ b/attendance5.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import numpy as np +import matplotlib.pyplot as plt +import imageio +from ex5 import GradientDescent + + +def Ja(x, f, h, lambda_): + energy = np.sum(np.square(x - f)) + lambda_ / h**2 * (np.sum(np.square(x[1:, :]-x[0:-1, :])) + np.sum(np.square(x[:, 1:]-x[:, 0:-1]))) + return energy + + +def DJa(x, f, h, lambda_): + grad = 2 * (x - f) + grad[0:-1, :] = grad[0:-1, :] - 2 * lambda_ / h**2 * (x[1:, :]-x[0:-1, :]) + grad[1:, :] = grad[1:, :] - 2 * lambda_ / h**2 * (x[0:-1, :] - x[1:, :]) + grad[:, 0:-1] = grad[:, 0:-1] - 2 * lambda_ / h**2 * (x[:, 1:]-x[:, 0:-1]) + grad[:, 1:] = grad[:, 1:] - 2 * lambda_ / h**2 * (x[:, 0:-1] - x[:, 1:]) + return grad + + +def Jb(x, f, h, lambda_, epsilon): + energy = np.sum(np.square(x - f)) + lambda_ / h * (np.sum(np.sqrt(np.square(x[1:, :] - x[0:-1, :]) + epsilon**2)) + np.sum(np.sqrt(np.square(x[:, 1:] - x[:, 0:-1]) + epsilon**2))) + return energy + + +def DJb(x, f, h, lambda_, epsilon): + grad = 2 * (x - f) + grad[0:-1, :] = grad[0:-1, :] - lambda_ / h * np.divide(x[1:, :] - x[0:-1, :], np.sqrt(np.square(x[1:, :] - x[0:-1, :]) + epsilon**2)) + grad[1:, :] = grad[1:, :] - lambda_ / h * np.divide(x[0:-1, :] - x[1:, :], np.sqrt(np.square(x[0:-1, :] - x[1:, :]) + epsilon**2)) + grad[:, 0:-1] = grad[:, 0:-1] - lambda_ / h * np.divide(x[:, 1:] - x[:, 0:-1], np.sqrt(np.square(x[:, 1:] - x[:, 0:-1]) + epsilon**2)) + grad[:, 1:] = grad[:, 1:] - lambda_ / h * np.divide(x[:, 0:-1] - x[:, 1:], np.sqrt(np.square(x[:, 0:-1] - x[:, 1:]) + epsilon**2)) + return grad + + +def main(): + # Load input image + print('reading file') + f0 = imageio.imread('https://www.cs.rug.nl/svcg/uploads/Shapes/dskel_mandrill_orig.png', as_gray=True)/255 + N = f0.shape[0] + M = f0.shape[1] + np.random.seed(42) + f = f0 + 0.5 * (np.random.rand(*f0.shape) - 0.5) + x0 = f + + # Set parameters; + lambda_ = 0.0005 + sigma = 0.5 + beta = 0.5 + h = 1 / (max(N, M) - 1) + epsilon = .001 + + # First functional + def Ea(x): return Ja(x, f, h, lambda_) + def DEa(x): return DJa(x, f, h, lambda_) + xa = GradientDescent(x0, Ea, DEa, beta, sigma, 1000, 0.001) + + # Second functional + def Eb(x): return Jb(x, f, h, lambda_, epsilon) + def DEb(x): return DJb(x, f, h, lambda_, epsilon) + xb = GradientDescent(x0, Eb, DEb, beta, sigma, 1000, 0.001) + + # Display input and result + plt.subplot(1, 3, 1) + plt.imshow(f, interpolation='nearest', cmap=plt.cm.get_cmap('gray'), vmin=0, vmax=1) + plt.axis('off') + plt.title('Input image f') + plt.subplot(1, 3, 2) + plt.imshow(xa, interpolation='nearest', cmap=plt.cm.get_cmap('gray'), vmin=0, vmax=1) + plt.axis('off') + plt.title('Result A') + plt.subplot(1, 3, 3) + plt.imshow(xb, interpolation='nearest', cmap=plt.cm.get_cmap('gray'), vmin=0, vmax=1) + plt.axis('off') + plt.title('Result B') + plt.show() + + +if __name__ == '__main__': + main()