def batch_displacement_warp2d(imgs, vector_fields): """ warp images by free form transformation Parameters ---------- imgs : tf.Tensor images to be warped [n_batch, xlen, ylen, n_channel] vector_fields : tf.Tensor [n_batch, 2, xlen, ylen] Returns ------- output : tf.Tensor warped imagees [n_batch, xlen, ylen, n_channel] """ n_batch = tf.shape(imgs)[0] xlen = tf.shape(imgs)[1] ylen = tf.shape(imgs)[2] grids = batch_mgrid(n_batch, xlen, ylen) T_g = grids + vector_fields output = batch_warp2d(imgs, T_g) return output
def batch_affine_warp2d(imgs, theta): """ affine transforms 2d images Parameters ---------- imgs : tf.Tensor images to be warped [n_batch, xlen, ylen, n_channel] theta : tf.Tensor parameters of affine transformation [n_batch, 6] Returns ------- output : tf.Tensor warped images [n_batch, xlen, ylen, n_channel] """ n_batch = tf.shape(imgs)[0] xlen = tf.shape(imgs)[1] ylen = tf.shape(imgs)[2] theta = tf.reshape(theta, [-1, 2, 3]) matrix = tf.slice(theta, [0, 0, 0], [-1, -1, 2]) t = tf.slice(theta, [0, 0, 2], [-1, -1, -1]) grids = batch_mgrid(n_batch, xlen, ylen) coords = tf.reshape(grids, [n_batch, 2, -1]) T_g = tf.batch_matmul(matrix, coords) + t T_g = tf.reshape(T_g, [n_batch, 2, xlen, ylen]) output = batch_warp2d(imgs, T_g) return output
def batch_displacement_warp2d(imgs, vector_fields, vector_fields_in_pixel_space=False): """ warp images by free form transformation Parameters ---------- imgs : tf.Tensor images to be warped [n_batch, xlen, ylen, n_channel] vector_fields : tf.Tensor [n_batch, xlen, ylen, 2] vector_fields_in_pixel_space: boolean If vector_fields_in_pixel_space, it means that the displacements in the vector field are expressed in pixels. Therefore, they will be rescaled from imagen domain to [-1.,1.][-1.,1.] to make it compatible with the convention used by the warper. Returns ------- output : tf.Tensor warped imagees [n_batch, xlen, ylen, n_channel] """ # Transpose the vector field to [n_batch, 2, xlen, ylen] vector_fields_transposed = tf.transpose(vector_fields, [0, 3, 1, 2]) n_batch = tf.shape(imgs)[0] xlen = tf.shape(imgs)[1] ylen = tf.shape(imgs)[2] grids = batch_mgrid(n_batch, xlen, ylen) if vector_fields_in_pixel_space: # Scale the vector field from image domain to [-1.,1.][-1.,1.] vector_fields_transposed_rescaled = tf.stack( [(2. * vector_fields_transposed[:, 0, :, :]) / (tf.to_float(xlen) - 1.), (2. * vector_fields_transposed[:, 1, :, :]) / (tf.to_float(ylen) - 1.)], 1) T_g = grids + vector_fields_transposed_rescaled else: T_g = grids + vector_fields_transposed return batch_warp2d(imgs, T_g)