setiastrosuitepro 1.6.7__py3-none-any.whl

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 setiastrosuitepro might be problematic. Click here for more details.

Files changed (394) hide show
  1. setiastro/__init__.py +2 -0
  2. setiastro/data/SASP_data.fits +0 -0
  3. setiastro/data/catalogs/List_of_Galaxies_with_Distances_Gly.csv +488 -0
  4. setiastro/data/catalogs/astrobin_filters.csv +890 -0
  5. setiastro/data/catalogs/astrobin_filters_page1_local.csv +51 -0
  6. setiastro/data/catalogs/cali2.csv +63 -0
  7. setiastro/data/catalogs/cali2color.csv +65 -0
  8. setiastro/data/catalogs/celestial_catalog - original.csv +16471 -0
  9. setiastro/data/catalogs/celestial_catalog.csv +24031 -0
  10. setiastro/data/catalogs/detected_stars.csv +24784 -0
  11. setiastro/data/catalogs/fits_header_data.csv +46 -0
  12. setiastro/data/catalogs/test.csv +8 -0
  13. setiastro/data/catalogs/updated_celestial_catalog.csv +16471 -0
  14. setiastro/images/Astro_Spikes.png +0 -0
  15. setiastro/images/Background_startup.jpg +0 -0
  16. setiastro/images/HRDiagram.png +0 -0
  17. setiastro/images/LExtract.png +0 -0
  18. setiastro/images/LInsert.png +0 -0
  19. setiastro/images/Oxygenation-atm-2.svg.png +0 -0
  20. setiastro/images/RGB080604.png +0 -0
  21. setiastro/images/abeicon.png +0 -0
  22. setiastro/images/aberration.png +0 -0
  23. setiastro/images/acv_icon.png +0 -0
  24. setiastro/images/andromedatry.png +0 -0
  25. setiastro/images/andromedatry_satellited.png +0 -0
  26. setiastro/images/annotated.png +0 -0
  27. setiastro/images/aperture.png +0 -0
  28. setiastro/images/astrosuite.ico +0 -0
  29. setiastro/images/astrosuite.png +0 -0
  30. setiastro/images/astrosuitepro.icns +0 -0
  31. setiastro/images/astrosuitepro.ico +0 -0
  32. setiastro/images/astrosuitepro.png +0 -0
  33. setiastro/images/background.png +0 -0
  34. setiastro/images/background2.png +0 -0
  35. setiastro/images/benchmark.png +0 -0
  36. setiastro/images/big_moon_stabilizer_timeline.png +0 -0
  37. setiastro/images/big_moon_stabilizer_timeline_clean.png +0 -0
  38. setiastro/images/blaster.png +0 -0
  39. setiastro/images/blink.png +0 -0
  40. setiastro/images/clahe.png +0 -0
  41. setiastro/images/collage.png +0 -0
  42. setiastro/images/colorwheel.png +0 -0
  43. setiastro/images/contsub.png +0 -0
  44. setiastro/images/convo.png +0 -0
  45. setiastro/images/copyslot.png +0 -0
  46. setiastro/images/cosmic.png +0 -0
  47. setiastro/images/cosmicsat.png +0 -0
  48. setiastro/images/crop1.png +0 -0
  49. setiastro/images/cropicon.png +0 -0
  50. setiastro/images/curves.png +0 -0
  51. setiastro/images/cvs.png +0 -0
  52. setiastro/images/debayer.png +0 -0
  53. setiastro/images/denoise_cnn_custom.png +0 -0
  54. setiastro/images/denoise_cnn_graph.png +0 -0
  55. setiastro/images/disk.png +0 -0
  56. setiastro/images/dse.png +0 -0
  57. setiastro/images/exoicon.png +0 -0
  58. setiastro/images/eye.png +0 -0
  59. setiastro/images/first_quarter.png +0 -0
  60. setiastro/images/fliphorizontal.png +0 -0
  61. setiastro/images/flipvertical.png +0 -0
  62. setiastro/images/font.png +0 -0
  63. setiastro/images/freqsep.png +0 -0
  64. setiastro/images/full_moon.png +0 -0
  65. setiastro/images/functionbundle.png +0 -0
  66. setiastro/images/graxpert.png +0 -0
  67. setiastro/images/green.png +0 -0
  68. setiastro/images/gridicon.png +0 -0
  69. setiastro/images/halo.png +0 -0
  70. setiastro/images/hdr.png +0 -0
  71. setiastro/images/histogram.png +0 -0
  72. setiastro/images/hubble.png +0 -0
  73. setiastro/images/imagecombine.png +0 -0
  74. setiastro/images/invert.png +0 -0
  75. setiastro/images/isophote.png +0 -0
  76. setiastro/images/isophote_demo_figure.png +0 -0
  77. setiastro/images/isophote_demo_image.png +0 -0
  78. setiastro/images/isophote_demo_model.png +0 -0
  79. setiastro/images/isophote_demo_residual.png +0 -0
  80. setiastro/images/jwstpupil.png +0 -0
  81. setiastro/images/last_quarter.png +0 -0
  82. setiastro/images/linearfit.png +0 -0
  83. setiastro/images/livestacking.png +0 -0
  84. setiastro/images/mask.png +0 -0
  85. setiastro/images/maskapply.png +0 -0
  86. setiastro/images/maskcreate.png +0 -0
  87. setiastro/images/maskremove.png +0 -0
  88. setiastro/images/morpho.png +0 -0
  89. setiastro/images/mosaic.png +0 -0
  90. setiastro/images/multiscale_decomp.png +0 -0
  91. setiastro/images/nbtorgb.png +0 -0
  92. setiastro/images/neutral.png +0 -0
  93. setiastro/images/new_moon.png +0 -0
  94. setiastro/images/nuke.png +0 -0
  95. setiastro/images/openfile.png +0 -0
  96. setiastro/images/pedestal.png +0 -0
  97. setiastro/images/pen.png +0 -0
  98. setiastro/images/pixelmath.png +0 -0
  99. setiastro/images/platesolve.png +0 -0
  100. setiastro/images/ppp.png +0 -0
  101. setiastro/images/pro.png +0 -0
  102. setiastro/images/project.png +0 -0
  103. setiastro/images/psf.png +0 -0
  104. setiastro/images/redo.png +0 -0
  105. setiastro/images/redoicon.png +0 -0
  106. setiastro/images/rescale.png +0 -0
  107. setiastro/images/rgbalign.png +0 -0
  108. setiastro/images/rgbcombo.png +0 -0
  109. setiastro/images/rgbextract.png +0 -0
  110. setiastro/images/rotate180.png +0 -0
  111. setiastro/images/rotatearbitrary.png +0 -0
  112. setiastro/images/rotateclockwise.png +0 -0
  113. setiastro/images/rotatecounterclockwise.png +0 -0
  114. setiastro/images/satellite.png +0 -0
  115. setiastro/images/script.png +0 -0
  116. setiastro/images/selectivecolor.png +0 -0
  117. setiastro/images/simbad.png +0 -0
  118. setiastro/images/slot0.png +0 -0
  119. setiastro/images/slot1.png +0 -0
  120. setiastro/images/slot2.png +0 -0
  121. setiastro/images/slot3.png +0 -0
  122. setiastro/images/slot4.png +0 -0
  123. setiastro/images/slot5.png +0 -0
  124. setiastro/images/slot6.png +0 -0
  125. setiastro/images/slot7.png +0 -0
  126. setiastro/images/slot8.png +0 -0
  127. setiastro/images/slot9.png +0 -0
  128. setiastro/images/spcc.png +0 -0
  129. setiastro/images/spin_precession_vs_lunar_distance.png +0 -0
  130. setiastro/images/spinner.gif +0 -0
  131. setiastro/images/stacking.png +0 -0
  132. setiastro/images/staradd.png +0 -0
  133. setiastro/images/staralign.png +0 -0
  134. setiastro/images/starnet.png +0 -0
  135. setiastro/images/starregistration.png +0 -0
  136. setiastro/images/starspike.png +0 -0
  137. setiastro/images/starstretch.png +0 -0
  138. setiastro/images/statstretch.png +0 -0
  139. setiastro/images/supernova.png +0 -0
  140. setiastro/images/uhs.png +0 -0
  141. setiastro/images/undoicon.png +0 -0
  142. setiastro/images/upscale.png +0 -0
  143. setiastro/images/viewbundle.png +0 -0
  144. setiastro/images/waning_crescent_1.png +0 -0
  145. setiastro/images/waning_crescent_2.png +0 -0
  146. setiastro/images/waning_crescent_3.png +0 -0
  147. setiastro/images/waning_crescent_4.png +0 -0
  148. setiastro/images/waning_crescent_5.png +0 -0
  149. setiastro/images/waning_gibbous_1.png +0 -0
  150. setiastro/images/waning_gibbous_2.png +0 -0
  151. setiastro/images/waning_gibbous_3.png +0 -0
  152. setiastro/images/waning_gibbous_4.png +0 -0
  153. setiastro/images/waning_gibbous_5.png +0 -0
  154. setiastro/images/waxing_crescent_1.png +0 -0
  155. setiastro/images/waxing_crescent_2.png +0 -0
  156. setiastro/images/waxing_crescent_3.png +0 -0
  157. setiastro/images/waxing_crescent_4.png +0 -0
  158. setiastro/images/waxing_crescent_5.png +0 -0
  159. setiastro/images/waxing_gibbous_1.png +0 -0
  160. setiastro/images/waxing_gibbous_2.png +0 -0
  161. setiastro/images/waxing_gibbous_3.png +0 -0
  162. setiastro/images/waxing_gibbous_4.png +0 -0
  163. setiastro/images/waxing_gibbous_5.png +0 -0
  164. setiastro/images/whitebalance.png +0 -0
  165. setiastro/images/wimi_icon_256x256.png +0 -0
  166. setiastro/images/wimilogo.png +0 -0
  167. setiastro/images/wims.png +0 -0
  168. setiastro/images/wrench_icon.png +0 -0
  169. setiastro/images/xisfliberator.png +0 -0
  170. setiastro/qml/ResourceMonitor.qml +128 -0
  171. setiastro/saspro/__init__.py +20 -0
  172. setiastro/saspro/__main__.py +964 -0
  173. setiastro/saspro/_generated/__init__.py +7 -0
  174. setiastro/saspro/_generated/build_info.py +3 -0
  175. setiastro/saspro/abe.py +1379 -0
  176. setiastro/saspro/abe_preset.py +196 -0
  177. setiastro/saspro/aberration_ai.py +910 -0
  178. setiastro/saspro/aberration_ai_preset.py +224 -0
  179. setiastro/saspro/accel_installer.py +218 -0
  180. setiastro/saspro/accel_workers.py +30 -0
  181. setiastro/saspro/acv_exporter.py +379 -0
  182. setiastro/saspro/add_stars.py +627 -0
  183. setiastro/saspro/astrobin_exporter.py +1010 -0
  184. setiastro/saspro/astrospike.py +153 -0
  185. setiastro/saspro/astrospike_python.py +1841 -0
  186. setiastro/saspro/autostretch.py +198 -0
  187. setiastro/saspro/backgroundneutral.py +639 -0
  188. setiastro/saspro/batch_convert.py +328 -0
  189. setiastro/saspro/batch_renamer.py +522 -0
  190. setiastro/saspro/blemish_blaster.py +494 -0
  191. setiastro/saspro/blink_comparator_pro.py +3149 -0
  192. setiastro/saspro/bundles.py +61 -0
  193. setiastro/saspro/bundles_dock.py +114 -0
  194. setiastro/saspro/cheat_sheet.py +213 -0
  195. setiastro/saspro/clahe.py +371 -0
  196. setiastro/saspro/comet_stacking.py +1442 -0
  197. setiastro/saspro/common_tr.py +107 -0
  198. setiastro/saspro/config.py +38 -0
  199. setiastro/saspro/config_bootstrap.py +40 -0
  200. setiastro/saspro/config_manager.py +316 -0
  201. setiastro/saspro/continuum_subtract.py +1620 -0
  202. setiastro/saspro/convo.py +1403 -0
  203. setiastro/saspro/convo_preset.py +414 -0
  204. setiastro/saspro/copyastro.py +190 -0
  205. setiastro/saspro/cosmicclarity.py +1593 -0
  206. setiastro/saspro/cosmicclarity_preset.py +407 -0
  207. setiastro/saspro/crop_dialog_pro.py +1005 -0
  208. setiastro/saspro/crop_preset.py +189 -0
  209. setiastro/saspro/curve_editor_pro.py +2608 -0
  210. setiastro/saspro/curves_preset.py +375 -0
  211. setiastro/saspro/debayer.py +673 -0
  212. setiastro/saspro/debug_utils.py +29 -0
  213. setiastro/saspro/dnd_mime.py +35 -0
  214. setiastro/saspro/doc_manager.py +2727 -0
  215. setiastro/saspro/exoplanet_detector.py +2258 -0
  216. setiastro/saspro/file_utils.py +284 -0
  217. setiastro/saspro/fitsmodifier.py +748 -0
  218. setiastro/saspro/fix_bom.py +32 -0
  219. setiastro/saspro/free_torch_memory.py +48 -0
  220. setiastro/saspro/frequency_separation.py +1352 -0
  221. setiastro/saspro/function_bundle.py +1596 -0
  222. setiastro/saspro/generate_translations.py +3092 -0
  223. setiastro/saspro/ghs_dialog_pro.py +728 -0
  224. setiastro/saspro/ghs_preset.py +284 -0
  225. setiastro/saspro/graxpert.py +638 -0
  226. setiastro/saspro/graxpert_preset.py +287 -0
  227. setiastro/saspro/gui/__init__.py +0 -0
  228. setiastro/saspro/gui/main_window.py +8928 -0
  229. setiastro/saspro/gui/mixins/__init__.py +33 -0
  230. setiastro/saspro/gui/mixins/dock_mixin.py +375 -0
  231. setiastro/saspro/gui/mixins/file_mixin.py +450 -0
  232. setiastro/saspro/gui/mixins/geometry_mixin.py +503 -0
  233. setiastro/saspro/gui/mixins/header_mixin.py +441 -0
  234. setiastro/saspro/gui/mixins/mask_mixin.py +421 -0
  235. setiastro/saspro/gui/mixins/menu_mixin.py +391 -0
  236. setiastro/saspro/gui/mixins/theme_mixin.py +367 -0
  237. setiastro/saspro/gui/mixins/toolbar_mixin.py +1824 -0
  238. setiastro/saspro/gui/mixins/update_mixin.py +323 -0
  239. setiastro/saspro/gui/mixins/view_mixin.py +477 -0
  240. setiastro/saspro/gui/statistics_dialog.py +47 -0
  241. setiastro/saspro/halobgon.py +492 -0
  242. setiastro/saspro/header_viewer.py +448 -0
  243. setiastro/saspro/headless_utils.py +88 -0
  244. setiastro/saspro/histogram.py +760 -0
  245. setiastro/saspro/history_explorer.py +941 -0
  246. setiastro/saspro/i18n.py +168 -0
  247. setiastro/saspro/image_combine.py +421 -0
  248. setiastro/saspro/image_peeker_pro.py +1608 -0
  249. setiastro/saspro/imageops/__init__.py +37 -0
  250. setiastro/saspro/imageops/mdi_snap.py +292 -0
  251. setiastro/saspro/imageops/scnr.py +36 -0
  252. setiastro/saspro/imageops/starbasedwhitebalance.py +210 -0
  253. setiastro/saspro/imageops/stretch.py +236 -0
  254. setiastro/saspro/isophote.py +1186 -0
  255. setiastro/saspro/layers.py +208 -0
  256. setiastro/saspro/layers_dock.py +714 -0
  257. setiastro/saspro/lazy_imports.py +193 -0
  258. setiastro/saspro/legacy/__init__.py +2 -0
  259. setiastro/saspro/legacy/image_manager.py +2360 -0
  260. setiastro/saspro/legacy/numba_utils.py +3676 -0
  261. setiastro/saspro/legacy/xisf.py +1213 -0
  262. setiastro/saspro/linear_fit.py +537 -0
  263. setiastro/saspro/live_stacking.py +1854 -0
  264. setiastro/saspro/log_bus.py +5 -0
  265. setiastro/saspro/logging_config.py +460 -0
  266. setiastro/saspro/luminancerecombine.py +510 -0
  267. setiastro/saspro/main_helpers.py +201 -0
  268. setiastro/saspro/mask_creation.py +1090 -0
  269. setiastro/saspro/masks_core.py +56 -0
  270. setiastro/saspro/mdi_widgets.py +353 -0
  271. setiastro/saspro/memory_utils.py +666 -0
  272. setiastro/saspro/metadata_patcher.py +75 -0
  273. setiastro/saspro/mfdeconv.py +3909 -0
  274. setiastro/saspro/mfdeconv_earlystop.py +71 -0
  275. setiastro/saspro/mfdeconvcudnn.py +3312 -0
  276. setiastro/saspro/mfdeconvsport.py +2459 -0
  277. setiastro/saspro/minorbodycatalog.py +567 -0
  278. setiastro/saspro/morphology.py +411 -0
  279. setiastro/saspro/multiscale_decomp.py +1751 -0
  280. setiastro/saspro/nbtorgb_stars.py +541 -0
  281. setiastro/saspro/numba_utils.py +3145 -0
  282. setiastro/saspro/numba_warmup.py +141 -0
  283. setiastro/saspro/ops/__init__.py +9 -0
  284. setiastro/saspro/ops/command_help_dialog.py +623 -0
  285. setiastro/saspro/ops/command_runner.py +217 -0
  286. setiastro/saspro/ops/commands.py +1594 -0
  287. setiastro/saspro/ops/script_editor.py +1105 -0
  288. setiastro/saspro/ops/scripts.py +1476 -0
  289. setiastro/saspro/ops/settings.py +637 -0
  290. setiastro/saspro/parallel_utils.py +554 -0
  291. setiastro/saspro/pedestal.py +121 -0
  292. setiastro/saspro/perfect_palette_picker.py +1105 -0
  293. setiastro/saspro/pipeline.py +110 -0
  294. setiastro/saspro/pixelmath.py +1604 -0
  295. setiastro/saspro/plate_solver.py +2480 -0
  296. setiastro/saspro/project_io.py +797 -0
  297. setiastro/saspro/psf_utils.py +136 -0
  298. setiastro/saspro/psf_viewer.py +631 -0
  299. setiastro/saspro/pyi_rthook_astroquery.py +95 -0
  300. setiastro/saspro/remove_green.py +331 -0
  301. setiastro/saspro/remove_stars.py +1599 -0
  302. setiastro/saspro/remove_stars_preset.py +446 -0
  303. setiastro/saspro/resources.py +570 -0
  304. setiastro/saspro/rgb_combination.py +208 -0
  305. setiastro/saspro/rgb_extract.py +19 -0
  306. setiastro/saspro/rgbalign.py +727 -0
  307. setiastro/saspro/runtime_imports.py +7 -0
  308. setiastro/saspro/runtime_torch.py +754 -0
  309. setiastro/saspro/save_options.py +73 -0
  310. setiastro/saspro/selective_color.py +1614 -0
  311. setiastro/saspro/sfcc.py +1530 -0
  312. setiastro/saspro/shortcuts.py +3125 -0
  313. setiastro/saspro/signature_insert.py +1106 -0
  314. setiastro/saspro/stacking_suite.py +19069 -0
  315. setiastro/saspro/star_alignment.py +7383 -0
  316. setiastro/saspro/star_alignment_preset.py +329 -0
  317. setiastro/saspro/star_metrics.py +49 -0
  318. setiastro/saspro/star_spikes.py +769 -0
  319. setiastro/saspro/star_stretch.py +542 -0
  320. setiastro/saspro/stat_stretch.py +554 -0
  321. setiastro/saspro/status_log_dock.py +78 -0
  322. setiastro/saspro/subwindow.py +3523 -0
  323. setiastro/saspro/supernovaasteroidhunter.py +1719 -0
  324. setiastro/saspro/swap_manager.py +134 -0
  325. setiastro/saspro/torch_backend.py +89 -0
  326. setiastro/saspro/torch_rejection.py +434 -0
  327. setiastro/saspro/translations/all_source_strings.json +4726 -0
  328. setiastro/saspro/translations/ar_translations.py +4096 -0
  329. setiastro/saspro/translations/de_translations.py +3728 -0
  330. setiastro/saspro/translations/es_translations.py +4169 -0
  331. setiastro/saspro/translations/fr_translations.py +4090 -0
  332. setiastro/saspro/translations/hi_translations.py +3803 -0
  333. setiastro/saspro/translations/integrate_translations.py +271 -0
  334. setiastro/saspro/translations/it_translations.py +4728 -0
  335. setiastro/saspro/translations/ja_translations.py +3834 -0
  336. setiastro/saspro/translations/pt_translations.py +3847 -0
  337. setiastro/saspro/translations/ru_translations.py +3082 -0
  338. setiastro/saspro/translations/saspro_ar.qm +0 -0
  339. setiastro/saspro/translations/saspro_ar.ts +16019 -0
  340. setiastro/saspro/translations/saspro_de.qm +0 -0
  341. setiastro/saspro/translations/saspro_de.ts +14548 -0
  342. setiastro/saspro/translations/saspro_es.qm +0 -0
  343. setiastro/saspro/translations/saspro_es.ts +16202 -0
  344. setiastro/saspro/translations/saspro_fr.qm +0 -0
  345. setiastro/saspro/translations/saspro_fr.ts +15870 -0
  346. setiastro/saspro/translations/saspro_hi.qm +0 -0
  347. setiastro/saspro/translations/saspro_hi.ts +14855 -0
  348. setiastro/saspro/translations/saspro_it.qm +0 -0
  349. setiastro/saspro/translations/saspro_it.ts +19046 -0
  350. setiastro/saspro/translations/saspro_ja.qm +0 -0
  351. setiastro/saspro/translations/saspro_ja.ts +14980 -0
  352. setiastro/saspro/translations/saspro_pt.qm +0 -0
  353. setiastro/saspro/translations/saspro_pt.ts +15024 -0
  354. setiastro/saspro/translations/saspro_ru.qm +0 -0
  355. setiastro/saspro/translations/saspro_ru.ts +11835 -0
  356. setiastro/saspro/translations/saspro_sw.qm +0 -0
  357. setiastro/saspro/translations/saspro_sw.ts +15237 -0
  358. setiastro/saspro/translations/saspro_uk.qm +0 -0
  359. setiastro/saspro/translations/saspro_uk.ts +15248 -0
  360. setiastro/saspro/translations/saspro_zh.qm +0 -0
  361. setiastro/saspro/translations/saspro_zh.ts +15289 -0
  362. setiastro/saspro/translations/sw_translations.py +3897 -0
  363. setiastro/saspro/translations/uk_translations.py +3929 -0
  364. setiastro/saspro/translations/zh_translations.py +3910 -0
  365. setiastro/saspro/versioning.py +77 -0
  366. setiastro/saspro/view_bundle.py +1558 -0
  367. setiastro/saspro/wavescale_hdr.py +648 -0
  368. setiastro/saspro/wavescale_hdr_preset.py +101 -0
  369. setiastro/saspro/wavescalede.py +683 -0
  370. setiastro/saspro/wavescalede_preset.py +230 -0
  371. setiastro/saspro/wcs_update.py +374 -0
  372. setiastro/saspro/whitebalance.py +540 -0
  373. setiastro/saspro/widgets/__init__.py +48 -0
  374. setiastro/saspro/widgets/common_utilities.py +306 -0
  375. setiastro/saspro/widgets/graphics_views.py +122 -0
  376. setiastro/saspro/widgets/image_utils.py +518 -0
  377. setiastro/saspro/widgets/minigame/game.js +991 -0
  378. setiastro/saspro/widgets/minigame/index.html +53 -0
  379. setiastro/saspro/widgets/minigame/style.css +241 -0
  380. setiastro/saspro/widgets/preview_dialogs.py +280 -0
  381. setiastro/saspro/widgets/resource_monitor.py +313 -0
  382. setiastro/saspro/widgets/spinboxes.py +290 -0
  383. setiastro/saspro/widgets/themed_buttons.py +13 -0
  384. setiastro/saspro/widgets/wavelet_utils.py +331 -0
  385. setiastro/saspro/wimi.py +7367 -0
  386. setiastro/saspro/wims.py +588 -0
  387. setiastro/saspro/window_shelf.py +185 -0
  388. setiastro/saspro/xisf.py +1213 -0
  389. setiastrosuitepro-1.6.7.dist-info/METADATA +279 -0
  390. setiastrosuitepro-1.6.7.dist-info/RECORD +394 -0
  391. setiastrosuitepro-1.6.7.dist-info/WHEEL +4 -0
  392. setiastrosuitepro-1.6.7.dist-info/entry_points.txt +6 -0
  393. setiastrosuitepro-1.6.7.dist-info/licenses/LICENSE +674 -0
  394. setiastrosuitepro-1.6.7.dist-info/licenses/license.txt +2580 -0
@@ -0,0 +1,331 @@
1
+ # pro/widgets/wavelet_utils.py
2
+ """
3
+ Shared wavelet utilities for à-trous decomposition and reconstruction.
4
+
5
+ This module provides centralized implementations for wavelet operations
6
+ used across wavescale_hdr.py, wavescalede.py, and other modules.
7
+ """
8
+ from __future__ import annotations
9
+ import numpy as np
10
+
11
+
12
+ # ─────────────────────────────────────────────────────────────────────────────
13
+ # Convolution helpers (SciPy if available; otherwise a separable fallback)
14
+ # ─────────────────────────────────────────────────────────────────────────────
15
+
16
+ try:
17
+ from scipy.ndimage import convolve as _nd_convolve
18
+ from scipy.ndimage import gaussian_filter as _nd_gauss
19
+ _HAVE_SCIPY = True
20
+ except ImportError:
21
+ _HAVE_SCIPY = False
22
+ _nd_convolve = None
23
+ _nd_gauss = None
24
+
25
+
26
+ def conv_sep_reflect(image2d: np.ndarray, k1d: np.ndarray, axis: int) -> np.ndarray:
27
+ """
28
+ Separable 1D convolution along a given axis with reflect padding.
29
+
30
+ Uses scipy.ndimage.convolve if available, otherwise falls back to numpy.
31
+
32
+ Args:
33
+ image2d: 2D input array
34
+ k1d: 1D kernel
35
+ axis: 0 for vertical (y), 1 for horizontal (x)
36
+
37
+ Returns:
38
+ Convolved array, same shape as input
39
+ """
40
+ if _HAVE_SCIPY:
41
+ if axis == 1: # x
42
+ # Use 'reflect' mode to match original behavior
43
+ return _nd_convolve(image2d, k1d.reshape(1, -1), mode="reflect")
44
+ else: # y
45
+ return _nd_convolve(image2d, k1d.reshape(-1, 1), mode="reflect")
46
+ else:
47
+ # Optimization: Use OpenCV if available, falling back to NumPy only if strictly necessary.
48
+ # cv2.sepFilter2D can tackle 1D separable/separable passes easily,
49
+ # but here we need a specific generic 1D convolution.
50
+ # cv2.filter2D is generic 2D but fast.
51
+ try:
52
+ import cv2
53
+ # cv2.filter2D(src, ddepth, kernel, anchor, delta, borderType)
54
+ # kernel needs to be created correctly.
55
+ if axis == 1: # horizontal
56
+ k = k1d.reshape(1, -1)
57
+ else: # vertical
58
+ k = k1d.reshape(-1, 1)
59
+
60
+ # Using ddepth=-1 to keep input depth (float32)
61
+ # borderType=cv2.BORDER_REFLECT to match mode="reflect"
62
+ return cv2.filter2D(image2d, -1, k, borderType=cv2.BORDER_REFLECT)
63
+ except ImportError:
64
+ # Fallback numpy implementation (slow!)
65
+ image2d = np.asarray(image2d, dtype=np.float32)
66
+ k1d = np.asarray(k1d, dtype=np.float32)
67
+ r = len(k1d) // 2
68
+ if axis == 1: # horizontal
69
+ pad = np.pad(image2d, ((0, 0), (r, r)), mode="reflect")
70
+ out = np.empty_like(image2d, dtype=np.float32)
71
+ for i in range(image2d.shape[0]):
72
+ out[i] = np.convolve(pad[i], k1d, mode="valid")
73
+ return out
74
+ else: # vertical
75
+ pad = np.pad(image2d, ((r, r), (0, 0)), mode="reflect")
76
+ out = np.empty_like(image2d, dtype=np.float32)
77
+ for j in range(image2d.shape[1]):
78
+ out[:, j] = np.convolve(pad[:, j], k1d, mode="valid")
79
+ return out
80
+
81
+
82
+ def gauss1d(sigma: float) -> np.ndarray:
83
+ """
84
+ Create a 1D Gaussian kernel.
85
+
86
+ Args:
87
+ sigma: Standard deviation of the Gaussian
88
+
89
+ Returns:
90
+ Normalized 1D Gaussian kernel
91
+ """
92
+ if sigma <= 0:
93
+ return np.array([1.0], dtype=np.float32)
94
+ radius = max(1, int(round(3.0 * sigma)))
95
+ x = np.arange(-radius, radius + 1, dtype=np.float32)
96
+ k = np.exp(-0.5 * (x / sigma)**2)
97
+ k /= np.sum(k)
98
+ return k.astype(np.float32)
99
+
100
+
101
+ def gauss_blur(image2d: np.ndarray, sigma: float) -> np.ndarray:
102
+ """
103
+ Apply Gaussian blur to a 2D image.
104
+
105
+ Uses scipy.ndimage.gaussian_filter if available, otherwise separable convolution.
106
+
107
+ Args:
108
+ image2d: 2D input array
109
+ sigma: Standard deviation of the Gaussian
110
+
111
+ Returns:
112
+ Blurred array
113
+ """
114
+ if _HAVE_SCIPY and _nd_gauss is not None:
115
+ return _nd_gauss(image2d, sigma=sigma, mode="reflect")
116
+
117
+ # Try OpenCV GaussianBlur first -> much faster
118
+ try:
119
+ import cv2
120
+ # kernel size: sigma*3 or auto (0)
121
+ # cv2 uses (ksize_w, ksize_h), ksize must be odd.
122
+ # To strictly match sigma, simple let cv2 compute it with ksize=(0,0)
123
+ # BUT 'reflect' border is not default (BORDER_DEFAULT is Reflect_101).
124
+ # mode="reflect" in scipy is usually dcb a | abcd | dc
125
+ # cv2.BORDER_REFLECT is fedcba | abcdef | gfedcb
126
+ # They are compatible enough for this application.
127
+ return cv2.GaussianBlur(image2d, (0, 0), sigmaX=sigma, sigmaY=sigma, borderType=cv2.BORDER_REFLECT)
128
+ except ImportError:
129
+ pass
130
+
131
+ k = gauss1d(float(sigma))
132
+ tmp = conv_sep_reflect(image2d, k, axis=1)
133
+ return conv_sep_reflect(tmp, k, axis=0)
134
+
135
+
136
+ # ─────────────────────────────────────────────────────────────────────────────
137
+ # À-trous wavelet transform (B3 spline kernel)
138
+ # ─────────────────────────────────────────────────────────────────────────────
139
+
140
+ # Standard B3-spline kernel for à-trous
141
+ B3_KERNEL = np.array([1, 4, 6, 4, 1], dtype=np.float32) / 16.0
142
+
143
+
144
+ def build_spaced_kernel(kernel: np.ndarray, scale_idx: int) -> np.ndarray:
145
+ """
146
+ Build a spaced (à-trous) kernel for a given scale.
147
+
148
+ Args:
149
+ kernel: Base 1D kernel
150
+ scale_idx: Scale index (0 = no spacing, 1 = step 2, 2 = step 4, etc.)
151
+
152
+ Returns:
153
+ Spaced kernel with zeros inserted
154
+ """
155
+ if scale_idx == 0:
156
+ return kernel.astype(np.float32, copy=False)
157
+ step = 2 ** scale_idx
158
+ spaced_len = len(kernel) + (len(kernel) - 1) * (step - 1)
159
+ spaced = np.zeros(spaced_len, dtype=np.float32)
160
+ spaced[0::step] = kernel
161
+ return spaced
162
+
163
+
164
+ def atrous_decompose(img2d: np.ndarray, n_scales: int,
165
+ base_kernel: np.ndarray | None = None) -> list[np.ndarray]:
166
+ """
167
+ Perform à-trous (undecimated) wavelet decomposition.
168
+
169
+ Args:
170
+ img2d: 2D input image
171
+ n_scales: Number of detail scales to extract
172
+ base_kernel: Base kernel (default: B3 spline)
173
+
174
+ Returns:
175
+ List of [detail_0, detail_1, ..., detail_n-1, residual]
176
+ where detail_i is the wavelet plane at scale i
177
+ """
178
+ if base_kernel is None:
179
+ base_kernel = B3_KERNEL
180
+
181
+ current = img2d.astype(np.float32, copy=True)
182
+ planes: list[np.ndarray] = []
183
+
184
+ for s in range(n_scales):
185
+ k = build_spaced_kernel(base_kernel, s)
186
+ tmp = conv_sep_reflect(current, k, axis=1)
187
+ smooth = conv_sep_reflect(tmp, k, axis=0)
188
+ planes.append(current - smooth) # detail = current - smoothed
189
+ current = smooth
190
+
191
+ planes.append(current) # residual (lowest frequency)
192
+ return planes
193
+
194
+
195
+ def atrous_reconstruct(planes: list[np.ndarray]) -> np.ndarray:
196
+ """
197
+ Reconstruct image from à-trous wavelet planes.
198
+
199
+ Args:
200
+ planes: List of [detail_0, ..., detail_n-1, residual]
201
+
202
+ Returns:
203
+ Reconstructed image
204
+ """
205
+ out = planes[-1].astype(np.float32, copy=True) # start with residual
206
+ for detail in planes[:-1]:
207
+ out += detail
208
+ return out
209
+
210
+
211
+ # ─────────────────────────────────────────────────────────────────────────────
212
+ # Color space utilities (with optional Numba acceleration)
213
+ # ─────────────────────────────────────────────────────────────────────────────
214
+
215
+ try:
216
+ from setiastro.saspro.legacy.numba_utils import (
217
+ rgb_to_xyz_numba, xyz_to_lab_numba,
218
+ lab_to_xyz_numba, xyz_to_rgb_numba,
219
+ )
220
+ _HAVE_NUMBA = True
221
+ except ImportError:
222
+ _HAVE_NUMBA = False
223
+
224
+
225
+ # sRGB -> XYZ transformation matrix
226
+ _RGB_TO_XYZ_MATRIX = np.array([
227
+ [0.4124564, 0.3575761, 0.1804375],
228
+ [0.2126729, 0.7151522, 0.0721750],
229
+ [0.0193339, 0.1191920, 0.9503041]
230
+ ], dtype=np.float32)
231
+
232
+ # XYZ -> sRGB transformation matrix (inverse)
233
+ _XYZ_TO_RGB_MATRIX = np.array([
234
+ [ 3.2404542, -1.5371385, -0.4985314],
235
+ [-0.9692660, 1.8760108, 0.0415560],
236
+ [ 0.0556434, -0.2040259, 1.0572252]
237
+ ], dtype=np.float32)
238
+
239
+ # D65 illuminant reference white
240
+ _D65_WHITE = np.array([0.95047, 1.0, 1.08883], dtype=np.float32)
241
+
242
+
243
+ def rgb_to_lab(rgb: np.ndarray) -> np.ndarray:
244
+ """
245
+ Convert sRGB image to CIE L*a*b* color space.
246
+
247
+ Uses Numba-accelerated version if available.
248
+
249
+ Args:
250
+ rgb: RGB image (H, W, 3) float32 in [0, 1]
251
+
252
+ Returns:
253
+ Lab image (H, W, 3) where L is [0, 100], a/b are roughly [-128, 127]
254
+ """
255
+ if _HAVE_NUMBA:
256
+ rgb32 = np.ascontiguousarray(rgb.astype(np.float32))
257
+ xyz = rgb_to_xyz_numba(rgb32)
258
+ lab = xyz_to_lab_numba(xyz)
259
+ return lab
260
+
261
+ # Numpy fallback
262
+ rgb = np.asarray(rgb, dtype=np.float32)
263
+
264
+ # sRGB gamma linearization
265
+ linear = np.where(rgb > 0.04045,
266
+ np.power((rgb + 0.055) / 1.055, 2.4),
267
+ rgb / 12.92)
268
+
269
+ # RGB -> XYZ
270
+ xyz = np.einsum('ij,...j->...i', _RGB_TO_XYZ_MATRIX, linear)
271
+
272
+ # XYZ -> Lab
273
+ xyz_n = xyz / _D65_WHITE
274
+
275
+ def f(t):
276
+ return np.where(t > 0.008856,
277
+ np.power(t, 1/3),
278
+ 7.787 * t + 16/116)
279
+
280
+ fx, fy, fz = f(xyz_n[..., 0]), f(xyz_n[..., 1]), f(xyz_n[..., 2])
281
+
282
+ L = 116 * fy - 16
283
+ a = 500 * (fx - fy)
284
+ b = 200 * (fy - fz)
285
+
286
+ return np.stack([L, a, b], axis=-1).astype(np.float32)
287
+
288
+
289
+ def lab_to_rgb(lab: np.ndarray) -> np.ndarray:
290
+ """
291
+ Convert CIE L*a*b* image to sRGB color space.
292
+
293
+ Uses Numba-accelerated version if available.
294
+
295
+ Args:
296
+ lab: Lab image (H, W, 3)
297
+
298
+ Returns:
299
+ RGB image (H, W, 3) float32 in [0, 1]
300
+ """
301
+ if _HAVE_NUMBA:
302
+ lab32 = np.ascontiguousarray(lab.astype(np.float32))
303
+ xyz = lab_to_xyz_numba(lab32)
304
+ rgb = xyz_to_rgb_numba(xyz)
305
+ return np.clip(rgb, 0.0, 1.0)
306
+
307
+ # Numpy fallback
308
+ lab = np.asarray(lab, dtype=np.float32)
309
+ L, a, b = lab[..., 0], lab[..., 1], lab[..., 2]
310
+
311
+ # Lab -> XYZ
312
+ fy = (L + 16) / 116
313
+ fx = a / 500 + fy
314
+ fz = fy - b / 200
315
+
316
+ def f_inv(t):
317
+ return np.where(t > 0.206893,
318
+ np.power(t, 3),
319
+ (t - 16/116) / 7.787)
320
+
321
+ xyz = np.stack([f_inv(fx), f_inv(fy), f_inv(fz)], axis=-1) * _D65_WHITE
322
+
323
+ # XYZ -> linear RGB
324
+ linear = np.einsum('ij,...j->...i', _XYZ_TO_RGB_MATRIX, xyz)
325
+
326
+ # sRGB gamma correction
327
+ rgb = np.where(linear > 0.0031308,
328
+ 1.055 * np.power(np.maximum(linear, 0), 1/2.4) - 0.055,
329
+ 12.92 * linear)
330
+
331
+ return np.clip(rgb, 0.0, 1.0).astype(np.float32)