def apply_transform(x, transform_matrix, channel_axis=0, fill_mode='nearest', cval=0.0):
    "Applies the image transformation specified by a matrix.\n\n    # Arguments\n        x: 2D numpy array, single image.\n        transform_matrix: Numpy array specifying the geometric transformation.\n        channel_axis: Index of axis for channels in the input tensor.\n        fill_mode: Points outside the boundaries of the input\n            are filled according to the given mode\n            (one of `{'constant', 'nearest', 'reflect', 'wrap'}`).\n        cval: Value used for points outside the boundaries\n            of the input if `mode='constant'`.\n\n    # Returns\n        The transformed version of the input.\n    "
    x = np.rollaxis(x, channel_axis, 0)
    final_affine_matrix = transform_matrix[:2, :2]
    final_offset = transform_matrix[:2, 2]
    channel_images = [ndi.interpolation.affine_transform(x_channel, final_affine_matrix, final_offset, order=1, mode=fill_mode, cval=cval) for x_channel in x]
    x = np.stack(channel_images, axis=0)
    x = np.rollaxis(x, 0, (channel_axis + 1))
    return x
Applies the image transformation specified by a matrix.

# Arguments
    x: 2D numpy array, single image.
    transform_matrix: Numpy array specifying the geometric transformation.
    channel_axis: Index of axis for channels in the input tensor.
    fill_mode: Points outside the boundaries of the input
        are filled according to the given mode
        (one of `{'constant', 'nearest', 'reflect', 'wrap'}`).
    cval: Value used for points outside the boundaries
        of the input if `mode='constant'`.

# Returns
    The transformed version of the input.
def apply_transform(x, transform_matrix, channel_axis=0, fill_mode='nearest', cval=0.0):
    "Applies the image transformation specified by a matrix.\n\n    # Arguments\n        x: 2D numpy array, single image.\n        transform_matrix: Numpy array specifying the geometric transformation.\n        channel_axis: Index of axis for channels in the input tensor.\n        fill_mode: Points outside the boundaries of the input\n            are filled according to the given mode\n            (one of `{'constant', 'nearest', 'reflect', 'wrap'}`).\n        cval: Value used for points outside the boundaries\n            of the input if `mode='constant'`.\n\n    # Returns\n        The transformed version of the input.\n    "
    x = np.rollaxis(x, channel_axis, 0)
    final_affine_matrix = transform_matrix[:2, :2]
    final_offset = transform_matrix[:2, 2]
    channel_images = [ndi.interpolation.affine_transform(x_channel, final_affine_matrix, final_offset, order=1, mode=fill_mode, cval=cval) for x_channel in x]
    x = np.stack(channel_images, axis=0)
    x = np.rollaxis(x, 0, (channel_axis + 1))
    return x