shinestacker 1.9.0__tar.gz → 1.9.2__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 (172) hide show
  1. {shinestacker-1.9.0 → shinestacker-1.9.2}/CHANGELOG.md +34 -1
  2. {shinestacker-1.9.0/src/shinestacker.egg-info → shinestacker-1.9.2}/PKG-INFO +1 -1
  3. {shinestacker-1.9.0 → shinestacker-1.9.2}/pyproject.toml +2 -0
  4. shinestacker-1.9.2/src/shinestacker/_version.py +1 -0
  5. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/align.py +18 -1
  6. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/align_parallel.py +9 -5
  7. shinestacker-1.9.2/src/shinestacker/algorithms/exif.py +729 -0
  8. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/stack.py +8 -4
  9. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/app/main.py +1 -1
  10. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/action_config_dialog.py +0 -4
  11. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/config_dialog.py +6 -5
  12. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/main_window.py +6 -0
  13. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/menu_manager.py +8 -2
  14. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/brush_tool.py +20 -0
  15. shinestacker-1.9.2/src/shinestacker/retouch/exif_data.py +75 -0
  16. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/image_editor_ui.py +79 -3
  17. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/image_viewer.py +6 -1
  18. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/io_gui_handler.py +9 -12
  19. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/shortcuts_help.py +15 -8
  20. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/view_strategy.py +12 -2
  21. {shinestacker-1.9.0 → shinestacker-1.9.2/src/shinestacker.egg-info}/PKG-INFO +1 -1
  22. shinestacker-1.9.0/src/shinestacker/_version.py +0 -1
  23. shinestacker-1.9.0/src/shinestacker/algorithms/exif.py +0 -486
  24. shinestacker-1.9.0/src/shinestacker/retouch/exif_data.py +0 -55
  25. {shinestacker-1.9.0 → shinestacker-1.9.2}/.coveragerc +0 -0
  26. {shinestacker-1.9.0 → shinestacker-1.9.2}/.flake8 +0 -0
  27. {shinestacker-1.9.0 → shinestacker-1.9.2}/.github/workflows/ci-multiplatform.yml +0 -0
  28. {shinestacker-1.9.0 → shinestacker-1.9.2}/.github/workflows/pylint.yml +0 -0
  29. {shinestacker-1.9.0 → shinestacker-1.9.2}/.github/workflows/pypi-publish.yml +0 -0
  30. {shinestacker-1.9.0 → shinestacker-1.9.2}/.github/workflows/release.yml +0 -0
  31. {shinestacker-1.9.0 → shinestacker-1.9.2}/.gitignore +0 -0
  32. {shinestacker-1.9.0 → shinestacker-1.9.2}/.pylintrc +0 -0
  33. {shinestacker-1.9.0 → shinestacker-1.9.2}/.readthedocs.yaml +0 -0
  34. {shinestacker-1.9.0 → shinestacker-1.9.2}/LICENSE +0 -0
  35. {shinestacker-1.9.0 → shinestacker-1.9.2}/MANIFEST.in +0 -0
  36. {shinestacker-1.9.0 → shinestacker-1.9.2}/README.md +0 -0
  37. {shinestacker-1.9.0 → shinestacker-1.9.2}/THIRD_PARTY_LICENSES.txt +0 -0
  38. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/alignment.md +0 -0
  39. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/api.md +0 -0
  40. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/balancing.md +0 -0
  41. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/conf.py +0 -0
  42. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/focus_stacking.md +0 -0
  43. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/gui.md +0 -0
  44. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/index.md +0 -0
  45. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/job.md +0 -0
  46. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/macos-install.md +0 -0
  47. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/main.md +0 -0
  48. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/multilayer.md +0 -0
  49. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/noise.md +0 -0
  50. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/requirements.txt +0 -0
  51. {shinestacker-1.9.0 → shinestacker-1.9.2}/docs/vignetting.md +0 -0
  52. {shinestacker-1.9.0 → shinestacker-1.9.2}/img/coffee.gif +0 -0
  53. {shinestacker-1.9.0 → shinestacker-1.9.2}/img/coffee_stack.jpg +0 -0
  54. {shinestacker-1.9.0 → shinestacker-1.9.2}/img/extreme-vignetting.jpg +0 -0
  55. {shinestacker-1.9.0 → shinestacker-1.9.2}/img/flies.gif +0 -0
  56. {shinestacker-1.9.0 → shinestacker-1.9.2}/img/flies_stack.jpg +0 -0
  57. {shinestacker-1.9.0 → shinestacker-1.9.2}/img/flow-diagram.png +0 -0
  58. {shinestacker-1.9.0 → shinestacker-1.9.2}/img/gui-project-new.png +0 -0
  59. {shinestacker-1.9.0 → shinestacker-1.9.2}/img/gui-project-run.png +0 -0
  60. {shinestacker-1.9.0 → shinestacker-1.9.2}/img/gui-retouch.png +0 -0
  61. {shinestacker-1.9.0 → shinestacker-1.9.2}/index.html +0 -0
  62. {shinestacker-1.9.0 → shinestacker-1.9.2}/requirements.txt +0 -0
  63. {shinestacker-1.9.0 → shinestacker-1.9.2}/scripts/build_release.py +0 -0
  64. {shinestacker-1.9.0 → shinestacker-1.9.2}/scripts/create_macos_icon.py +0 -0
  65. {shinestacker-1.9.0 → shinestacker-1.9.2}/scripts/git-rev-list.sh +0 -0
  66. {shinestacker-1.9.0 → shinestacker-1.9.2}/scripts/hooks/hook-IPython.py +0 -0
  67. {shinestacker-1.9.0 → shinestacker-1.9.2}/scripts/hooks/hook-PySide6.py +0 -0
  68. {shinestacker-1.9.0 → shinestacker-1.9.2}/scripts/hooks/hook-opencv.py +0 -0
  69. {shinestacker-1.9.0 → shinestacker-1.9.2}/scripts/hooks/hook-tests.py +0 -0
  70. {shinestacker-1.9.0 → shinestacker-1.9.2}/scripts/scan_imports.py +0 -0
  71. {shinestacker-1.9.0 → shinestacker-1.9.2}/scripts/shinestacker-inno-setup.iss +0 -0
  72. {shinestacker-1.9.0 → shinestacker-1.9.2}/scripts/validate-tomli.py +0 -0
  73. {shinestacker-1.9.0 → shinestacker-1.9.2}/setup.cfg +0 -0
  74. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/__init__.py +0 -0
  75. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/__init__.py +0 -0
  76. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/align_auto.py +0 -0
  77. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/balance.py +0 -0
  78. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/base_stack_algo.py +0 -0
  79. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/corrections.py +0 -0
  80. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/denoise.py +0 -0
  81. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/depth_map.py +0 -0
  82. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/multilayer.py +0 -0
  83. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/noise_detection.py +0 -0
  84. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/pyramid.py +0 -0
  85. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/pyramid_auto.py +0 -0
  86. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/pyramid_tiles.py +0 -0
  87. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/sharpen.py +0 -0
  88. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/stack_framework.py +0 -0
  89. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/utils.py +0 -0
  90. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/vignetting.py +0 -0
  91. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/algorithms/white_balance.py +0 -0
  92. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/app/__init__.py +0 -0
  93. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/app/about_dialog.py +0 -0
  94. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/app/args_parser_opts.py +0 -0
  95. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/app/gui_utils.py +0 -0
  96. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/app/help_menu.py +0 -0
  97. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/app/open_frames.py +0 -0
  98. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/app/project.py +0 -0
  99. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/app/retouch.py +0 -0
  100. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/app/settings_dialog.py +0 -0
  101. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/config/__init__.py +0 -0
  102. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/config/app_config.py +0 -0
  103. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/config/config.py +0 -0
  104. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/config/constants.py +0 -0
  105. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/config/gui_constants.py +0 -0
  106. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/config/settings.py +0 -0
  107. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/core/__init__.py +0 -0
  108. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/core/colors.py +0 -0
  109. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/core/core_utils.py +0 -0
  110. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/core/exceptions.py +0 -0
  111. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/core/framework.py +0 -0
  112. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/core/logging.py +0 -0
  113. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/__init__.py +0 -0
  114. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/action_config.py +0 -0
  115. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/base_form_dialog.py +0 -0
  116. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/colors.py +0 -0
  117. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/flow_layout.py +0 -0
  118. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/folder_file_selection.py +0 -0
  119. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/gui_images.py +0 -0
  120. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/gui_logging.py +0 -0
  121. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/gui_run.py +0 -0
  122. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/ico/shinestacker.icns +0 -0
  123. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/ico/shinestacker.ico +0 -0
  124. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/ico/shinestacker.png +0 -0
  125. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/ico/shinestacker.svg +0 -0
  126. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/img/dark/close-round-line-icon.png +0 -0
  127. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/img/dark/forward-button-icon.png +0 -0
  128. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/img/dark/play-button-round-icon.png +0 -0
  129. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/img/dark/plus-round-line-icon.png +0 -0
  130. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/img/dark/shinestacker_bkg.png +0 -0
  131. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/img/light/close-round-line-icon.png +0 -0
  132. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/img/light/forward-button-icon.png +0 -0
  133. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/img/light/play-button-round-icon.png +0 -0
  134. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/img/light/plus-round-line-icon.png +0 -0
  135. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/img/light/shinestacker_bkg.png +0 -0
  136. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/new_project.py +0 -0
  137. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/project_controller.py +0 -0
  138. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/project_converter.py +0 -0
  139. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/project_editor.py +0 -0
  140. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/project_model.py +0 -0
  141. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/recent_file_manager.py +0 -0
  142. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/select_path_widget.py +0 -0
  143. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/sys_mon.py +0 -0
  144. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/tab_widget.py +0 -0
  145. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/gui/time_progress_bar.py +0 -0
  146. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/__init__.py +0 -0
  147. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/adjustments.py +0 -0
  148. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/base_filter.py +0 -0
  149. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/brush.py +0 -0
  150. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/brush_gradient.py +0 -0
  151. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/brush_preview.py +0 -0
  152. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/denoise_filter.py +0 -0
  153. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/display_manager.py +0 -0
  154. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/file_loader.py +0 -0
  155. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/filter_manager.py +0 -0
  156. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/icon_container.py +0 -0
  157. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/image_view_status.py +0 -0
  158. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/io_threads.py +0 -0
  159. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/layer_collection.py +0 -0
  160. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/overlaid_view.py +0 -0
  161. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/paint_area_manager.py +0 -0
  162. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/sidebyside_view.py +0 -0
  163. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/transformation_manager.py +0 -0
  164. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/undo_manager.py +0 -0
  165. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/unsharp_mask_filter.py +0 -0
  166. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/vignetting_filter.py +0 -0
  167. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker/retouch/white_balance_filter.py +0 -0
  168. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker.egg-info/SOURCES.txt +0 -0
  169. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker.egg-info/dependency_links.txt +0 -0
  170. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker.egg-info/entry_points.txt +0 -0
  171. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker.egg-info/requires.txt +0 -0
  172. {shinestacker-1.9.0 → shinestacker-1.9.2}/src/shinestacker.egg-info/top_level.txt +0 -0
@@ -2,9 +2,42 @@
2
2
 
3
3
  This page reports the main releases only and the main changes therein.
4
4
 
5
+ ## [v1.9.2] - 2025-10-29
6
+ ** Fixes to EXIF data and alignment; GUI refinements **
7
+
8
+ ### Added
9
+ - new keyboard and mouse wheel shortcuts to control brush opacity and flow
10
+ - more action shurtcuts to context menu in the project area
11
+
12
+ ### Fixed
13
+ - enlarged previously too tight validity tolerance thresholds for composite tansformations
14
+ - skipping frames with missing alignment transformation
15
+ - focus bunch processing order is now sequential
16
+ - missing exposure data in JPEG EXIF data
17
+ - conversion of EXIF data between formats JPEG, TIFF and PNG
18
+
19
+ ---
20
+
21
+ ## [v1.9.1] - 2025-10-23
22
+ ** Improved EXIF data handling GUI refinements **
23
+
24
+ ### Added
25
+ - missing actions "Show EXIF Data" and "Delete EXIF Data"
26
+
27
+ ### Fixed
28
+ - if saving EXIF data fails, a warning is issued instead of stopping the run
29
+ - exif data correctly loaded when opening image files in retouch mode
30
+ - removed duplicated parameter from config dialog (FocusStackBunch)
31
+ - fixed thread warning when the application quits
32
+ - more robust EXIF data code for JPG format prevents possible errors
33
+
34
+ ### Changed
35
+ - improved EXIF GUI: more data displayed and improved selection logic
36
+
37
+ -----
5
38
 
6
39
  ## [v1.9.0] - 2025-10-19
7
- ** Added PNG format support and EXIF failure fix**
40
+ ** Added PNG format support and fixed EXIF failure **
8
41
 
9
42
  ### Added
10
43
  - support of images in PNG format, both in 8 bit and 16 bit depth. Note: EXIF data are not supported for 16 bit PNG because of limitations in the PIL and Open CV python libraries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shinestacker
3
- Version: 1.9.0
3
+ Version: 1.9.2
4
4
  Summary: ShineStacker
5
5
  Author-email: Luca Lista <luka.lista@gmail.com>
6
6
  License-Expression: LGPL-3.0
@@ -64,6 +64,8 @@ packages = [
64
64
  "shinestacker.algorithms",
65
65
  "shinestacker.gui",
66
66
  "shinestacker.gui.img",
67
+ "shinestacker.gui.img.dark",
68
+ "shinestacker.gui.img.light",
67
69
  "shinestacker.retouch"
68
70
  ]
69
71
  include-package-data = true
@@ -0,0 +1 @@
1
+ __version__ = '1.9.2'
@@ -65,6 +65,20 @@ _HOMOGRAPHY_THRESHOLDS = {
65
65
  'max_aspect_ratio': 2.0, # max aspect ratio change
66
66
  }
67
67
 
68
+ _AFFINE_THRESHOLDS_LARGE = {
69
+ 'max_rotation': 20.0, # degrees
70
+ 'min_scale': 0.5,
71
+ 'max_scale': 1.5,
72
+ 'max_shear': 10.0, # degrees
73
+ 'max_translation_ratio': 0.2, # 20% of image dimension
74
+ }
75
+
76
+ _HOMOGRAPHY_THRESHOLDS_LARGE = {
77
+ 'max_skew': 12.0, # degrees
78
+ 'max_scale_change': 2.0, # max area change ratio
79
+ 'max_aspect_ratio': 4.0, # max aspect ratio change
80
+ }
81
+
68
82
 
69
83
  def decompose_affine_matrix(m):
70
84
  a, b, tx = m[0, 0], m[0, 1], m[0, 2]
@@ -562,6 +576,9 @@ class AlignFramesBase(SubAction):
562
576
  def get_transform_thresholds(self):
563
577
  return _AFFINE_THRESHOLDS, _HOMOGRAPHY_THRESHOLDS
564
578
 
579
+ def get_transform_thresholds_large(self):
580
+ return _AFFINE_THRESHOLDS_LARGE, _HOMOGRAPHY_THRESHOLDS_LARGE
581
+
565
582
  def image_str(self, idx):
566
583
  return f"{self.process.frame_str(idx)}, " \
567
584
  f"{os.path.basename(self.process.input_filepath(idx))}"
@@ -771,7 +788,7 @@ class AlignFrames(AlignFramesBase):
771
788
  f"{self.process.name}-matches-{idx_str}.pdf")
772
789
  else:
773
790
  plot_path = None
774
- affine_thresholds, homography_thresholds = self.get_transform_thresholds()
791
+ affine_thresholds, homography_thresholds = self.get_transform_thresholds_large()
775
792
  n_good_matches, _m, img = align_images(
776
793
  img_ref, img_0,
777
794
  feature_config=self.feature_config,
@@ -104,7 +104,6 @@ class AlignFramesParallel(AlignFramesBase):
104
104
  self._img_locks[i] = 0
105
105
  elif self._img_cache[i] is not None:
106
106
  cached_images += 1
107
- # self.print_message(f"cached images: {cached_images}")
108
107
  gc.collect()
109
108
 
110
109
  def begin(self, process):
@@ -176,17 +175,22 @@ class AlignFramesParallel(AlignFramesBase):
176
175
  self._transforms[idx] = None
177
176
  gc.collect()
178
177
  missing_transforms = 0
179
- thresholds = self.get_transform_thresholds()
178
+ thresholds = self.get_transform_thresholds_large()
180
179
  for i in range(n_frames):
181
180
  if self._cumulative_transforms[i] is not None:
182
181
  self._cumulative_transforms[i] = self._cumulative_transforms[i].astype(np.float32)
183
- is_valid, _reason, result = check_transform(
182
+ is_valid, reason, result = check_transform(
184
183
  self._cumulative_transforms[i], self._img_shapes[i],
185
184
  transform_type, *thresholds)
186
185
  if is_valid:
187
186
  self.save_transform_result(i, result)
188
187
  else:
188
+ self.print_message(
189
+ f"invalid cumulative transform for {self.image_str(i)}",
190
+ color=constants.LOG_COLOR_WARNING, level=logging.WARNING)
191
+ if self.alignment_config['abort_abnormal']:
189
192
  self._cumulative_transforms[i] = None
193
+ raise RuntimeError(f"invalid cumulative transformation: {reason}")
190
194
  else:
191
195
  missing_transforms += 1
192
196
  msg = "feature extaction completed"
@@ -337,9 +341,9 @@ class AlignFramesParallel(AlignFramesBase):
337
341
  m = self._cumulative_transforms[idx]
338
342
  if m is None:
339
343
  self.print_message(
340
- f"no transformation for {self.image_str(idx)}, skipping alignment",
344
+ f"no transformation for {self.image_str(idx)}, image skipped",
341
345
  color=constants.LOG_COLOR_WARNING, level=logging.WARNING)
342
- return img_0
346
+ return None
343
347
  transform_type = self.alignment_config['transform']
344
348
  if transform_type == constants.ALIGN_RIGID and m.shape != (2, 3):
345
349
  self.print_message(f"invalid matrix shape for rigid transform: {m.shape}")