def reorder_voxels_affine(input_ornt, output_ornt, shape, voxel_size): """Calculates a linear transformation equivalent to changing voxel order. Calculates a linear tranformation A such that [a, b, c, 1] = A[x, y, z, 1]. where [x, y, z] is a point in the coordinate system defined by input_ornt and [a, b, c] is the same point in the coordinate system defined by output_ornt. Parameters ---------- input_ornt : array (n, 2) A description of the orientation of a point in n-space. See ``nibabel.orientation`` or ``dipy.io.bvectxt`` for more information. output_ornt : array (n, 2) A description of the orientation of a point in n-space. shape : tuple of int Shape of the image in the input orientation. ``map = ornt_mapping(input_ornt, output_ornt)`` voxel_size : int Voxel size of the image in the input orientation. Returns ------- A : array (n+1, n+1) Affine matrix of the transformation between input_ornt and output_ornt. See Also -------- nibabel.orientation dipy.io.bvectxt.orientation_to_string dipy.io.bvectxt.orientation_from_string """ map = ornt_mapping(input_ornt, output_ornt) if input_ornt.shape != output_ornt.shape: raise ValueError("input_ornt and output_ornt must have the same shape") affine = eye(len(input_ornt)+1) affine[:3] = affine[map[:, 0]] corner = asarray(voxel_size) * shape affine[:3, 3] = (map[:, 1] < 0) * corner[map[:, 0]] # multiply the rows of affine to get right sign affine[:3, :3] *= map[:, 1:] return affine
def reorder_voxels_affine(input_ornt, output_ornt, shape, voxel_size): """Calculates a linear transformation equivalent to changing voxel order. Calculates a linear tranformation A such that [a, b, c, 1] = A[x, y, z, 1]. where [x, y, z] is a point in the coordinate system defined by input_ornt and [a, b, c] is the same point in the coordinate system defined by output_ornt. Parameters ---------- input_ornt : array (n, 2) A description of the orientation of a point in n-space. See ``nibabel.orientation`` or ``dipy.io.bvectxt`` for more information. output_ornt : array (n, 2) A description of the orientation of a point in n-space. shape : tuple of int Shape of the image in the input orientation. ``map = ornt_mapping(input_ornt, output_ornt)`` voxel_size : int Voxel size of the image in the input orientation. Returns ------- A : array (n+1, n+1) Affine matrix of the transformation between input_ornt and output_ornt. See Also -------- nibabel.orientation dipy.io.bvectxt.orientation_to_string dipy.io.bvectxt.orientation_from_string """ map = ornt_mapping(input_ornt, output_ornt) if input_ornt.shape != output_ornt.shape: raise ValueError("input_ornt and output_ornt must have the same shape") affine = eye(len(input_ornt)+1) affine[:3] = affine[map[:, 0]] corner = asarray(voxel_size) * shape affine[:3, 3] = (map[:, 1] < 0) * corner[map[:, 0]] # multiply the rows of affine to get right sign affine[:3, :3] *= map[:, 1:] return affine