{"name":"napari-sift-registration","display_name":"SIFTReg","visibility":"public","icon":"","categories":[],"schema_version":"0.2.0","on_activate":null,"on_deactivate":null,"contributions":{"commands":[{"id":"napari-sift-registration.make_magic_widget","title":"Affine registration with SIFT keypoints","python_name":"napari_sift_registration._widget:example_magic_widget","short_title":null,"category":null,"icon":null,"enablement":null}],"readers":null,"writers":null,"widgets":[{"command":"napari-sift-registration.make_magic_widget","display_name":"Affine registration with SIFT keypoints","autogenerate":false}],"sample_data":null,"themes":null,"menus":{},"submenus":null,"keybindings":null,"configuration":[]},"package_metadata":{"metadata_version":"2.1","name":"napari-sift-registration","version":"0.1.2","dynamic":null,"platform":null,"supported_platform":null,"summary":"Simple plugin for SIFT keypoint detection, and affine registration with RANSAC, based on scikit-image","description":"# skimage-sift-registration\n\n[![License BSD-3](https://img.shields.io/pypi/l/napari-sift-registration.svg?color=green)](https://github.com/jfozard/napari-sift-registration/raw/main/LICENSE)\n[![PyPI](https://img.shields.io/pypi/v/napari-sift-registration.svg?color=green)](https://pypi.org/project/napari-sift-registration)\n[![Python Version](https://img.shields.io/pypi/pyversions/napari-sift-registration.svg?color=green)](https://python.org)\n[![tests](https://github.com/jfozard/napari-sift-registration/workflows/tests/badge.svg)](https://github.com/jfozard/napari-sift-registration/actions)\n[![codecov](https://codecov.io/gh/jfozard/napari-sift-registration/branch/main/graph/badge.svg)](https://codecov.io/gh/jfozard/napari-sift-registration)\n[![napari hub](https://img.shields.io/endpoint?url=https://api.napari-hub.org/shields/napari-sift-registration)](https://napari-hub.org/plugins/napari-sift-registration)\n\nSimple plugin for 2D keypoint detection and affine registration with RANSAC.\n\n----------------------------------\n\n![moving image](test_data/test1.png)\n![fixed image](test_data/test2.png)\n\nArtificial data \n\n![moving image with inlier keypoints](doc/moving_keypoints.png)\n![fixed image with inlier keypoints](doc/fixed_keypoints.png)\n\nMoving and fixed images showing inlier keypoints after RANSAC\n\n\n----------------------------------\n\nThis [napari] plugin was generated with [Cookiecutter] using [@napari]'s [cookiecutter-napari-plugin] template.\nIt uses the [scikit-image] SIFT keypoint detection routines to find distinctive image points and generate local descriptions of the image around them.\nCorrespondences between the two images are then found by looking for pairs of keypoints, one in each of the two images, with closely matching descriptors.\n\n\n\nFor typical images, many of these correspondences will be wrong. To reduce these false correspondences, the plugin applies the RANSAC algorithm. This randomly selects a small subset of the matching pairs of keypoints, estimates the affine transformation between this subset of keypoints, and then evaluates how many of the other pairs of keypoints also closely agree with this affine transformation (\"inliers\"). A large number of random samples are tested, and the transformation with the most inliers retained.\n\nThe plugin outputs two points layers, one for each image, containing all the corresponding (inlier) SIFT keypoints. It also uses the estimated affine transformation between the two images to deform the \"moving\" image layer onto the \"fixed\" image layer.\n\nThis approach is an attempt to provide similar functionality to the Stephan Saalfeld's Fiji \"Extract SIFT Correspondences\" plugin [extract], and more-or-less\njust provides a napari interface to the existing routines in scikit-image. There are great examples in the scikit-image documentation (e.g. [SIFT-example] and [RANSAC-example]) that can be used if you would like to use these routines in your own analysis scripts.\n\n\n## Installation\n\nYou can install `napari-sift-registration` via [pip]:\n\n pip install napari-sift-registration\n\nTo install the latest development version :\n\n pip install git+https://github.com/jfozard/napari-sift-registration.git\n\n## Usage\n\n### Basic usage\n\n- Load two 2D single channel images in Napari.\n- Select the menu item Plugins > napari-sift-registration\n- Select these two images as the \"Moving image layer\" and the \"Fixed image layer\". The moving image will be deformed by the transformation to look like the fixed image.\n- The remaining parameters are the default settings from scikit-image; try these default values first.\n\n### Advanced usage\n\nThe parameter values for SIFT feature detection, keypoint matching and RANSAC are accessible from the plugin gui. For further information about their use, see the appropriate scikit-image documentation:\n\nUpsampling before feature detection, maximum number of octaves, maximum number of scales in every octave, blur level of seed image, feature descriptor size, feature descriptor orientation bins: see [scikit-image-SIFT].\n\nClosest/next closest ratio: see [scikit-image-match_descriptors]\n\nMinimum number of points sampled for each RANSAC model, distance for points to be inliers in RANSAC model, maximum number of trials in RANSAC model: see [scikit-image-RANSAC]\n\nOnly show inlier keypoints: If checked, only show corresponding keypoints that are inliers after RANSAC. If unchecked, show all corresponding keypoints.\n\n### Limitations\n\nOnly 2D, single channel images (for now).\n\n## Contributing\n\nContributions are very welcome. Tests can be run with [tox], please ensure\nthe coverage at least stays the same before you submit a pull request.\n\n## License\n\nDistributed under the terms of the [BSD-3] license,\n\"napari-sift-registration\" is free and open source software\n\n## Issues\n\nIf you encounter any problems, please [file an issue] along with a detailed description.\n\n[extract]: https://imagej.net/plugins/feature-extraction\n[scikit-image]: https://scikit-image.org/\n[SIFT-example]: https://scikit-image.org/docs/stable/auto_examples/features_detection/plot_sift.html\n[RANSAC-example]: https://scikit-image.org/docs/stable/auto_examples/transform/plot_matching.html\n[napari]: https://github.com/napari/napari\n[Cookiecutter]: https://github.com/audreyr/cookiecutter\n[@napari]: https://github.com/napari\n[MIT]: http://opensource.org/licenses/MIT\n[BSD-3]: http://opensource.org/licenses/BSD-3-Clause\n[GNU GPL v3.0]: http://www.gnu.org/licenses/gpl-3.0.txt\n[GNU LGPL v3.0]: http://www.gnu.org/licenses/lgpl-3.0.txt\n[Apache Software License 2.0]: http://www.apache.org/licenses/LICENSE-2.0\n[Mozilla Public License 2.0]: https://www.mozilla.org/media/MPL/2.0/index.txt\n[cookiecutter-napari-plugin]: https://github.com/napari/cookiecutter-napari-plugin\n\n[scikit-image-SIFT]: https://scikit-image.org/docs/stable/api/skimage.feature.html#skimage.feature.SIFT\n[scikit-image-match_descriptors]: https://scikit-image.org/docs/stable/api/skimage.feature.html#skimage.feature.match_descriptors\n[scikit-image-RANSAC]: https://scikit-image.org/docs/stable/api/skimage.measure.html#skimage.measure.ransac\n\n[file an issue]: https://github.com/jfozard/napari-sift-registration/issues\n\n[napari]: https://github.com/napari/napari\n[tox]: https://tox.readthedocs.io/en/latest/\n[pip]: https://pypi.org/project/pip/\n[PyPI]: https://pypi.org/\n","description_content_type":"text/markdown","keywords":null,"home_page":"https://github.com/jfozard/napari-sift-registration","download_url":null,"author":"John Fozard","author_email":"john.fozard@gmail.com","maintainer":null,"maintainer_email":null,"license":"BSD-3-Clause","classifier":["Development Status :: 3 - Alpha","Intended Audience :: Developers","Framework :: napari","Topic :: Scientific/Engineering :: Image Processing","Programming Language :: Python","Programming Language :: Python :: 3","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Operating System :: OS Independent","License :: OSI Approved :: BSD License"],"requires_dist":["numpy","magicgui","qtpy","scikit-image","tox ; extra == 'testing'","pytest ; extra == 'testing'","pytest-cov ; extra == 'testing'","pytest-qt ; extra == 'testing'","napari ; extra == 'testing'","pyqt5 ; extra == 'testing'"],"requires_python":">=3.8","requires_external":null,"project_url":["Bug Tracker, https://github.com/jfozard/napari-sift-registration/issues","Documentation, https://github.com/jfozard/napari-sift-registration#README.md","Source Code, https://github.com/jfozard/napari-sift-registration","User Support, https://github.com/jfozard/napari-sift-registration/issues"],"provides_extra":["testing"],"provides_dist":null,"obsoletes_dist":null},"npe1_shim":false}