/usr/bin/dipy_peak_extraction is in python-dipy 0.10.1-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #! /usr/bin/python
import nibabel as nib
import numpy as np
from dipy.fixes import argparse
from dipy.core.ndindex import ndindex
from dipy.direction.peaks import peak_directions
from dipy.core.sphere import Sphere
def peak_extraction(odfs_file, sphere_vertices_file, out_file, relative_peak_threshold=.25,
peak_normalize=1, min_separation_angle=45., max_peak_number=5):
in_nifti = nib.load(odfs_file)
refaff = in_nifti.get_affine()
odfs = in_nifti.get_data()
vertices = np.loadtxt(sphere_vertices_file)
sphere = Sphere(xyz=vertices)
num_peak_coeffs = max_peak_number * 3
peaks = np.zeros(odfs.shape[:-1] + (num_peak_coeffs,))
for index in ndindex(odfs.shape[:-1]):
vox_peaks, values, _ = peak_directions(odfs[index], sphere,
float(relative_peak_threshold),
float(min_separation_angle))
if peak_normalize == 1:
values /= values[0]
vox_peaks = vox_peaks * values[:, None]
vox_peaks = vox_peaks.ravel()
m = vox_peaks.shape[0]
if m > num_peak_coeffs:
m = num_peak_coeffs
peaks[index][:m] = vox_peaks[:m]
peaks_img = nib.Nifti1Image(peaks.astype(np.float32), refaff)
nib.save(peaks_img, out_file)
def buildArgsParser():
description = 'Extract Peak Directions from Spherical function.'
p = argparse.ArgumentParser(description=description,
formatter_class=argparse.RawTextHelpFormatter)
p.add_argument(action='store', dest='spherical_functions_file',
help='Input nifti file representing the orientation '
'distribution function.')
p.add_argument(action='store', dest='sphere_vertices_file',
help="""Sphere vertices in a text file (Nx3)
x1 x2 x3
...
xN yN zN""")
p.add_argument(action='store', dest='out_file', type=str,
help='Output nifti file with the peak directions.')
p.add_argument('-t', '--peak_threshold', action='store',type=float,
dest='peak_thresh', metavar='float', required=False,
default=0.5, help='Relative peak threshold (default 0.5)')
p.add_argument('-n', '--peak_normalize', action='store', dest='peak_norm',
type=int, metavar='int', required=False, default=1,
help='Normalize peaks according to spherical function '
'value (default 1)')
p.add_argument('-a', '--angle', action='store', dest='angle', type=float,
metavar='float', required=False, default=25.0,
help='Minimum separation angle (default 25 degrees)')
p.add_argument('-m', '--max_peak_number', action='store', type=int,
dest='max_peak_num', metavar='int', required=False,
default=5,
help='Maximum number of peaks found (default 5 peaks)')
return p
def main():
parser = buildArgsParser()
args = parser.parse_args()
spherical_functions_file = args.spherical_functions_file
sphere_vertices_file = args.sphere_vertices_file
out_file = args.out_file
peak_thresh = args.peak_thresh
peak_norm = args.peak_norm
max_peak_num = args.max_peak_num
angle = args.angle
peak_extraction(spherical_functions_file, sphere_vertices_file, out_file,
relative_peak_threshold=peak_thresh,
peak_normalize=int(peak_norm), min_separation_angle=angle,
max_peak_number=int(max_peak_num))
if __name__ == "__main__":
main()
|