|
| 1 | +import os |
| 2 | +from os.path import join as jph |
| 3 | + |
| 4 | +import numpy as np |
| 5 | +import nibabel as nib |
| 6 | +from nose.tools import assert_raises, assert_almost_equal, assert_equal, assert_equals |
| 7 | +from numpy.testing import assert_array_equal |
| 8 | + |
| 9 | +from nilabels.tools.caliber.volumes_and_values import get_total_num_nonzero_voxels, get_num_voxels_from_labels_list, \ |
| 10 | + get_values_below_labels_list |
| 11 | + |
| 12 | + |
| 13 | +def cube_shape(omega, center, side_length, background_intensity=0, foreground_intensity=100, dtype=np.uint8): |
| 14 | + sky = background_intensity * np.ones(omega, dtype=dtype) |
| 15 | + half_side_length = int(np.ceil(int(side_length / 2))) |
| 16 | + |
| 17 | + for lx in range(-half_side_length, half_side_length + 1): |
| 18 | + for ly in range(-half_side_length, half_side_length + 1): |
| 19 | + for lz in range(-half_side_length, half_side_length + 1): |
| 20 | + sky[center[0] + lx, center[1] + ly, center[2] + lz] = foreground_intensity |
| 21 | + return sky |
| 22 | + |
| 23 | + |
| 24 | +def test_volumes_and_values_total_num_voxels(): |
| 25 | + |
| 26 | + omega = [80, 80, 80] |
| 27 | + cube_a = [[10, 60, 55], 11, 1] |
| 28 | + cube_b = [[50, 55, 42], 17, 2] |
| 29 | + cube_c = [[25, 20, 20], 19, 3] |
| 30 | + cube_d = [[55, 16, 9], 9, 4] |
| 31 | + |
| 32 | + sky = cube_shape(omega, center=cube_a[0], side_length=cube_a[1], foreground_intensity=cube_a[2]) + \ |
| 33 | + cube_shape(omega, center=cube_b[0], side_length=cube_b[1], foreground_intensity=cube_b[2]) + \ |
| 34 | + cube_shape(omega, center=cube_c[0], side_length=cube_c[1], foreground_intensity=cube_c[2]) + \ |
| 35 | + cube_shape(omega, center=cube_d[0], side_length=cube_d[1], foreground_intensity=cube_d[2]) |
| 36 | + im_segm = nib.Nifti1Image(sky, affine=np.eye(4)) |
| 37 | + |
| 38 | + num_voxels = get_total_num_nonzero_voxels(im_segm) |
| 39 | + assert_equal(num_voxels, 11 ** 3 + 17 ** 3 + 19 ** 3 + 9 **3) |
| 40 | + |
| 41 | + num_voxels = get_total_num_nonzero_voxels(im_segm, list_labels_to_exclude=[2, 4]) |
| 42 | + assert_equal(num_voxels, 11 ** 3 + 19 ** 3) |
| 43 | + |
| 44 | + |
| 45 | +def test_volumes_and_values_total_num_voxels_empthy(): |
| 46 | + |
| 47 | + omega = [80, 80, 80] |
| 48 | + im_segm = nib.Nifti1Image(np.zeros(omega), affine=np.eye(4)) |
| 49 | + |
| 50 | + num_voxels = get_total_num_nonzero_voxels(im_segm) |
| 51 | + print(num_voxels) |
| 52 | + assert_equal(num_voxels, 0) |
| 53 | + |
| 54 | + |
| 55 | +def test_volumes_and_values_total_num_voxels_full(): |
| 56 | + |
| 57 | + omega = [80, 80, 80] |
| 58 | + im_segm = nib.Nifti1Image(np.ones(omega), affine=np.eye(4)) |
| 59 | + |
| 60 | + num_voxels = get_total_num_nonzero_voxels(im_segm) |
| 61 | + print(num_voxels) |
| 62 | + assert_equal(num_voxels, 80 ** 3) |
| 63 | + |
| 64 | + |
| 65 | +def test_get_num_voxels_from_labels_list(): |
| 66 | + |
| 67 | + omega = [80, 80, 80] |
| 68 | + cube_a = [[10, 60, 55], 11, 1] |
| 69 | + cube_b = [[50, 55, 42], 15, 2] |
| 70 | + cube_c = [[25, 20, 20], 13, 3] |
| 71 | + cube_d = [[55, 16, 9], 7, 4] |
| 72 | + |
| 73 | + sky = cube_shape(omega, center=cube_a[0], side_length=cube_a[1], foreground_intensity=cube_a[2]) + \ |
| 74 | + cube_shape(omega, center=cube_b[0], side_length=cube_b[1], foreground_intensity=cube_b[2]) + \ |
| 75 | + cube_shape(omega, center=cube_c[0], side_length=cube_c[1], foreground_intensity=cube_c[2]) + \ |
| 76 | + cube_shape(omega, center=cube_d[0], side_length=cube_d[1], foreground_intensity=cube_d[2]) |
| 77 | + im_segm = nib.Nifti1Image(sky, affine=np.eye(4)) |
| 78 | + |
| 79 | + num_voxels = get_num_voxels_from_labels_list(im_segm, labels_list=[1, 2, 3, 4]) |
| 80 | + print(num_voxels, [11 **3, 15 **3, 13 **3, 7 ** 3]) |
| 81 | + assert_array_equal(num_voxels, [11 **3, 15 **3, 13 **3, 7 ** 3]) |
| 82 | + |
| 83 | + num_voxels = get_num_voxels_from_labels_list(im_segm, labels_list=[1, [2, 3], 4]) |
| 84 | + print(num_voxels, [11 ** 3, 15 ** 3 + 13 ** 3, 7 ** 3]) |
| 85 | + assert_array_equal(num_voxels, [11 ** 3, 15 ** 3 + 13 ** 3, 7 ** 3]) |
| 86 | + |
| 87 | + num_voxels = get_num_voxels_from_labels_list(im_segm, labels_list=[[1, 2, 3], 4]) |
| 88 | + print(num_voxels, [11 ** 3, 15 ** 3 + 13 ** 3, 7 ** 3]) |
| 89 | + assert_array_equal(num_voxels, [11 ** 3 + 15 ** 3 + 13 ** 3, 7 ** 3]) |
| 90 | + |
| 91 | + num_voxels = get_num_voxels_from_labels_list(im_segm, labels_list=[[1, 2, 3, 4]]) |
| 92 | + print(num_voxels, [11 ** 3, 15 ** 3 + 13 ** 3, 7 ** 3]) |
| 93 | + assert_array_equal(num_voxels, [11 ** 3 + 15 ** 3 + 13 ** 3 + 7 ** 3]) |
| 94 | + |
| 95 | + |
| 96 | +def test_get_num_voxels_from_labels_list_unexisting_labels(): |
| 97 | + |
| 98 | + omega = [80, 80, 80] |
| 99 | + cube_a = [[10, 60, 55], 11, 1] |
| 100 | + cube_b = [[50, 55, 42], 15, 2] |
| 101 | + cube_c = [[25, 20, 20], 13, 3] |
| 102 | + cube_d = [[55, 16, 9], 7, 4] |
| 103 | + |
| 104 | + sky = cube_shape(omega, center=cube_a[0], side_length=cube_a[1], foreground_intensity=cube_a[2]) + \ |
| 105 | + cube_shape(omega, center=cube_b[0], side_length=cube_b[1], foreground_intensity=cube_b[2]) + \ |
| 106 | + cube_shape(omega, center=cube_c[0], side_length=cube_c[1], foreground_intensity=cube_c[2]) + \ |
| 107 | + cube_shape(omega, center=cube_d[0], side_length=cube_d[1], foreground_intensity=cube_d[2]) |
| 108 | + im_segm = nib.Nifti1Image(sky, affine=np.eye(4)) |
| 109 | + |
| 110 | + num_voxels = get_num_voxels_from_labels_list(im_segm, labels_list=[1, 2, 3, 5]) |
| 111 | + print(num_voxels, [11 ** 3, 15 ** 3, 13 ** 3, 0]) |
| 112 | + assert_array_equal(num_voxels, [11 ** 3, 15 ** 3, 13 ** 3, 0]) |
| 113 | + |
| 114 | + num_voxels = get_num_voxels_from_labels_list(im_segm, labels_list=[1, 2, [3, 5]]) |
| 115 | + print(num_voxels, [11 ** 3, 15 ** 3, 13 ** 3 + 0]) |
| 116 | + assert_array_equal(num_voxels, [11 ** 3, 15 ** 3, 13 ** 3 + 0]) |
| 117 | + |
| 118 | + num_voxels = get_num_voxels_from_labels_list(im_segm, labels_list=[[1, 2], [7, 8]]) |
| 119 | + print(num_voxels, [11 ** 3 + 15 ** 3, 0]) |
| 120 | + assert_array_equal(num_voxels, [11 ** 3 + 15 ** 3, 0]) |
| 121 | + |
| 122 | + num_voxels = get_num_voxels_from_labels_list(im_segm, labels_list=[[1, 2], [7, -8]]) |
| 123 | + print(num_voxels, [11 ** 3 + 15 ** 3, 0]) |
| 124 | + assert_array_equal(num_voxels, [11 ** 3 + 15 ** 3, 0]) |
| 125 | + |
| 126 | + |
| 127 | +def test_get_values_below_labels_list(): |
| 128 | + omega = [80, 80, 80] |
| 129 | + |
| 130 | + cube_a_seg = [[10, 60, 55], 11, 1] |
| 131 | + cube_b_seg = [[50, 55, 42], 15, 2] |
| 132 | + cube_c_seg = [[25, 20, 20], 13, 3] |
| 133 | + cube_d_seg = [[55, 16, 9], 7, 4] |
| 134 | + |
| 135 | + cube_a_anat = [[10, 60, 55], 11, 1.5] |
| 136 | + cube_b_anat = [[50, 55, 42], 15, 2.5] |
| 137 | + cube_c_anat = [[25, 20, 20], 13, 3.5] |
| 138 | + cube_d_anat = [[55, 16, 9], 7, 4.5] |
| 139 | + |
| 140 | + sky_s = cube_shape(omega, center=cube_a_seg[0], side_length=cube_a_seg[1], foreground_intensity=cube_a_seg[2]) |
| 141 | + sky_s += cube_shape(omega, center=cube_b_seg[0], side_length=cube_b_seg[1], foreground_intensity=cube_b_seg[2]) |
| 142 | + sky_s += cube_shape(omega, center=cube_c_seg[0], side_length=cube_c_seg[1], foreground_intensity=cube_c_seg[2]) |
| 143 | + sky_s += cube_shape(omega, center=cube_d_seg[0], side_length=cube_d_seg[1], foreground_intensity=cube_d_seg[2]) |
| 144 | + |
| 145 | + sky_a = cube_shape(omega, center=cube_a_anat[0], side_length=cube_a_anat[1], foreground_intensity=cube_a_anat[2], dtype=np.float32) |
| 146 | + sky_a += cube_shape(omega, center=cube_b_anat[0], side_length=cube_b_anat[1], foreground_intensity=cube_b_anat[2], dtype=np.float32) |
| 147 | + sky_a += cube_shape(omega, center=cube_c_anat[0], side_length=cube_c_anat[1], foreground_intensity=cube_c_anat[2], dtype=np.float32) |
| 148 | + sky_a += cube_shape(omega, center=cube_d_anat[0], side_length=cube_d_anat[1], foreground_intensity=cube_d_anat[2], dtype=np.float32) |
| 149 | + |
| 150 | + im_segm = nib.Nifti1Image(sky_s, affine=np.eye(4)) |
| 151 | + im_anat = nib.Nifti1Image(sky_a, affine=np.eye(4)) |
| 152 | + |
| 153 | + assert im_segm.shape == im_anat.shape |
| 154 | + |
| 155 | + labels_list = [[1, 2], [3, 4], 4] |
| 156 | + |
| 157 | + vals_below = get_values_below_labels_list(im_segm, im_anat, labels_list) |
| 158 | + |
| 159 | + assert_array_equal(vals_below[0], np.array([1.5, ] * (11**3) + [2.5] * (15**3)) ) |
| 160 | + assert_array_equal(vals_below[1], np.array([3.5, ] * (13**3) + [4.5] * (7**3)) ) |
| 161 | + assert_array_equal(vals_below[2], np.array([4.5] * (7 ** 3))) |
| 162 | + |
0 commit comments