|
@@ -29,26 +29,22 @@
|
|
|
"outputs": [],
|
|
|
"source": [
|
|
|
"import numpy\n",
|
|
|
- "from freesurfer_surface import Label, Vertex\n",
|
|
|
+ "from freesurfer_surface import PolygonalChain, Vertex\n",
|
|
|
"\n",
|
|
|
"def unit_vector(vector: numpy.array) -> numpy.array:\n",
|
|
|
" return vector / numpy.linalg.norm(vector)\n",
|
|
|
"\n",
|
|
|
- "def add_border_around_labelled_surface(label: Label, border_length_add_mm: float,\n",
|
|
|
- " border_height_mm: float, border_width_mm: float):\n",
|
|
|
- " border_chain, = surface.find_label_border_polygonal_chains(label)\n",
|
|
|
- " print('#{}/{}: {} border segments'.format(label.index, \n",
|
|
|
- " label.name,\n",
|
|
|
- " len(border_chain.vertex_indices)))\n",
|
|
|
+ "def add_blocks_along(border_chain: PolygonalChain, length_add_mm: float,\n",
|
|
|
+ " height_mm: float, width_mm: float):\n",
|
|
|
" for vertex_triplet_indices in border_chain.adjacent_vertex_indices(3):\n",
|
|
|
" vertex_triplet_coords = tuple(numpy.array(surface.vertices[idx])\n",
|
|
|
" for idx in vertex_triplet_indices)\n",
|
|
|
" backward_vector = vertex_triplet_coords[0] - vertex_triplet_coords[1]\n",
|
|
|
" forward_vector = vertex_triplet_coords[2] - vertex_triplet_coords[1]\n",
|
|
|
" forward_vector = unit_vector(forward_vector) \\\n",
|
|
|
- " * (numpy.linalg.norm(forward_vector) + border_length_add_mm)\n",
|
|
|
- " upward_vector = unit_vector(numpy.cross(backward_vector, forward_vector)) * border_height_mm / 2\n",
|
|
|
- " sideward_vector = unit_vector(numpy.cross(upward_vector, forward_vector)) * border_width_mm / 2\n",
|
|
|
+ " * (numpy.linalg.norm(forward_vector) + length_add_mm)\n",
|
|
|
+ " upward_vector = unit_vector(numpy.cross(backward_vector, forward_vector)) * height_mm / 2\n",
|
|
|
+ " sideward_vector = unit_vector(numpy.cross(upward_vector, forward_vector)) * width_mm / 2\n",
|
|
|
" base_corners = [vertex_triplet_coords[1] + v\n",
|
|
|
" for v in [-upward_vector -sideward_vector,\n",
|
|
|
" -upward_vector +sideward_vector,\n",
|
|
@@ -74,18 +70,22 @@
|
|
|
"name": "stdout",
|
|
|
"output_type": "stream",
|
|
|
"text": [
|
|
|
- "#17/paracentral: 167 border segments\n",
|
|
|
- "#22/postcentral: 396 border segments\n",
|
|
|
- "#24/precentral: 418 border segments\n"
|
|
|
+ "#8: inferiorparietal (borders: 1)\n",
|
|
|
+ "#17: paracentral (borders: 1)\n",
|
|
|
+ "#22: postcentral (borders: 1)\n",
|
|
|
+ "#24: precentral (borders: 1)\n",
|
|
|
+ "#29: superiorparietal (borders: 1)\n"
|
|
|
]
|
|
|
}
|
|
|
],
|
|
|
"source": [
|
|
|
- "for label in filter(lambda l: 'central' in l.name, surface.annotation.labels.values()):\n",
|
|
|
- " add_border_around_labelled_surface(label,\n",
|
|
|
- " border_length_add_mm=0.2,\n",
|
|
|
- " border_height_mm=1.5,\n",
|
|
|
- " border_width_mm=1.0)\n",
|
|
|
+ "for label in filter(lambda l: 'central' in l.name or 'parietal' in l.name,\n",
|
|
|
+ " surface.annotation.labels.values()):\n",
|
|
|
+ " borders = list(surface.find_label_border_polygonal_chains(label))\n",
|
|
|
+ " print('#{}: {} (borders: {})'.format(label.index, label.name, len(borders)))\n",
|
|
|
+ " for border in borders:\n",
|
|
|
+ " add_blocks_along(border, length_add_mm=0.2,\n",
|
|
|
+ " height_mm=1.5, width_mm=1.0)\n",
|
|
|
" \n",
|
|
|
"surface.write_triangular('border.lh.pial')"
|
|
|
]
|
|
@@ -95,7 +95,7 @@
|
|
|
"metadata": {},
|
|
|
"source": [
|
|
|
"```sh\n",
|
|
|
- "freeview --surface examples/precentral-border.lh.pial:annot=tests/subjects/fabian/label/lh.aparc.annot\n",
|
|
|
+ "freeview --surface examples/border.lh.pial:annot=tests/subjects/fabian/label/lh.aparc.annot\n",
|
|
|
"```"
|
|
|
]
|
|
|
}
|