Source code for image

"""
image warping using SRVF framework

moduleauthor:: J. Derek Tucker <jdtuck@sandia.gov>

"""

import numpy as np
import fdasrsf.image_functions as fif
import cimage as im


[docs]def reparam_image(It, Im, gam=None, b=None, stepsize=1e-4, itermax=20): """ This function warps an image to another using SRVF framework :param Im: numpy ndarray of shape (N,N) representing a NxN image :param Im: numpy ndarray of shape (N,N) representing a NxN image :param gam: numpy ndarray of shape (N,N) representing an initial warping function :param b: numpy ndarray representing basis matrix :rtype: numpy ndarray :return gamnew: diffeomorphism :return Inew: warped image :return H: energy :return stepsize: final stepsize """ m = It.shape[0] n = It.shape[1] gamid = fif.makediffeoid(m,n) if gam is None: gam = gamid.copy() if b is None: M = 10 basetype = 't' b = fif.formbasisTid(M, m, n, basetype) # main loop H = np.zeros(itermax+1) Iold = fif.apply_gam_imag(Im, gam) Iold -= Iold.min() Iold /= Iold.max() qt = fif.image_to_q(It) qm = fif.image_to_q(Iold) gamold = gam.copy() gamnew = gamold.copy() Inew = Iold.copy() iter = 0 H[iter] = fif.compEnergy(qt,qm) print('Iteration %d, energy %f\n'% (iter,H[iter])) gamupdate = fif.updateGam(qt,qm,b) cutoff = 1e-3 for iter in range(1,itermax+1): gaminc = gamid + stepsize*gamupdate G = im.check_crossing(gamnew) if G == 0: print('Possible crossing!\n') gamnew = gamold.copy() stepsize *= 0.67 H[iter] = H[iter-1] continue else: gamnew = fif.apply_gam_gamid(gamnew,gaminc) Inew = fif.apply_gam_imag(Im, gamnew) Inew -= Inew.min() Inew /= Inew.max() qm = fif.image_to_q(Inew) H[iter] = fif.compEnergy(qt,qm) print('Iteration %d, energy %f\n'% (iter,H[iter])) if (iter > 4): hstop = 1 for i in range(4): hstop *= (H[iter] >= H[iter-i]) if hstop != 0: print('Warning: energy constantly increasing\n') break if (iter > 4) and (np.abs(H[iter] <= H[iter-1])<cutoff and np.abs(H[iter-1] - H[iter-2])<cutoff and np.abs(H[iter-2] <= H[iter-3])<cutoff): print('Warning: energy is not changing\n') break if ((iter > 1) and (H[iter] > H[iter-1])) or ((iter > 3) and ((H[iter-1] <= H[iter-2]) and (H[iter-2] > H[iter-3]))): stepsize *= 0.9 gamnew = gamold.copy() H[iter] = H[iter-1] continue gamold = gamnew.copy() gamupdate = fif.updateGam(qt,qm,b) H = H[0:iter] return gamnew,Inew,H,stepsize