shinestacker 0.3.3__tar.gz → 0.3.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of shinestacker might be problematic. Click here for more details.

Files changed (139) hide show
  1. {shinestacker-0.3.3 → shinestacker-0.3.5}/.coverage +0 -0
  2. shinestacker-0.3.5/.flake8 +8 -0
  3. shinestacker-0.3.5/.github/workflows/pylint.yml +28 -0
  4. shinestacker-0.3.5/.pylintrc +6 -0
  5. {shinestacker-0.3.3 → shinestacker-0.3.5}/CHANGELOG.md +34 -0
  6. {shinestacker-0.3.3 → shinestacker-0.3.5}/PKG-INFO +18 -6
  7. {shinestacker-0.3.3 → shinestacker-0.3.5}/README.md +17 -5
  8. shinestacker-0.3.5/THIRD_PARTY_LICENSES.txt +80 -0
  9. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/focus_stacking.md +2 -2
  10. shinestacker-0.3.5/docs/index.md +17 -0
  11. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/job.md +6 -13
  12. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/main.md +11 -23
  13. shinestacker-0.3.5/img/coffee.gif +0 -0
  14. shinestacker-0.3.5/img/coffee_stack.jpg +0 -0
  15. shinestacker-0.3.5/img/flies.gif +0 -0
  16. shinestacker-0.3.5/img/flies_stack.jpg +0 -0
  17. shinestacker-0.3.5/img/gui-project-new.png +0 -0
  18. shinestacker-0.3.5/requirements.txt +13 -0
  19. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/__init__.py +2 -1
  20. shinestacker-0.3.5/src/shinestacker/_version.py +1 -0
  21. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/__init__.py +3 -2
  22. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/align.py +102 -64
  23. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/balance.py +89 -42
  24. shinestacker-0.3.5/src/shinestacker/algorithms/base_stack_algo.py +41 -0
  25. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/core_utils.py +6 -6
  26. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/denoise.py +4 -1
  27. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/depth_map.py +28 -39
  28. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/exif.py +43 -38
  29. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/multilayer.py +48 -28
  30. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/noise_detection.py +34 -26
  31. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/pyramid.py +42 -42
  32. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/sharpen.py +1 -0
  33. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/stack.py +42 -42
  34. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/stack_framework.py +118 -66
  35. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/utils.py +12 -11
  36. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/vignetting.py +52 -25
  37. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/algorithms/white_balance.py +1 -0
  38. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/app/about_dialog.py +6 -2
  39. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/app/app_config.py +1 -0
  40. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/app/gui_utils.py +20 -0
  41. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/app/help_menu.py +2 -1
  42. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/app/main.py +9 -18
  43. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/app/open_frames.py +5 -4
  44. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/app/project.py +5 -16
  45. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/app/retouch.py +5 -17
  46. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/core/colors.py +4 -4
  47. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/core/core_utils.py +1 -1
  48. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/core/exceptions.py +2 -1
  49. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/core/framework.py +46 -33
  50. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/core/logging.py +9 -10
  51. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/action_config.py +253 -197
  52. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/actions_window.py +36 -35
  53. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/colors.py +1 -0
  54. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/gui_images.py +7 -3
  55. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/gui_logging.py +3 -2
  56. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/gui_run.py +53 -38
  57. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/main_window.py +69 -25
  58. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/new_project.py +35 -2
  59. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/project_converter.py +21 -20
  60. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/project_editor.py +51 -52
  61. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/project_model.py +15 -23
  62. shinestacker-0.3.3/src/shinestacker/retouch/filter_base.py → shinestacker-0.3.5/src/shinestacker/retouch/base_filter.py +7 -4
  63. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/brush.py +1 -0
  64. shinestacker-0.3.5/src/shinestacker/retouch/brush_gradient.py +34 -0
  65. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/brush_preview.py +14 -10
  66. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/brush_tool.py +28 -19
  67. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/denoise_filter.py +3 -2
  68. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/display_manager.py +11 -5
  69. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/exif_data.py +1 -0
  70. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/file_loader.py +13 -9
  71. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/filter_manager.py +1 -0
  72. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/image_editor.py +14 -48
  73. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/image_editor_ui.py +10 -5
  74. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/image_filters.py +4 -2
  75. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/image_viewer.py +33 -31
  76. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/io_gui_handler.py +25 -13
  77. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/io_manager.py +3 -2
  78. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/layer_collection.py +79 -23
  79. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/shortcuts_help.py +1 -0
  80. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/undo_manager.py +7 -0
  81. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/unsharp_mask_filter.py +3 -2
  82. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/white_balance_filter.py +11 -6
  83. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker.egg-info/PKG-INFO +18 -6
  84. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker.egg-info/SOURCES.txt +8 -1
  85. shinestacker-0.3.3/.flake8 +0 -4
  86. shinestacker-0.3.3/docs/index.md +0 -23
  87. shinestacker-0.3.3/img/flies.gif +0 -0
  88. shinestacker-0.3.3/img/flies_stack.jpg +0 -0
  89. shinestacker-0.3.3/img/gui-project-new.png +0 -0
  90. shinestacker-0.3.3/src/shinestacker/_version.py +0 -1
  91. shinestacker-0.3.3/src/shinestacker/retouch/brush_gradient.py +0 -20
  92. {shinestacker-0.3.3 → shinestacker-0.3.5}/.coveragerc +0 -0
  93. {shinestacker-0.3.3 → shinestacker-0.3.5}/.github/workflows/ci-multiplatform.yml +0 -0
  94. {shinestacker-0.3.3 → shinestacker-0.3.5}/.github/workflows/pypi-publish.yml +0 -0
  95. {shinestacker-0.3.3 → shinestacker-0.3.5}/.github/workflows/release.yml +0 -0
  96. {shinestacker-0.3.3 → shinestacker-0.3.5}/.gitignore +0 -0
  97. {shinestacker-0.3.3 → shinestacker-0.3.5}/.readthedocs.yaml +0 -0
  98. {shinestacker-0.3.3 → shinestacker-0.3.5}/LICENSE +0 -0
  99. {shinestacker-0.3.3 → shinestacker-0.3.5}/MANIFEST.in +0 -0
  100. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/alignment.md +0 -0
  101. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/api.md +0 -0
  102. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/balancing.md +0 -0
  103. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/conf.py +0 -0
  104. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/gui.md +0 -0
  105. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/multilayer.md +0 -0
  106. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/noise.md +0 -0
  107. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/requirements.txt +0 -0
  108. {shinestacker-0.3.3 → shinestacker-0.3.5}/docs/vignetting.md +0 -0
  109. {shinestacker-0.3.3 → shinestacker-0.3.5}/img/coins.gif +0 -0
  110. {shinestacker-0.3.3 → shinestacker-0.3.5}/img/coins_stack.jpg +0 -0
  111. {shinestacker-0.3.3 → shinestacker-0.3.5}/img/extreme-vignetting.jpg +0 -0
  112. {shinestacker-0.3.3 → shinestacker-0.3.5}/img/flow-diagram.png +0 -0
  113. {shinestacker-0.3.3 → shinestacker-0.3.5}/img/gui-finder.png +0 -0
  114. {shinestacker-0.3.3 → shinestacker-0.3.5}/img/gui-project-run.png +0 -0
  115. {shinestacker-0.3.3 → shinestacker-0.3.5}/img/gui-retouch.png +0 -0
  116. {shinestacker-0.3.3 → shinestacker-0.3.5}/pyproject.toml +0 -0
  117. {shinestacker-0.3.3 → shinestacker-0.3.5}/scripts/build_release.py +0 -0
  118. {shinestacker-0.3.3 → shinestacker-0.3.5}/scripts/validate-tomli.py +0 -0
  119. {shinestacker-0.3.3 → shinestacker-0.3.5}/setup.cfg +0 -0
  120. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/app/__init__.py +0 -0
  121. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/config/__init__.py +0 -0
  122. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/config/config.py +0 -0
  123. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/config/constants.py +0 -0
  124. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/config/gui_constants.py +0 -0
  125. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/core/__init__.py +0 -0
  126. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/__init__.py +0 -0
  127. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/ico/focus_stack_bkg.png +0 -0
  128. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/ico/shinestacker.icns +0 -0
  129. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/ico/shinestacker.ico +0 -0
  130. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/ico/shinestacker.png +0 -0
  131. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/img/close-round-line-icon.png +0 -0
  132. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/img/forward-button-icon.png +0 -0
  133. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/img/play-button-round-icon.png +0 -0
  134. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/gui/img/plus-round-line-icon.png +0 -0
  135. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker/retouch/__init__.py +0 -0
  136. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker.egg-info/dependency_links.txt +0 -0
  137. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker.egg-info/entry_points.txt +0 -0
  138. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker.egg-info/requires.txt +0 -0
  139. {shinestacker-0.3.3 → shinestacker-0.3.5}/src/shinestacker.egg-info/top_level.txt +0 -0
@@ -0,0 +1,8 @@
1
+ [flake8]
2
+ exclude =
3
+ */.ipynb_checkpoints/*
4
+ src/shinestacker/_version.py
5
+ .venv
6
+ dist/*
7
+ max-line-length = 100
8
+ ignore = E402, W503, W504
@@ -0,0 +1,28 @@
1
+ name: Pylint Check
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, master ]
6
+ pull_request:
7
+ branches: [ main, master ]
8
+
9
+ jobs:
10
+ pylint:
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ contents: write
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ - uses: Silleellie/pylint-github-action@v2.1
18
+ with:
19
+ lint-path: src
20
+ python-version: 3.9
21
+ requirements-path: requirements.txt
22
+ readme-path: README.md
23
+ pylintrc-path: .pylintrc
24
+ badge-text: PyLint
25
+ color-bad-score: red
26
+ color-ok-score: orange
27
+ color-good-score: yellow
28
+ color-perfect-score: brightgreen
@@ -0,0 +1,6 @@
1
+ [MASTER]
2
+ ignore-patterns =
3
+ _version\.py,
4
+ ignore-paths =
5
+ .*\.ipynb_checkpoints,
6
+ .*\/\.ipynb_checkpoints
@@ -4,6 +4,40 @@ This page reports the main releases only and the main changes therein.
4
4
 
5
5
  ---
6
6
 
7
+ ## [v0.3.5] - 2025-08-17
8
+ **Bug fixes**
9
+
10
+ ### Changes
11
+
12
+ * fixed a bug that prevented to add sub-actoins
13
+ * vignetting constrains model parameter in order to prevent searching for dark areas at the center of the image instead of at periphery
14
+ * updated sample images and documentation
15
+
16
+ ---
17
+
18
+ ## [v0.3.4] - 2025-08-16
19
+ **Code consolidation and fixes**
20
+
21
+ ### Changes
22
+
23
+ * code consolidation with support of pylint code checking
24
+ * some bug fixes
25
+ * new project dialog shows the number of bunches, if selected
26
+ * updated sample images, examples and documentation
27
+
28
+ ---
29
+
30
+ ## [v0.3.3] - 2025-08-13
31
+ **Fixed PyPI distribution**
32
+
33
+ This release is equivalent to v0.3.2, but resolves a problem for PyPI distribution.
34
+
35
+ ### Changes
36
+
37
+ * examples and tests removed from PyPI distribution in order to fix file size limit
38
+
39
+ ---
40
+
7
41
  ## [v0.3.2] - 2025-08-13
8
42
  **Fixes and code refactoring**
9
43
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shinestacker
3
- Version: 0.3.3
3
+ Version: 0.3.5
4
4
  Summary: ShineStacker
5
5
  Author-email: Luca Lista <luka.lista@gmail.com>
6
6
  License-Expression: LGPL-3.0
@@ -36,11 +36,18 @@ Dynamic: license-file
36
36
  [![CI multiplatform](https://github.com/lucalista/shinestacker/actions/workflows/ci-multiplatform.yml/badge.svg)](https://github.com/lucalista/shinestacker/actions/workflows/ci-multiplatform.yml)
37
37
  [![PyPI version](https://img.shields.io/pypi/v/shinestacker?color=success)](https://pypi.org/project/shinestacker/)
38
38
  [![Python Versions](https://img.shields.io/pypi/pyversions/shinestacker)](https://pypi.org/project/shinestacker/)
39
- [![codecov](https://codecov.io/github/lucalista/shinestacker/graph/badge.svg?token=Y5NKW6VH5G)](https://codecov.io/github/lucalista/shinestacker)
39
+ [![Qt Versions](https://img.shields.io/badge/Qt-6-blue.svg?&logo=Qt&logoWidth=18&logoColor=white)](https://www.qt.io/qt-for-python)
40
+ [![pylint](https://img.shields.io/badge/PyLint-9.98-yellow?logo=python&logoColor=white)](https://github.com/lucalista/shinestacker/blob/main/.github/workflows/pylint.yml)
40
41
  [![Documentation Status](https://readthedocs.org/projects/shinestacker/badge/?version=latest)](https://shinestacker.readthedocs.io/en/latest/?badge=latest)
42
+ <!--
43
+ [![codecov](https://codecov.io/github/lucalista/shinestacker/graph/badge.svg?token=Y5NKW6VH5G)](https://codecov.io/github/lucalista/shinestacker)
44
+ -->
45
+
41
46
 
42
47
  <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/flies.gif' width="400" referrerpolicy="no-referrer"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/flies_stack.jpg' width="400" referrerpolicy="no-referrer">
43
48
 
49
+ <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coffee.gif' width="400" referrerpolicy="no-referrer"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coffee_stack.jpg' width="400" referrerpolicy="no-referrer">
50
+
44
51
  <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coins.gif' width="400" referrerpolicy="no-referrer"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coins_stack.jpg' width="400" referrerpolicy="no-referrer">
45
52
  > **Focus stacking** for microscopy, macro photography, and computational imaging
46
53
 
@@ -48,7 +55,7 @@ Dynamic: license-file
48
55
  - 🚀 **Batch Processing**: Align, balance, and stack hundreds of images
49
56
  - 🎨 **Hybrid Workflows**: Combine Python scripting with GUI refinement
50
57
  - 🧩 **Modular Architecture**: Mix-and-match processing modules
51
- - 🖌️ **Non-Destructive Editing**: Save multilayer TIFFs for retouching
58
+ - 🖌️ **Retouch Editing**: Final interactive retouch of stacked image from individual frames
52
59
  - 📊 **Jupyter Integration**: Reproducible research notebooks
53
60
 
54
61
  ## Interactive GUI
@@ -63,9 +70,9 @@ The GUI has two main working areas:
63
70
 
64
71
  <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/gui-retouch.png' width="600" referrerpolicy="no-referrer">
65
72
 
66
- # Documentation
73
+ # Resources
67
74
 
68
- 📖 [Main documentation](https://github.com/lucalista/shinestacker/blob/main/docs/main.md) • 📝 [Changelog](https://github.com/lucalista/shinestacker/blob/main/CHANGELOG.md)
75
+ 🌍 [Website on WordPress](https://shinestacker.wordpress.com) • 📖 [Main documentation](https://shinestacker.readthedocs.io) • 📝 [Changelog](https://github.com/lucalista/shinestacker/blob/main/CHANGELOG.md)
69
76
 
70
77
 
71
78
  # Credits
@@ -77,9 +84,14 @@ The main pyramid stack algorithm was initially inspired by the [Laplacian pyrami
77
84
  * [Pyramid Methods in Image Processing](https://www.researchgate.net/publication/246727904_Pyramid_Methods_in_Image_Processing), E. H. Adelson, C. H. Anderson, J. R. Bergen, P. J. Burt, J. M. Ogden, RCA Engineer, 29-6, Nov/Dec 1984
78
85
  Pyramid methods in image processing
79
86
  * [A Multi-focus Image Fusion Method Based on Laplacian Pyramid](http://www.jcomputers.us/vol6/jcp0612-07.pdf), Wencheng Wang, Faliang Chang, Journal of Computers 6 (12), 2559, December 2011
80
- * Another [original implementation on GitHub](https://github.com/bznick98/Focus_Stacking) by Zongnan Bao
81
87
 
82
88
  # License
83
89
 
84
90
  The software is provided as is under the [GNU Lesser General Public License v3.0](https://choosealicense.com/licenses/lgpl-3.0/).
85
91
 
92
+ # Attribution request
93
+ 📸 If you publish images created with Shine Stacker, please consider adding a note such as:
94
+
95
+ *Created with Shine Stacker – https://github.com/lucalista/shinestacker*
96
+
97
+ This is not mandatory, but highly appreciated.
@@ -5,11 +5,18 @@
5
5
  [![CI multiplatform](https://github.com/lucalista/shinestacker/actions/workflows/ci-multiplatform.yml/badge.svg)](https://github.com/lucalista/shinestacker/actions/workflows/ci-multiplatform.yml)
6
6
  [![PyPI version](https://img.shields.io/pypi/v/shinestacker?color=success)](https://pypi.org/project/shinestacker/)
7
7
  [![Python Versions](https://img.shields.io/pypi/pyversions/shinestacker)](https://pypi.org/project/shinestacker/)
8
- [![codecov](https://codecov.io/github/lucalista/shinestacker/graph/badge.svg?token=Y5NKW6VH5G)](https://codecov.io/github/lucalista/shinestacker)
8
+ [![Qt Versions](https://img.shields.io/badge/Qt-6-blue.svg?&logo=Qt&logoWidth=18&logoColor=white)](https://www.qt.io/qt-for-python)
9
+ [![pylint](https://img.shields.io/badge/PyLint-9.98-yellow?logo=python&logoColor=white)](https://github.com/lucalista/shinestacker/blob/main/.github/workflows/pylint.yml)
9
10
  [![Documentation Status](https://readthedocs.org/projects/shinestacker/badge/?version=latest)](https://shinestacker.readthedocs.io/en/latest/?badge=latest)
11
+ <!--
12
+ [![codecov](https://codecov.io/github/lucalista/shinestacker/graph/badge.svg?token=Y5NKW6VH5G)](https://codecov.io/github/lucalista/shinestacker)
13
+ -->
14
+
10
15
 
11
16
  <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/flies.gif' width="400" referrerpolicy="no-referrer"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/flies_stack.jpg' width="400" referrerpolicy="no-referrer">
12
17
 
18
+ <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coffee.gif' width="400" referrerpolicy="no-referrer"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coffee_stack.jpg' width="400" referrerpolicy="no-referrer">
19
+
13
20
  <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coins.gif' width="400" referrerpolicy="no-referrer"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coins_stack.jpg' width="400" referrerpolicy="no-referrer">
14
21
  > **Focus stacking** for microscopy, macro photography, and computational imaging
15
22
 
@@ -17,7 +24,7 @@
17
24
  - 🚀 **Batch Processing**: Align, balance, and stack hundreds of images
18
25
  - 🎨 **Hybrid Workflows**: Combine Python scripting with GUI refinement
19
26
  - 🧩 **Modular Architecture**: Mix-and-match processing modules
20
- - 🖌️ **Non-Destructive Editing**: Save multilayer TIFFs for retouching
27
+ - 🖌️ **Retouch Editing**: Final interactive retouch of stacked image from individual frames
21
28
  - 📊 **Jupyter Integration**: Reproducible research notebooks
22
29
 
23
30
  ## Interactive GUI
@@ -32,9 +39,9 @@ The GUI has two main working areas:
32
39
 
33
40
  <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/gui-retouch.png' width="600" referrerpolicy="no-referrer">
34
41
 
35
- # Documentation
42
+ # Resources
36
43
 
37
- 📖 [Main documentation](https://github.com/lucalista/shinestacker/blob/main/docs/main.md) • 📝 [Changelog](https://github.com/lucalista/shinestacker/blob/main/CHANGELOG.md)
44
+ 🌍 [Website on WordPress](https://shinestacker.wordpress.com) • 📖 [Main documentation](https://shinestacker.readthedocs.io) • 📝 [Changelog](https://github.com/lucalista/shinestacker/blob/main/CHANGELOG.md)
38
45
 
39
46
 
40
47
  # Credits
@@ -46,9 +53,14 @@ The main pyramid stack algorithm was initially inspired by the [Laplacian pyrami
46
53
  * [Pyramid Methods in Image Processing](https://www.researchgate.net/publication/246727904_Pyramid_Methods_in_Image_Processing), E. H. Adelson, C. H. Anderson, J. R. Bergen, P. J. Burt, J. M. Ogden, RCA Engineer, 29-6, Nov/Dec 1984
47
54
  Pyramid methods in image processing
48
55
  * [A Multi-focus Image Fusion Method Based on Laplacian Pyramid](http://www.jcomputers.us/vol6/jcp0612-07.pdf), Wencheng Wang, Faliang Chang, Journal of Computers 6 (12), 2559, December 2011
49
- * Another [original implementation on GitHub](https://github.com/bznick98/Focus_Stacking) by Zongnan Bao
50
56
 
51
57
  # License
52
58
 
53
59
  The software is provided as is under the [GNU Lesser General Public License v3.0](https://choosealicense.com/licenses/lgpl-3.0/).
54
60
 
61
+ # Attribution request
62
+ 📸 If you publish images created with Shine Stacker, please consider adding a note such as:
63
+
64
+ *Created with Shine Stacker – https://github.com/lucalista/shinestacker*
65
+
66
+ This is not mandatory, but highly appreciated.
@@ -0,0 +1,80 @@
1
+ THIRD-PARTY LICENSES
2
+ ====================
3
+
4
+ This application bundles several third-party Python packages.
5
+ Each package is copyrighted by its respective authors and distributed under the following licenses.
6
+ Full license texts are reproduced below when required.
7
+
8
+ -------------------------------------------------------------------------------
9
+ matplotlib
10
+ License: PSF license + BSD style
11
+ https://matplotlib.org/stable/users/project/license.html
12
+
13
+ -------------------------------------------------------------------------------
14
+ imagecodecs
15
+ License: BSD-3-Clause
16
+ https://pypi.org/project/imagecodecs/
17
+
18
+ -------------------------------------------------------------------------------
19
+ jsonpickle
20
+ License: BSD-3-Clause
21
+ https://github.com/jsonpickle/jsonpickle
22
+
23
+ -------------------------------------------------------------------------------
24
+ numpy
25
+ License: BSD-3-Clause
26
+ https://numpy.org/
27
+
28
+ -------------------------------------------------------------------------------
29
+ opencv-python
30
+ License: Apache License 2.0
31
+ https://github.com/opencv/opencv-python
32
+
33
+ -------------------------------------------------------------------------------
34
+ pillow
35
+ License: Historical PIL Software License (similar to MIT)
36
+ https://python-pillow.org
37
+
38
+ -------------------------------------------------------------------------------
39
+ psdtags
40
+ License: MIT
41
+ https://pypi.org/project/psdtags/
42
+
43
+ -------------------------------------------------------------------------------
44
+ PySide6
45
+ License: GNU Lesser General Public License v3.0 (LGPL-3.0)
46
+ or commercial license from The Qt Company
47
+ https://doc.qt.io/qtforpython/
48
+
49
+ Full license text follows:
50
+
51
+ --- BEGIN LGPL-3.0 LICENSE ---
52
+ <qui incolla il testo completo della LGPL-3.0>
53
+ --- END LGPL-3.0 LICENSE ---
54
+
55
+ -------------------------------------------------------------------------------
56
+ scipy
57
+ License: BSD-3-Clause
58
+ https://scipy.org/
59
+
60
+ -------------------------------------------------------------------------------
61
+ tifffile
62
+ License: BSD-3-Clause
63
+ https://www.lfd.uci.edu/~gohlke/
64
+
65
+ -------------------------------------------------------------------------------
66
+ tqdm
67
+ License: Mozilla Public License 2.0 (MPL-2.0)
68
+ https://github.com/tqdm/tqdm
69
+
70
+ Full license text follows:
71
+
72
+ --- BEGIN MPL-2.0 LICENSE ---
73
+ <qui incolla il testo completo della MPL-2.0>
74
+ --- END MPL-2.0 LICENSE ---
75
+
76
+ -------------------------------------------------------------------------------
77
+
78
+ NOTE:
79
+ This file is provided for license compliance and attribution purposes.
80
+ Your application code is licensed separately under the GNU Lesser General Public License v3.0.
@@ -10,7 +10,7 @@ Arguments for the constructor of ```FocusStack``` are:
10
10
  * ```output_path``` (optional): the subdirectory within ```working_path``` where aligned images are written. If not specified, it is equal to ```name```.
11
11
  * ```working_path```: the directory that contains input and output image subdirectories. If not specified, it is the same as ```job.working_path```.
12
12
  * ```exif_path``` (optional): if specified, EXIF data are copied to the output file from file in the specified directory. If not specified, it is the source directory used as input for the first action. If set equal to ```''``` no EXIF data is saved.
13
- * ```denoise``` (optoinal): if specified, a denois algorithm is applied. A value of 0.75 to 1.00 does not reduce details in an appreciable way, and is suitable for modest noise reduction. denoise may be useful for 8-bit images, or for images taken at large ISO. 16-bits images at low ISO usually don't require denoise. See [Image Denoising](https://docs.opencv.org/3.4/d5/d69/tutorial_py_non_local_means.html) for more details.
13
+ * ```denoise_amount``` (optoinal): if specified, a denois algorithm is applied. A value of 0.75 to 1.00 does not reduce details in an appreciable way, and is suitable for modest noise reduction. denoise may be useful for 8-bit images, or for images taken at large ISO. 16-bits images at low ISO usually don't require denoise. See [Image Denoising](https://docs.opencv.org/3.4/d5/d69/tutorial_py_non_local_means.html) for more details.
14
14
  * ```prefix``` (optional): if specified, the specified string is pre-pended to the file name. May be useful if more algorithms are ran, and different file names are used for the output of different algorithms.
15
15
  * ```enabled``` (optional, default: ``True```): allows to switch on and off this module.
16
16
 
@@ -28,7 +28,7 @@ Arguments for the constructor of ```FocusStackBunch``` are:
28
28
  * ```exif_path``` (optional): if specified, EXIF data are copied to the output file from file in the specified directory. If not specified, it is the source directory used as * ```frames``` (optional, default: 10): the number of frames in each bunch that are stacked together.
29
29
  * ```frames``` (optional, default: 10): the number of frames that are fused together.
30
30
  * ```overlap``` (optional, default: 0): the number of overlapping frames between a bunch and the following one.
31
- * ```denoise``` (optoinal): if specified, a denois algorithm is applied. A value of 0.75 to 1.00 does not reduce details in an appreciable way, and is suitable for modest noise reduction. denoise may be useful for 8-bit images, or for images taken at large ISO. 16-bits images at low ISO usually don't require denoise. See [Image Denoising](https://docs.opencv.org/3.4/d5/d69/tutorial_py_non_local_means.html) for more details.
31
+ * ```denoise_amount``` (optoinal): if specified, a denois algorithm is applied. A value of 0.75 to 1.00 does not reduce details in an appreciable way, and is suitable for modest noise reduction. denoise may be useful for 8-bit images, or for images taken at large ISO. 16-bits images at low ISO usually don't require denoise. See [Image Denoising](https://docs.opencv.org/3.4/d5/d69/tutorial_py_non_local_means.html) for more details.
32
32
  * ```prefix``` (optional): if specified, the specified string is pre-pended to the file name. May be useful if more algorithms are ran, and different file names are used for the output of different algorithms.
33
33
  * ```enabled``` (optional, default: ```True```): allows to switch on and off this module.
34
34
 
@@ -0,0 +1,17 @@
1
+ # Shine Stacker
2
+
3
+ ## Focus Stacking Processing Framework and GUI
4
+
5
+ ```{toctree}
6
+ :maxdepth: 2
7
+ :caption: Content
8
+
9
+ main.md
10
+ gui.md
11
+ job.md
12
+ alignment.md
13
+ balancing.md
14
+ focus_stacking.md
15
+ multilayer.md
16
+ noise.md
17
+ vignetting.md
@@ -5,20 +5,13 @@ Create a job, then schedule the desired actions in a job, then run the job.
5
5
  Quick start example:
6
6
 
7
7
  ```python
8
- from focus_stack import *
8
+ from shinestacker import *
9
9
 
10
- job = StackJob("job", "E:/Focus stacking/My image directory/", input_path="src")
11
- job.add_action(NoiseDetection())
12
- job.run()
13
-
14
- job = StackJob("job", "E:/Focus stacking/My image directory/", input_path="src")
15
- job.add_action(Actions("align", actions=[MaskNoise(),
16
- AlignFrames(),
17
- BalanceFrames(mask_size=0.9, i_min=150, i_max=65385)]))
18
- job.add_action(FocusStackBunch("batches", PyramidStack(), frames=10, overlap=2, denoise=0.8))
19
- job.add_action(FocusStack("stack", PyramidStack(), postfix='_py', denoise=0.8))
20
- job.add_action(FocusStack("stack", DepthMapStack(), input_path='batches', postfix='_dm', denoise=0.8))
21
- job.add_action(MultiLayer("multilayer", input_path=['batches', 'stack']))
10
+ job = StackJob("job", "E:/focus_stacking/project_directory/", input_path="tiff_images")
11
+ job.add_action(CombinedActions("align", actions=[AlignFrames(), BalanceFrames()]))
12
+ job.add_action(FocusStackBunch("batches", PyramidStack(), frames=12, overlap=2))
13
+ job.add_action(FocusStack("stack", PyramidStack(), prefix='pyram_'))
14
+ job.add_action(FocusStack("stack", DepthMapStack(), prefix='dmap_'))
22
15
  job.run()
23
16
  ```
24
17
 
@@ -2,14 +2,10 @@
2
2
 
3
3
  ## Focus Stacking Processing Framework and GUI
4
4
 
5
- [![CI multiplatform](https://github.com/lucalista/shinestacker/actions/workflows/ci-multiplatform.yml/badge.svg)](https://github.com/lucalista/shinestacker/actions/workflows/ci-multiplatform.yml)
6
- [![PyPI version](https://img.shields.io/pypi/v/shinestacker?color=success)](https://pypi.org/project/shinestacker/)
7
- [![Python Versions](https://img.shields.io/pypi/pyversions/shinestacker)](https://pypi.org/project/shinestacker/)
8
- [![codecov](https://codecov.io/github/lucalista/shinestacker/graph/badge.svg?token=Y5NKW6VH5G)](https://codecov.io/github/lucalista/shinestacker)
9
- [![Documentation Status](https://readthedocs.org/projects/shinestacker/badge/?version=latest)](https://shinestacker.readthedocs.io/en/latest/?badge=latest)
10
-
11
5
  <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/flies.gif' width="400" referrerpolicy="no-referrer"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/flies_stack.jpg' width="400" referrerpolicy="no-referrer">
12
6
 
7
+ <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coffee.gif' width="400" referrerpolicy="no-referrer"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coffee_stack.jpg' width="400" referrerpolicy="no-referrer">
8
+
13
9
  <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coins.gif' width="400" referrerpolicy="no-referrer"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/coins_stack.jpg' width="400" referrerpolicy="no-referrer">
14
10
 
15
11
  > **Focus stacking** for microscopy, macro photography, and computational imaging
@@ -38,8 +34,8 @@ job.run()
38
34
  Clone the pagkage from GitHub:
39
35
 
40
36
  ```bash
41
- git clone https://github.com/lucalista/focusstack.git
42
- cd focusstack
37
+ git clone https://github.com/lucalista/shinestacker.git
38
+ cd shinestacker
43
39
  pip install -e .
44
40
  ```
45
41
 
@@ -47,7 +43,7 @@ pip install -e .
47
43
  Launch GUI
48
44
 
49
45
  ```bash
50
- focusstack
46
+ shinestacker
51
47
  ```
52
48
 
53
49
  Follow [GUI guide](gui.md) for batch processing and retouching.
@@ -56,21 +52,13 @@ Follow [GUI guide](gui.md) for batch processing and retouching.
56
52
  ## Advanced Processing Pipeline
57
53
 
58
54
  ```python
59
- from shinestacker.algorithms import *
60
-
61
- job = StackJob("job", "E:/Focus stacking/My image directory/", input_path="src")
62
- job.add_action(NoiseDetection())
63
- job.run()
55
+ from shinestacker import *
64
56
 
65
- job = StackJob("job", "E:/Focus stacking/My image directory/", input_path="src")
66
- job.add_action(CombinedActions("align",
67
- [MaskNoise(),Vignetting(), AlignFrames(),
68
- BalanceFrames(mask_size=0.9,
69
- intensity_interval={'min': 150, 'max': 65385})]))
70
- job.add_action(FocusStackBunch("bunches", PyramidStack(), frames=10, overlap=2, denoise=0.8))
71
- job.add_action(FocusStack("stack", PyramidStack(), prefix='pyramid_', denoise=0.8))
72
- job.add_action(FocusStack("stack", DepthMapStack(), input_path='batches', prefix='depthmap_', denoise=0.8))
73
- job.add_action(MultiLayer("multilayer", input_path=['batches', 'stack']))
57
+ job = StackJob("job", "E:/focus_stacking/project_directory/", input_path="tiff_images")
58
+ job.add_action(CombinedActions("align", actions=[AlignFrames(), BalanceFrames()]))
59
+ job.add_action(FocusStackBunch("batches", PyramidStack(), frames=12, overlap=2))
60
+ job.add_action(FocusStack("stack", PyramidStack(), prefix='pyram_'))
61
+ job.add_action(FocusStack("stack", DepthMapStack(), prefix='dmap_'))
74
62
  job.run()
75
63
  ```
76
64
 
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,13 @@
1
+ matplotlib
2
+ matplotlib
3
+ imagecodecs
4
+ jsonpickle
5
+ numpy
6
+ opencv_python
7
+ pillow
8
+ psdtags
9
+ PySide6
10
+ scipy
11
+ tifffile
12
+ tqdm
13
+ setuptools-scm
@@ -1,4 +1,5 @@
1
1
  # flake8: noqa F401 F403
2
+ # pylint: disable=C0114, E0401
2
3
  from ._version import __version__
3
4
  from . import config
4
5
  from . import core
@@ -13,4 +14,4 @@ from .algorithms import *
13
14
  __all__ = ['__version__']
14
15
  __all__ += config_all
15
16
  __all__ += core_all
16
- __all__ += algorithms_all
17
+ __all__ += algorithms_all
@@ -0,0 +1 @@
1
+ __version__ = '0.3.5'
@@ -1,4 +1,6 @@
1
1
  # flake8: noqa F401
2
+ # pylint: disable=C0114
3
+ import logging
2
4
  from .. config.constants import constants
3
5
  from .stack_framework import StackJob, CombinedActions
4
6
  from .align import AlignFrames
@@ -9,11 +11,10 @@ from .pyramid import PyramidStack
9
11
  from .multilayer import MultiLayer
10
12
  from .noise_detection import NoiseDetection, MaskNoise
11
13
  from .vignetting import Vignetting
12
- import logging
13
14
  logger = logging.getLogger(__name__)
14
15
  logger.addHandler(logging.NullHandler())
15
16
 
16
17
  __all__ = [
17
18
  'StackJob', 'CombinedActions', 'AlignFrames', 'BalanceFrames', 'FocusStackBunch', 'FocusStack',
18
19
  'DepthMapStack', 'PyramidStack', 'MultiLayer', 'NoiseDetection', 'MaskNoise', 'Vignetting'
19
- ]
20
+ ]