Switch to unified view

a b/docs/mesh/meshRegistration.html
1
<!doctype html>
2
<html lang="en">
3
<head>
4
<meta charset="utf-8">
5
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
6
<meta name="generator" content="pdoc 0.10.0" />
7
<title>pymskt.mesh.meshRegistration API documentation</title>
8
<meta name="description" content="" />
9
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
10
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
11
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
12
<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
13
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
14
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
15
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
16
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
17
</head>
18
<body>
19
<main>
20
<article id="content">
21
<header>
22
<h1 class="title">Module <code>pymskt.mesh.meshRegistration</code></h1>
23
</header>
24
<section id="section-intro">
25
<details class="source">
26
<summary>
27
<span>Expand source code</span>
28
</summary>
29
<pre><code class="python">import sys
30
import vtk 
31
try:
32
     import pyfocusr
33
except ModuleNotFoundError:
34
    print(&#39;pyfocusr not found&#39;)
35
    print(&#39;If you are not using the registration tools, you can ignore this message.&#39;)
36
    print(&#39;install pyfocusr as described in the README: https://github.com/gattia/pymskt&#39;)
37
    print(&#39;or visit the pyfocusr github repo: https://github.com/gattia/pyfocusr&#39;)
38
39
import numpy as np
40
41
def get_icp_transform(source, target, max_n_iter=1000, n_landmarks=1000, reg_mode=&#39;similarity&#39;):
42
    &#34;&#34;&#34;
43
    Get the Interative Closest Point (ICP) transformation from the `source` mesh to the
44
    `target` mesh. 
45
46
    Parameters
47
    ----------
48
    source : vtk.vtkPolyData
49
        Source mesh that we want to transform onto the target mesh. 
50
    target : vtk.vtkPolyData
51
        Target mesh that we want to transform the source mesh onto. 
52
    max_n_iter : int, optional
53
        Max number of iterations for the registration algorithm to perform, by default 1000
54
    n_landmarks : int, optional
55
        How many landmarks to sample when determining distance between meshes &amp; 
56
        solving for the optimal transformation, by default 1000
57
    reg_mode : str, optional
58
        The type of registration to perform. The options are: 
59
            - &#39;rigid&#39;: true rigid, translation only 
60
            - &#39;similarity&#39;: rigid + equal scale 
61
        by default &#39;similarity&#39;
62
63
    Returns
64
    -------
65
    vtk.vtkIterativeClosestPointTransform
66
        The actual transform object after running the registration. 
67
    &#34;&#34;&#34;    
68
69
    icp = vtk.vtkIterativeClosestPointTransform()
70
    icp.SetSource(source)
71
    icp.SetTarget(target)
72
    if reg_mode == &#39;rigid&#39;:
73
        icp.GetLandmarkTransform().SetModeToRigidBody()
74
    elif reg_mode == &#39;similarity&#39;:
75
        icp.GetLandmarkTransform().SetModeToSimilarity()
76
    icp.SetMaximumNumberOfIterations(max_n_iter)
77
    icp.StartByMatchingCentroidsOn()
78
    icp.Modified()
79
    icp.Update()
80
    icp.SetMaximumNumberOfLandmarks(n_landmarks)
81
    return icp
82
83
def non_rigidly_register(
84
    target_mesh=None,
85
    source_mesh=None,
86
    final_pt_location=&#39;weighted_average&#39;,   # &#39;weighted_average&#39; or &#39;nearest_neighbour&#39;
87
    icp_register_first=True,                # Get bones/objects into roughly the same alignment first
88
    icp_registration_mode=&#39;similarity&#39;,     # similarity = rigid + scaling (isotropic), (&#34;rigid&#34;, &#34;similarity&#34;, &#34;affine&#34;)
89
    icp_reg_target_to_source=True,          # For shape models, the source is usually the reference so we want target in its space (true)
90
    n_spectral_features=3,
91
    n_extra_spectral=3,                     # For ensuring we have the right spec coords - determined using wasserstein distances. 
92
    target_eigenmap_as_reference=True,
93
    get_weighted_spectral_coords=False,
94
    list_features_to_calc=[&#39;curvature&#39;],    # &#39;curvature&#39;, min_curvature&#39; &#39;max_curvature&#39; (other features for registration)
95
    use_features_as_coords=True,            # During registraiton - do we want to use curvature etc. 
96
    rigid_reg_max_iterations=100,
97
    non_rigid_alpha=0.01,
98
    non_rigid_beta=50,
99
    non_rigid_n_eigens=100,                 # number of eigens for low rank CPD registration
100
    non_rigid_max_iterations=500,
101
    rigid_before_non_rigid_reg=False,       # This is of the spectral coordinates - not the x/y/z used in icp_register_first
102
    projection_smooth_iterations=30,        # Used for distributing registered points onto target surface - helps preserve diffeomorphism
103
    graph_smoothing_iterations=300,         # For smoothing the target mesh before final point correspondence
104
    feature_smoothing_iterations=30,        # how much should features (curvature) be smoothed before registration 
105
    include_points_as_features=False,       # Do we want to incldue x/y/z positions in registration? 
106
    norm_physical_and_spectral=True,        # set standardized mean and variance for each feature
107
    feature_weights=np.diag([.1,.1]),       # should we weight the extra features (curvature) more/less than spectral
108
    n_coords_spectral_ordering=20000,       # How many points on mesh to use for ordering spectral coordinates ()
109
    n_coords_spectral_registration=1000,    # How many points to use for spectral registrtaion (usually random subsample)
110
    initial_correspondence_type=&#39;kd&#39;,       # kd = nearest neightbor, hungarian = minimum cost of assigning between graphs (more compute heavy)
111
    final_correspondence_type=&#39;kd&#39;          # kd = nearest neightbor, hungarian = minimum cost of assigning between graphs (more compute heavy)
112
):
113
    
114
    if &#39;pyfocusr&#39; not in sys.modules:
115
        raise ModuleNotFoundError(&#39;pyfocusr is not installed &amp; is necessary for non-rigid registration.&#39;)
116
117
    if final_pt_location not in [&#39;weighted_average&#39;, &#39;nearest_neighbour&#39;]:
118
        raise Exception(&#39;Did not specify appropriate final_pt_location, must be either &#34;weighted_average&#34;, or &#34;nearest_neighbour&#34;&#39;)
119
120
    # Test if mesh is a vtk mesh, or a pymsky.Mesh object. 
121
    if isinstance(target_mesh, vtk.vtkPolyData):
122
        vtk_mesh_target = target_mesh
123
    else:
124
        try:
125
            vtk_mesh_target = target_mesh.mesh
126
        except:
127
            raise Exception(f&#39;expected type vtk.vtkPolyData or pymskt.mesh.Mesh, got: {type(target_mesh)}&#39;)
128
    
129
    if isinstance(source_mesh, vtk.vtkPolyData):
130
        vtk_mesh_source = source_mesh
131
    else:
132
        try:
133
            vtk_mesh_source = source_mesh.mesh
134
        except:
135
            raise Exception(f&#39;expected type vtk.vtkPolyData or pymskt.mesh.Mesh, got: {type(target_mesh)}&#39;)
136
    
137
    reg = pyfocusr.Focusr(
138
        vtk_mesh_target=vtk_mesh_target, 
139
        vtk_mesh_source=vtk_mesh_source,  
140
        icp_register_first=icp_register_first,
141
        icp_registration_mode=icp_registration_mode,
142
        icp_reg_target_to_source=icp_reg_target_to_source,
143
        n_spectral_features=n_spectral_features,
144
        n_extra_spectral=n_extra_spectral,
145
        target_eigenmap_as_reference=target_eigenmap_as_reference,
146
        get_weighted_spectral_coords=get_weighted_spectral_coords,
147
        list_features_to_calc=list_features_to_calc,
148
        use_features_as_coords=use_features_as_coords,
149
        rigid_reg_max_iterations=rigid_reg_max_iterations,
150
        non_rigid_alpha=non_rigid_alpha,
151
        non_rigid_beta=non_rigid_beta,
152
        non_rigid_n_eigens=non_rigid_n_eigens,
153
        non_rigid_max_iterations=non_rigid_max_iterations,
154
        rigid_before_non_rigid_reg=rigid_before_non_rigid_reg,
155
        projection_smooth_iterations=projection_smooth_iterations,
156
        graph_smoothing_iterations=graph_smoothing_iterations,
157
        feature_smoothing_iterations=feature_smoothing_iterations,
158
        include_points_as_features=include_points_as_features,
159
        norm_physical_and_spectral=norm_physical_and_spectral,
160
        feature_weights=feature_weights,
161
        n_coords_spectral_ordering=n_coords_spectral_ordering,
162
        n_coords_spectral_registration=n_coords_spectral_registration,
163
        initial_correspondence_type=initial_correspondence_type,
164
        final_correspondence_type=final_correspondence_type
165
    ) 
166
    reg.align_maps()
167
168
    if final_pt_location == &#39;weighted_average&#39;:
169
        reg.get_source_mesh_transformed_weighted_avg()
170
        mesh_transformed_to_target = reg.weighted_avg_transformed_mesh
171
    elif final_pt_location == &#39;nearest_neighbour&#39;:
172
        reg.get_source_mesh_transformed_nearest_neighbour()
173
        mesh_transformed_to_target = reg.nearest_neighbour_transformed_mesh
174
        
175
    return mesh_transformed_to_target    </code></pre>
176
</details>
177
</section>
178
<section>
179
</section>
180
<section>
181
</section>
182
<section>
183
<h2 class="section-title" id="header-functions">Functions</h2>
184
<dl>
185
<dt id="pymskt.mesh.meshRegistration.get_icp_transform"><code class="name flex">
186
<span>def <span class="ident">get_icp_transform</span></span>(<span>source, target, max_n_iter=1000, n_landmarks=1000, reg_mode='similarity')</span>
187
</code></dt>
188
<dd>
189
<div class="desc"><p>Get the Interative Closest Point (ICP) transformation from the <code>source</code> mesh to the
190
<code>target</code> mesh. </p>
191
<h2 id="parameters">Parameters</h2>
192
<dl>
193
<dt><strong><code>source</code></strong> :&ensp;<code>vtk.vtkPolyData</code></dt>
194
<dd>Source mesh that we want to transform onto the target mesh.</dd>
195
<dt><strong><code>target</code></strong> :&ensp;<code>vtk.vtkPolyData</code></dt>
196
<dd>Target mesh that we want to transform the source mesh onto.</dd>
197
<dt><strong><code>max_n_iter</code></strong> :&ensp;<code>int</code>, optional</dt>
198
<dd>Max number of iterations for the registration algorithm to perform, by default 1000</dd>
199
<dt><strong><code>n_landmarks</code></strong> :&ensp;<code>int</code>, optional</dt>
200
<dd>How many landmarks to sample when determining distance between meshes &amp;
201
solving for the optimal transformation, by default 1000</dd>
202
<dt><strong><code>reg_mode</code></strong> :&ensp;<code>str</code>, optional</dt>
203
<dd>The type of registration to perform. The options are:
204
- 'rigid': true rigid, translation only
205
- 'similarity': rigid + equal scale
206
by default 'similarity'</dd>
207
</dl>
208
<h2 id="returns">Returns</h2>
209
<dl>
210
<dt><code>vtk.vtkIterativeClosestPointTransform</code></dt>
211
<dd>The actual transform object after running the registration.</dd>
212
</dl></div>
213
<details class="source">
214
<summary>
215
<span>Expand source code</span>
216
</summary>
217
<pre><code class="python">def get_icp_transform(source, target, max_n_iter=1000, n_landmarks=1000, reg_mode=&#39;similarity&#39;):
218
    &#34;&#34;&#34;
219
    Get the Interative Closest Point (ICP) transformation from the `source` mesh to the
220
    `target` mesh. 
221
222
    Parameters
223
    ----------
224
    source : vtk.vtkPolyData
225
        Source mesh that we want to transform onto the target mesh. 
226
    target : vtk.vtkPolyData
227
        Target mesh that we want to transform the source mesh onto. 
228
    max_n_iter : int, optional
229
        Max number of iterations for the registration algorithm to perform, by default 1000
230
    n_landmarks : int, optional
231
        How many landmarks to sample when determining distance between meshes &amp; 
232
        solving for the optimal transformation, by default 1000
233
    reg_mode : str, optional
234
        The type of registration to perform. The options are: 
235
            - &#39;rigid&#39;: true rigid, translation only 
236
            - &#39;similarity&#39;: rigid + equal scale 
237
        by default &#39;similarity&#39;
238
239
    Returns
240
    -------
241
    vtk.vtkIterativeClosestPointTransform
242
        The actual transform object after running the registration. 
243
    &#34;&#34;&#34;    
244
245
    icp = vtk.vtkIterativeClosestPointTransform()
246
    icp.SetSource(source)
247
    icp.SetTarget(target)
248
    if reg_mode == &#39;rigid&#39;:
249
        icp.GetLandmarkTransform().SetModeToRigidBody()
250
    elif reg_mode == &#39;similarity&#39;:
251
        icp.GetLandmarkTransform().SetModeToSimilarity()
252
    icp.SetMaximumNumberOfIterations(max_n_iter)
253
    icp.StartByMatchingCentroidsOn()
254
    icp.Modified()
255
    icp.Update()
256
    icp.SetMaximumNumberOfLandmarks(n_landmarks)
257
    return icp</code></pre>
258
</details>
259
</dd>
260
<dt id="pymskt.mesh.meshRegistration.non_rigidly_register"><code class="name flex">
261
<span>def <span class="ident">non_rigidly_register</span></span>(<span>target_mesh=None, source_mesh=None, final_pt_location='weighted_average', icp_register_first=True, icp_registration_mode='similarity', icp_reg_target_to_source=True, n_spectral_features=3, n_extra_spectral=3, target_eigenmap_as_reference=True, get_weighted_spectral_coords=False, list_features_to_calc=['curvature'], use_features_as_coords=True, rigid_reg_max_iterations=100, non_rigid_alpha=0.01, non_rigid_beta=50, non_rigid_n_eigens=100, non_rigid_max_iterations=500, rigid_before_non_rigid_reg=False, projection_smooth_iterations=30, graph_smoothing_iterations=300, feature_smoothing_iterations=30, include_points_as_features=False, norm_physical_and_spectral=True, feature_weights=array([[0.1, 0. ],
262
[0. , 0.1]]), n_coords_spectral_ordering=20000, n_coords_spectral_registration=1000, initial_correspondence_type='kd', final_correspondence_type='kd')</span>
263
</code></dt>
264
<dd>
265
<div class="desc"></div>
266
<details class="source">
267
<summary>
268
<span>Expand source code</span>
269
</summary>
270
<pre><code class="python">def non_rigidly_register(
271
    target_mesh=None,
272
    source_mesh=None,
273
    final_pt_location=&#39;weighted_average&#39;,   # &#39;weighted_average&#39; or &#39;nearest_neighbour&#39;
274
    icp_register_first=True,                # Get bones/objects into roughly the same alignment first
275
    icp_registration_mode=&#39;similarity&#39;,     # similarity = rigid + scaling (isotropic), (&#34;rigid&#34;, &#34;similarity&#34;, &#34;affine&#34;)
276
    icp_reg_target_to_source=True,          # For shape models, the source is usually the reference so we want target in its space (true)
277
    n_spectral_features=3,
278
    n_extra_spectral=3,                     # For ensuring we have the right spec coords - determined using wasserstein distances. 
279
    target_eigenmap_as_reference=True,
280
    get_weighted_spectral_coords=False,
281
    list_features_to_calc=[&#39;curvature&#39;],    # &#39;curvature&#39;, min_curvature&#39; &#39;max_curvature&#39; (other features for registration)
282
    use_features_as_coords=True,            # During registraiton - do we want to use curvature etc. 
283
    rigid_reg_max_iterations=100,
284
    non_rigid_alpha=0.01,
285
    non_rigid_beta=50,
286
    non_rigid_n_eigens=100,                 # number of eigens for low rank CPD registration
287
    non_rigid_max_iterations=500,
288
    rigid_before_non_rigid_reg=False,       # This is of the spectral coordinates - not the x/y/z used in icp_register_first
289
    projection_smooth_iterations=30,        # Used for distributing registered points onto target surface - helps preserve diffeomorphism
290
    graph_smoothing_iterations=300,         # For smoothing the target mesh before final point correspondence
291
    feature_smoothing_iterations=30,        # how much should features (curvature) be smoothed before registration 
292
    include_points_as_features=False,       # Do we want to incldue x/y/z positions in registration? 
293
    norm_physical_and_spectral=True,        # set standardized mean and variance for each feature
294
    feature_weights=np.diag([.1,.1]),       # should we weight the extra features (curvature) more/less than spectral
295
    n_coords_spectral_ordering=20000,       # How many points on mesh to use for ordering spectral coordinates ()
296
    n_coords_spectral_registration=1000,    # How many points to use for spectral registrtaion (usually random subsample)
297
    initial_correspondence_type=&#39;kd&#39;,       # kd = nearest neightbor, hungarian = minimum cost of assigning between graphs (more compute heavy)
298
    final_correspondence_type=&#39;kd&#39;          # kd = nearest neightbor, hungarian = minimum cost of assigning between graphs (more compute heavy)
299
):
300
    
301
    if &#39;pyfocusr&#39; not in sys.modules:
302
        raise ModuleNotFoundError(&#39;pyfocusr is not installed &amp; is necessary for non-rigid registration.&#39;)
303
304
    if final_pt_location not in [&#39;weighted_average&#39;, &#39;nearest_neighbour&#39;]:
305
        raise Exception(&#39;Did not specify appropriate final_pt_location, must be either &#34;weighted_average&#34;, or &#34;nearest_neighbour&#34;&#39;)
306
307
    # Test if mesh is a vtk mesh, or a pymsky.Mesh object. 
308
    if isinstance(target_mesh, vtk.vtkPolyData):
309
        vtk_mesh_target = target_mesh
310
    else:
311
        try:
312
            vtk_mesh_target = target_mesh.mesh
313
        except:
314
            raise Exception(f&#39;expected type vtk.vtkPolyData or pymskt.mesh.Mesh, got: {type(target_mesh)}&#39;)
315
    
316
    if isinstance(source_mesh, vtk.vtkPolyData):
317
        vtk_mesh_source = source_mesh
318
    else:
319
        try:
320
            vtk_mesh_source = source_mesh.mesh
321
        except:
322
            raise Exception(f&#39;expected type vtk.vtkPolyData or pymskt.mesh.Mesh, got: {type(target_mesh)}&#39;)
323
    
324
    reg = pyfocusr.Focusr(
325
        vtk_mesh_target=vtk_mesh_target, 
326
        vtk_mesh_source=vtk_mesh_source,  
327
        icp_register_first=icp_register_first,
328
        icp_registration_mode=icp_registration_mode,
329
        icp_reg_target_to_source=icp_reg_target_to_source,
330
        n_spectral_features=n_spectral_features,
331
        n_extra_spectral=n_extra_spectral,
332
        target_eigenmap_as_reference=target_eigenmap_as_reference,
333
        get_weighted_spectral_coords=get_weighted_spectral_coords,
334
        list_features_to_calc=list_features_to_calc,
335
        use_features_as_coords=use_features_as_coords,
336
        rigid_reg_max_iterations=rigid_reg_max_iterations,
337
        non_rigid_alpha=non_rigid_alpha,
338
        non_rigid_beta=non_rigid_beta,
339
        non_rigid_n_eigens=non_rigid_n_eigens,
340
        non_rigid_max_iterations=non_rigid_max_iterations,
341
        rigid_before_non_rigid_reg=rigid_before_non_rigid_reg,
342
        projection_smooth_iterations=projection_smooth_iterations,
343
        graph_smoothing_iterations=graph_smoothing_iterations,
344
        feature_smoothing_iterations=feature_smoothing_iterations,
345
        include_points_as_features=include_points_as_features,
346
        norm_physical_and_spectral=norm_physical_and_spectral,
347
        feature_weights=feature_weights,
348
        n_coords_spectral_ordering=n_coords_spectral_ordering,
349
        n_coords_spectral_registration=n_coords_spectral_registration,
350
        initial_correspondence_type=initial_correspondence_type,
351
        final_correspondence_type=final_correspondence_type
352
    ) 
353
    reg.align_maps()
354
355
    if final_pt_location == &#39;weighted_average&#39;:
356
        reg.get_source_mesh_transformed_weighted_avg()
357
        mesh_transformed_to_target = reg.weighted_avg_transformed_mesh
358
    elif final_pt_location == &#39;nearest_neighbour&#39;:
359
        reg.get_source_mesh_transformed_nearest_neighbour()
360
        mesh_transformed_to_target = reg.nearest_neighbour_transformed_mesh
361
        
362
    return mesh_transformed_to_target    </code></pre>
363
</details>
364
</dd>
365
</dl>
366
</section>
367
<section>
368
</section>
369
</article>
370
<nav id="sidebar">
371
<h1>Index</h1>
372
<div class="toc">
373
<ul></ul>
374
</div>
375
<ul id="index">
376
<li><h3>Super-module</h3>
377
<ul>
378
<li><code><a title="pymskt.mesh" href="index.html">pymskt.mesh</a></code></li>
379
</ul>
380
</li>
381
<li><h3><a href="#header-functions">Functions</a></h3>
382
<ul class="">
383
<li><code><a title="pymskt.mesh.meshRegistration.get_icp_transform" href="#pymskt.mesh.meshRegistration.get_icp_transform">get_icp_transform</a></code></li>
384
<li><code><a title="pymskt.mesh.meshRegistration.non_rigidly_register" href="#pymskt.mesh.meshRegistration.non_rigidly_register">non_rigidly_register</a></code></li>
385
</ul>
386
</li>
387
</ul>
388
</nav>
389
</main>
390
<footer id="footer">
391
<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
392
</footer>
393
</body>
394
</html>