.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/example_curvature.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_example_curvature.py: .. _example_curvature: =================================== example of curvature estimation in slam =================================== .. GENERATED FROM PYTHON SOURCE LINES 8-16 .. code-block:: default # Authors: Guillaume Auzias # Julien Barrès # License: BSD (3-clause) # sphinx_gallery_thumbnail_number = 2 .. GENERATED FROM PYTHON SOURCE LINES 17-18 importation of slam modules .. GENERATED FROM PYTHON SOURCE LINES 18-25 .. code-block:: default import slam.utils as ut import numpy as np import slam.generate_parametric_surfaces as sgps import slam.io as sio import slam.plot as splt import slam.curvature as scurv .. GENERATED FROM PYTHON SOURCE LINES 26-27 loading an examplar mesh .. GENERATED FROM PYTHON SOURCE LINES 27-30 .. code-block:: default mesh_file = "../examples/data/example_mesh.gii" mesh = sio.load_mesh(mesh_file) .. GENERATED FROM PYTHON SOURCE LINES 31-32 Comptue estimations of principal curvatures .. GENERATED FROM PYTHON SOURCE LINES 32-36 .. code-block:: default PrincipalCurvatures, PrincipalDir1, PrincipalDir2 = scurv.curvatures_and_derivatives( mesh ) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none Calculating vertex normals .... Please wait Finished calculating vertex normals Calculating curvature tensors ... Please wait Finished Calculating curvature tensors Calculating Principal Components ... Please wait Finished Calculating principal components .. GENERATED FROM PYTHON SOURCE LINES 37-38 Comptue Gauss curvature from principal curvatures .. GENERATED FROM PYTHON SOURCE LINES 38-40 .. code-block:: default gaussian_curv = PrincipalCurvatures[0, :] * PrincipalCurvatures[1, :] .. GENERATED FROM PYTHON SOURCE LINES 41-42 Comptue mean curvature from principal curvatures .. GENERATED FROM PYTHON SOURCE LINES 42-44 .. code-block:: default mean_curv = 0.5 * (PrincipalCurvatures[0, :] + PrincipalCurvatures[1, :]) .. GENERATED FROM PYTHON SOURCE LINES 45-46 Plot mean curvature .. GENERATED FROM PYTHON SOURCE LINES 46-51 .. code-block:: default visb_sc = splt.visbrain_plot( mesh=mesh, tex=mean_curv, caption="mean curvature", cblabel="mean curvature" ) visb_sc.preview() .. image:: /auto_examples/images/sphx_glr_example_curvature_001.png :alt: example curvature :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 52-53 Plot Gauss curvature .. GENERATED FROM PYTHON SOURCE LINES 53-62 .. code-block:: default visb_sc = splt.visbrain_plot( mesh=mesh, tex=gaussian_curv, caption="Gaussian curvature", cblabel="Gaussian curvature", cmap="hot", ) visb_sc.preview() .. image:: /auto_examples/images/sphx_glr_example_curvature_002.png :alt: example curvature :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 63-66 Decomposition of the curvatures into ShapeIndex and Curvedness Based on 'Surface shape and curvature scales Jan JKoenderink & Andrea Jvan Doorn' .. GENERATED FROM PYTHON SOURCE LINES 66-68 .. code-block:: default shapeIndex, curvedness = scurv.decompose_curvature(PrincipalCurvatures) .. GENERATED FROM PYTHON SOURCE LINES 69-70 Plot of ShapeIndex and Curvedness .. GENERATED FROM PYTHON SOURCE LINES 70-85 .. code-block:: default visb_sc = splt.visbrain_plot( mesh=mesh, tex=shapeIndex, caption="ShapeIndex", cblabel="ShapeIndex", cmap="coolwarm", ) visb_sc.preview() visb_sc = splt.visbrain_plot( mesh=mesh, tex=curvedness, caption="Curvedness", cblabel="Curvedness", cmap="hot" ) visb_sc.preview() .. rst-class:: sphx-glr-horizontal * .. image:: /auto_examples/images/sphx_glr_example_curvature_003.png :alt: example curvature :class: sphx-glr-multi-img * .. image:: /auto_examples/images/sphx_glr_example_curvature_004.png :alt: example curvature :class: sphx-glr-multi-img .. GENERATED FROM PYTHON SOURCE LINES 86-87 Estimation error on the principal curvature length .. GENERATED FROM PYTHON SOURCE LINES 87-100 .. code-block:: default K = [1, 0] quadric = sgps.generate_quadric( K, nstep=[20, 20], ax=3, ay=3, random_sampling=False, ratio=0.3, random_distribution_type="gamma", equilateral=True, ) .. GENERATED FROM PYTHON SOURCE LINES 101-102 Estimated computation of the Principal curvature, K_gauss, K_mean .. GENERATED FROM PYTHON SOURCE LINES 102-110 .. code-block:: default p_curv, d1_estim, d2_estim = scurv.curvatures_and_derivatives(quadric) k1_estim, k2_estim = p_curv[0, :], p_curv[1, :] k_gauss_estim = k1_estim * k2_estim k_mean_estim = 0.5 * (k1_estim + k2_estim) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none Calculating vertex normals .... Please wait Finished calculating vertex normals Calculating curvature tensors ... Please wait Finished Calculating curvature tensors Calculating Principal Components ... Please wait Finished Calculating principal components .. GENERATED FROM PYTHON SOURCE LINES 111-112 Analytical computation of the curvatures .. GENERATED FROM PYTHON SOURCE LINES 112-130 .. code-block:: default k_mean_analytic = sgps.quadric_curv_mean(K)( np.array(quadric.vertices[:, 0]), np.array(quadric.vertices[:, 1]) ) k_gauss_analytic = sgps.quadric_curv_gauss(K)( np.array(quadric.vertices[:, 0]), np.array(quadric.vertices[:, 1]) ) k1_analytic = np.zeros((len(k_mean_analytic))) k2_analytic = np.zeros((len(k_mean_analytic))) for i in range(len(k_mean_analytic)): a, b = np.roots((1, -2 * k_mean_analytic[i], k_gauss_analytic[i])) k1_analytic[i] = min(a, b) k2_analytic[i] = max(a, b) .. GENERATED FROM PYTHON SOURCE LINES 131-132 Error computation .. GENERATED FROM PYTHON SOURCE LINES 132-139 .. code-block:: default k_mean_relative_change = abs((k_mean_analytic - k_mean_estim) / k_mean_analytic) k_mean_absolute_change = abs((k_mean_analytic - k_mean_estim)) k1_relative_change = abs((k1_analytic - k1_estim) / k1_analytic) k1_absolute_change = abs((k1_analytic - k1_estim)) .. GENERATED FROM PYTHON SOURCE LINES 140-141 Error plot .. GENERATED FROM PYTHON SOURCE LINES 141-150 .. code-block:: default visb_sc = splt.visbrain_plot( mesh=quadric, tex=k_mean_absolute_change, caption="K_mean absolute error", cblabel="K_mean absolute error", ) visb_sc.preview() .. image:: /auto_examples/images/sphx_glr_example_curvature_005.png :alt: example curvature :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 151-155 Estimation error on the curvature directions commented because there is a bug: ValueError: shapes (3,2) and (3,2) not aligned: 2 (dim 1) != 3 (dim 0) actually, vec1.shape=(3,) while vec2.shape=(3,2) .. GENERATED FROM PYTHON SOURCE LINES 155-169 .. code-block:: default K = [1, 0] quadric = sgps.generate_quadric( K, nstep=[20, 20], ax=3, ay=3, random_sampling=False, ratio=0.3, random_distribution_type="gamma", equilateral=True, ) .. GENERATED FROM PYTHON SOURCE LINES 170-171 Estimated computation of the Principal curvature, Direction1, Direction2 .. GENERATED FROM PYTHON SOURCE LINES 171-173 .. code-block:: default p_curv_estim, d1_estim, d2_estim = scurv.curvatures_and_derivatives(quadric) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none Calculating vertex normals .... Please wait Finished calculating vertex normals Calculating curvature tensors ... Please wait Finished Calculating curvature tensors Calculating Principal Components ... Please wait Finished Calculating principal components .. GENERATED FROM PYTHON SOURCE LINES 174-175 Analytical computation of the directions .. GENERATED FROM PYTHON SOURCE LINES 175-191 .. code-block:: default analytical_directions = sgps.compute_all_principal_directions_3D(K, quadric.vertices) estimated_directions = np.zeros(analytical_directions.shape) estimated_directions[:, :, 0] = d1_estim estimated_directions[:, :, 1] = d2_estim angular_error_0, dotprods = ut.compare_analytic_estimated_directions( analytical_directions[:, :, 0], estimated_directions[:, :, 0] ) angular_error_0 = 180 * angular_error_0 / np.pi angular_error_1, dotprods = ut.compare_analytic_estimated_directions( analytical_directions[:, :, 1], estimated_directions[:, :, 1] ) angular_error_1 = 180 * angular_error_1 / np.pi .. GENERATED FROM PYTHON SOURCE LINES 192-193 Error plot .. GENERATED FROM PYTHON SOURCE LINES 193-209 .. code-block:: default visb_sc = splt.visbrain_plot( mesh=quadric, tex=angular_error_0, caption="Angular error 0", cblabel="Angular error 0", ) visb_sc.preview() visb_sc = splt.visbrain_plot( mesh=quadric, tex=angular_error_1, caption="Angular error 1", cblabel="Angular error 1", ) visb_sc.preview() .. rst-class:: sphx-glr-horizontal * .. image:: /auto_examples/images/sphx_glr_example_curvature_006.png :alt: example curvature :class: sphx-glr-multi-img * .. image:: /auto_examples/images/sphx_glr_example_curvature_007.png :alt: example curvature :class: sphx-glr-multi-img .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 9.131 seconds) .. _sphx_glr_download_auto_examples_example_curvature.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: example_curvature.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: example_curvature.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_