Jakteristics
~~~~~~~~~~~~
* **Documentation**: https://jakteristics.readthedocs.io
* **Github**: https://github.com/jakarto3d/jakteristics
Jakteristics is a python package to compute point cloud geometric features.
A **geometric feature** is a description of the geometric shape around a point based on its
neighborhood. For example, a point located on a wall will have a high *planarity*.
The features used in this package are described in the paper
`Contour detection in unstructured 3D point clouds`_.
They are computed based on the eigenvalues and eigenvectors:
* Eigenvalue sum
* Omnivariance
* Eigenentropy
* Anisotropy
* Planarity
* Linearity
* PCA1
* PCA2
* Surface Variation
* Sphericity
* Verticality
* Nx, Ny, Nz (The normal vector)
It's inspired from a similar tool in `CloudCompare <https://www.danielgm.net/cc/>`_.
It's implemented in cython using the BLAS and LAPACK scipy wrappers. It can use multiple cpus,
and the performance is quite good (at least twice as fast as CloudCompare).
.. _`Contour detection in unstructured 3D point clouds`: https://ethz.ch/content/dam/ethz/special-interest/baug/igp/photogrammetry-remote-sensing-dam/documents/pdf/timo-jan-cvpr2016.pdf
Installation
============
.. code:: bash
python -m pip install jakteristics
Usage
=====
Refer to the `documentation <https://jakteristics.readthedocs.io/en/latest/usage.html>`_ for more details.
From python
-----------
.. code:: python
from jakteristics import compute_features
features = compute_features(xyz, search_radius=0.15, feature_names=['planarity', 'linearity'])
CLI
---
Once the package is installed, you can use the `jakteristics` command:
.. code:: bash
jakteristics input/las/file.las output/file.las --search-radius 0.15 --num-threads 4
Run tests
=========
.. code:: bash
python -m pip install -r requirements-dev.txt
python setup.py pytest
History
-------
Unreleased
----------
0.6.2 (2024-07-22)
------------------
0.6.1 (2024-06-04)
------------------
0.6.0 (2023-04-20)
------------------
* add: number_of_neighbors feature
* add: eigenvalues and eigenvectors features
0.5.1 (2023-04-11)
------------------
* fix: computing features when kdtree is not built from the same points for which we want to compute the features
* drop python 3.6, add wheels for python 3.7-3.11 on linux and windows
0.5.0 (2022-01-26)
------------------
* fix: compatibility with latest laspy version (>= 2.1.1, (2.1.0 has a bug))
0.4.3 (2020-09-24)
------------------
* the default value when features can't be computed should be NaN
0.4.2 (2020-04-20)
------------------
* fix extension import statement
0.4.1 (2020-04-17)
------------------
* fix: create parent directories for output file
* fix: rename --num_threads to --num-threads
* fix: require laspy 1.7 for upper case names in extra dimensions
0.4.0 (2020-04-16)
------------------
* first pypi release
* add github actions
0.3.0 (2020-04-14)
------------------
* add feature-names parameter to compute specific features
0.2.0 (2020-04-10)
------------------
* fix windows compilation with openmp
* add example cloudcompare script
* add num_threads cli parameter and help documentation
* write extra dimensions in the correct order
0.1.2 (2020-04-10)
------------------
* Fix tests
0.1.1 (2020-04-10)
------------------
* Fix bug where single precision was used for intermediate variables
0.1.0 (2020-04-10)
------------------
* First release
Raw data
{
"_id": null,
"home_page": "https://github.com/jakarto3d/jakteristics",
"name": "jakteristics",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "jakteristics",
"author": "David Caron",
"author_email": "david.caron@jakarto.com",
"download_url": "https://files.pythonhosted.org/packages/76/a4/02ad4f9492e7c51f2b691d0f9b20d68c1c24e175e51f481106b3f6002dea/jakteristics-0.6.2.tar.gz",
"platform": null,
"description": "Jakteristics\n~~~~~~~~~~~~\n\n* **Documentation**: https://jakteristics.readthedocs.io\n* **Github**: https://github.com/jakarto3d/jakteristics\n\nJakteristics is a python package to compute point cloud geometric features. \n\nA **geometric feature** is a description of the geometric shape around a point based on its \nneighborhood. For example, a point located on a wall will have a high *planarity*.\n\nThe features used in this package are described in the paper\n`Contour detection in unstructured 3D point clouds`_.\nThey are computed based on the eigenvalues and eigenvectors:\n\n* Eigenvalue sum\n* Omnivariance\n* Eigenentropy\n* Anisotropy\n* Planarity\n* Linearity\n* PCA1\n* PCA2\n* Surface Variation\n* Sphericity\n* Verticality\n* Nx, Ny, Nz (The normal vector)\n\nIt's inspired from a similar tool in `CloudCompare <https://www.danielgm.net/cc/>`_.\n\nIt's implemented in cython using the BLAS and LAPACK scipy wrappers. It can use multiple cpus, \nand the performance is quite good (at least twice as fast as CloudCompare).\n\n.. _`Contour detection in unstructured 3D point clouds`: https://ethz.ch/content/dam/ethz/special-interest/baug/igp/photogrammetry-remote-sensing-dam/documents/pdf/timo-jan-cvpr2016.pdf\n\n\nInstallation\n============\n\n.. code:: bash\n\n python -m pip install jakteristics\n\n\nUsage\n=====\n\nRefer to the `documentation <https://jakteristics.readthedocs.io/en/latest/usage.html>`_ for more details.\n\n\nFrom python\n-----------\n\n.. code:: python\n\n from jakteristics import compute_features\n\n features = compute_features(xyz, search_radius=0.15, feature_names=['planarity', 'linearity'])\n\n\nCLI\n---\n\nOnce the package is installed, you can use the `jakteristics` command:\n\n.. code:: bash\n\n jakteristics input/las/file.las output/file.las --search-radius 0.15 --num-threads 4\n\n\nRun tests\n=========\n\n.. code:: bash\n\n python -m pip install -r requirements-dev.txt\n python setup.py pytest\n\n\n\n\nHistory\n-------\n\nUnreleased\n----------\n\n\n0.6.2 (2024-07-22)\n------------------\n\n\n0.6.1 (2024-06-04)\n------------------\n\n\n0.6.0 (2023-04-20)\n------------------\n\n* add: number_of_neighbors feature\n* add: eigenvalues and eigenvectors features\n\n\n0.5.1 (2023-04-11)\n------------------\n\n* fix: computing features when kdtree is not built from the same points for which we want to compute the features\n* drop python 3.6, add wheels for python 3.7-3.11 on linux and windows\n\n0.5.0 (2022-01-26)\n------------------\n\n* fix: compatibility with latest laspy version (>= 2.1.1, (2.1.0 has a bug))\n\n\n0.4.3 (2020-09-24)\n------------------\n\n* the default value when features can't be computed should be NaN\n\n\n0.4.2 (2020-04-20)\n------------------\n\n* fix extension import statement\n\n\n0.4.1 (2020-04-17)\n------------------\n\n* fix: create parent directories for output file\n* fix: rename --num_threads to --num-threads\n* fix: require laspy 1.7 for upper case names in extra dimensions\n\n\n0.4.0 (2020-04-16)\n------------------\n\n* first pypi release\n* add github actions\n\n\n0.3.0 (2020-04-14)\n------------------\n\n* add feature-names parameter to compute specific features\n\n\n0.2.0 (2020-04-10)\n------------------\n\n* fix windows compilation with openmp\n* add example cloudcompare script\n* add num_threads cli parameter and help documentation\n* write extra dimensions in the correct order\n\n\n0.1.2 (2020-04-10)\n------------------\n\n* Fix tests\n\n\n0.1.1 (2020-04-10)\n------------------\n\n* Fix bug where single precision was used for intermediate variables\n\n\n0.1.0 (2020-04-10)\n------------------\n\n* First release",
"bugtrack_url": null,
"license": "BSD",
"summary": "Point cloud geometric properties from python.",
"version": "0.6.2",
"project_urls": {
"Homepage": "https://github.com/jakarto3d/jakteristics"
},
"split_keywords": [
"jakteristics"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "a18fba2103ab4fc6b05ad176abe83fb3fa9a573325231161f53448ef809b54fb",
"md5": "aa722694764dc9950ef058284b0d8f0b",
"sha256": "bc0dba7299a4cdbc8762c8c8feeee3b8aa48d4020cf5fd41018f6c44fd5c1ac6"
},
"downloads": -1,
"filename": "jakteristics-0.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "aa722694764dc9950ef058284b0d8f0b",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 3963533,
"upload_time": "2024-07-22T15:27:09",
"upload_time_iso_8601": "2024-07-22T15:27:09.644589Z",
"url": "https://files.pythonhosted.org/packages/a1/8f/ba2103ab4fc6b05ad176abe83fb3fa9a573325231161f53448ef809b54fb/jakteristics-0.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a052c11b628d853db7bb6fa05fb7662db2dae719dedbcf485943f2568e8d36de",
"md5": "347b6db0eb0fac70a6be7ce06a3ea3a4",
"sha256": "e884c2b9863ef12922b455c8da22cc07a22cd99e88cf1d5729d8e2bbf02c05d6"
},
"downloads": -1,
"filename": "jakteristics-0.6.2-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "347b6db0eb0fac70a6be7ce06a3ea3a4",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 723334,
"upload_time": "2024-07-22T15:27:11",
"upload_time_iso_8601": "2024-07-22T15:27:11.691965Z",
"url": "https://files.pythonhosted.org/packages/a0/52/c11b628d853db7bb6fa05fb7662db2dae719dedbcf485943f2568e8d36de/jakteristics-0.6.2-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "051c31005d60cf2aaeb5a8ab0f65be2040c99ef36a1c49dad8c92beb8ad5ada8",
"md5": "57489e186057934fbd985f574d6347cb",
"sha256": "ff8cc6645f35557876c593c6c58942deb0d28412e2ac31b637611da0a23dad89"
},
"downloads": -1,
"filename": "jakteristics-0.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "57489e186057934fbd985f574d6347cb",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 4122845,
"upload_time": "2024-07-22T15:27:13",
"upload_time_iso_8601": "2024-07-22T15:27:13.642688Z",
"url": "https://files.pythonhosted.org/packages/05/1c/31005d60cf2aaeb5a8ab0f65be2040c99ef36a1c49dad8c92beb8ad5ada8/jakteristics-0.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c60e667fa6e5532772dc3b351f96842d3558a1a41b380ddabe9bf11ae0165f32",
"md5": "d79e08e9e4a3e9893793217f30b73dc1",
"sha256": "60435ee74ccb9bf52baa1a23be041f93c7343bd1f5c0cae8c741c963159c6c98"
},
"downloads": -1,
"filename": "jakteristics-0.6.2-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "d79e08e9e4a3e9893793217f30b73dc1",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 723410,
"upload_time": "2024-07-22T15:27:15",
"upload_time_iso_8601": "2024-07-22T15:27:15.793802Z",
"url": "https://files.pythonhosted.org/packages/c6/0e/667fa6e5532772dc3b351f96842d3558a1a41b380ddabe9bf11ae0165f32/jakteristics-0.6.2-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a8c6dfc56800176b4e4eb33c7360ad84de83ef3f7ead1d2f6155c9f81d8f04e0",
"md5": "974366d3bfb0e65f6cfc0e573b28152f",
"sha256": "b44d2b95b4201fc052909c1de458d231d13a8e4ce9221f7ba337c60da01c4744"
},
"downloads": -1,
"filename": "jakteristics-0.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "974366d3bfb0e65f6cfc0e573b28152f",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 4080144,
"upload_time": "2024-07-22T15:27:17",
"upload_time_iso_8601": "2024-07-22T15:27:17.386646Z",
"url": "https://files.pythonhosted.org/packages/a8/c6/dfc56800176b4e4eb33c7360ad84de83ef3f7ead1d2f6155c9f81d8f04e0/jakteristics-0.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5c7228f653ed7a611da5dd43349cb839172e9a6a43cc7d52e0c3eb974d6f7992",
"md5": "f9f2be58d5027ba5e010ea7209d6d602",
"sha256": "866d0fd573787cca66917634c4a25d3a9fef391b7a20351a7b36e76123c05534"
},
"downloads": -1,
"filename": "jakteristics-0.6.2-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "f9f2be58d5027ba5e010ea7209d6d602",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 720270,
"upload_time": "2024-07-22T15:27:19",
"upload_time_iso_8601": "2024-07-22T15:27:19.216315Z",
"url": "https://files.pythonhosted.org/packages/5c/72/28f653ed7a611da5dd43349cb839172e9a6a43cc7d52e0c3eb974d6f7992/jakteristics-0.6.2-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5eca6c8f3998fa538faed9391b39a18fe9ce6481ff46916634ea03024829b2b8",
"md5": "475b9e24e49ef7b9ab74e03c9c528a89",
"sha256": "a1abf4122c78c48d0f6369e2c2ba803205b9750e442c08ec739cce0bf9d43a7b"
},
"downloads": -1,
"filename": "jakteristics-0.6.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "475b9e24e49ef7b9ab74e03c9c528a89",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 4018855,
"upload_time": "2024-07-22T15:27:20",
"upload_time_iso_8601": "2024-07-22T15:27:20.548870Z",
"url": "https://files.pythonhosted.org/packages/5e/ca/6c8f3998fa538faed9391b39a18fe9ce6481ff46916634ea03024829b2b8/jakteristics-0.6.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "afb064b0372337441a4da7d78f0b9311ab5454ff3817f4aba667e6d0ae4601ae",
"md5": "1841e3a265623cf2aa9dd3bdac5720f1",
"sha256": "a931f5d5ca9435746d0069e8fe500df4ef7ca3ba2e8701bfce2a487c2b2107e1"
},
"downloads": -1,
"filename": "jakteristics-0.6.2-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "1841e3a265623cf2aa9dd3bdac5720f1",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 721537,
"upload_time": "2024-07-22T15:27:22",
"upload_time_iso_8601": "2024-07-22T15:27:22.601113Z",
"url": "https://files.pythonhosted.org/packages/af/b0/64b0372337441a4da7d78f0b9311ab5454ff3817f4aba667e6d0ae4601ae/jakteristics-0.6.2-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2fe43539da9202c9f095dfac68472cbdc670cc7ad1581aacab3ff7d10f09041a",
"md5": "60535139a1f4d499905360ca2ca2e45a",
"sha256": "a3d91ac868b1f128c6623d202e3b0f2e25e51c5a74666fb49a89354fc7e5de5c"
},
"downloads": -1,
"filename": "jakteristics-0.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "60535139a1f4d499905360ca2ca2e45a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 3971617,
"upload_time": "2024-07-22T15:27:24",
"upload_time_iso_8601": "2024-07-22T15:27:24.781164Z",
"url": "https://files.pythonhosted.org/packages/2f/e4/3539da9202c9f095dfac68472cbdc670cc7ad1581aacab3ff7d10f09041a/jakteristics-0.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "90b053538d4ceedf7e7c6ffae05a5e211a712205cf8e065398232c24b274dfd8",
"md5": "31f3d0a8d56cb00aae685d70b60bf260",
"sha256": "ad4672eab79fc47c5fd73b97100b45cdf8fbf51b10d61f20586794d6d097e8fd"
},
"downloads": -1,
"filename": "jakteristics-0.6.2-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "31f3d0a8d56cb00aae685d70b60bf260",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 725070,
"upload_time": "2024-07-22T15:27:26",
"upload_time_iso_8601": "2024-07-22T15:27:26.752510Z",
"url": "https://files.pythonhosted.org/packages/90/b0/53538d4ceedf7e7c6ffae05a5e211a712205cf8e065398232c24b274dfd8/jakteristics-0.6.2-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "76a402ad4f9492e7c51f2b691d0f9b20d68c1c24e175e51f481106b3f6002dea",
"md5": "25c51216532f0ed131494ec3f397d242",
"sha256": "767cdb08536d99130e3676ca6e1dcc7b6ff8582340fee836f6eed85bc1043d52"
},
"downloads": -1,
"filename": "jakteristics-0.6.2.tar.gz",
"has_sig": false,
"md5_digest": "25c51216532f0ed131494ec3f397d242",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 608131,
"upload_time": "2024-07-22T15:27:07",
"upload_time_iso_8601": "2024-07-22T15:27:07.954283Z",
"url": "https://files.pythonhosted.org/packages/76/a4/02ad4f9492e7c51f2b691d0f9b20d68c1c24e175e51f481106b3f6002dea/jakteristics-0.6.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-22 15:27:07",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jakarto3d",
"github_project": "jakteristics",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "laspy",
"specs": [
[
">=",
"2.1.1"
]
]
},
{
"name": "scipy",
"specs": []
},
{
"name": "typer",
"specs": []
},
{
"name": "Cython",
"specs": [
[
">=",
"0.25"
]
]
}
],
"lcname": "jakteristics"
}