melage 0.0.65__py3-none-any.whl → 1.0.0__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.
Files changed (661) hide show
  1. assets/copyright.png +0 -0
  2. assets/resource/color/FreeSurferColorLUT.txt +2006 -0
  3. assets/resource/color/LUT_30.txt +31 -0
  4. assets/resource/color/SynthSeg.txt +34 -0
  5. assets/resource/color/lut_prostate.txt +20 -0
  6. assets/resource/horizontalview.png +0 -0
  7. assets/resource/main.ico +0 -0
  8. assets/resource/theme/create_ticks.py +85 -0
  9. assets/resource/theme/rc/checkbox_checked.png +0 -0
  10. assets/resource/theme/rc/checkbox_checked@2x.png +0 -0
  11. assets/resource/theme/rc/checkbox_checked_disabled.png +0 -0
  12. assets/resource/theme/rc/checkbox_checked_disabled@2x.png +0 -0
  13. assets/resource/theme/rc/checkbox_checked_focus.png +0 -0
  14. assets/resource/theme/rc/checkbox_checked_focus@2x.png +0 -0
  15. assets/resource/theme/rc/checkbox_checked_pressed.png +0 -0
  16. assets/resource/theme/rc/checkbox_checked_pressed@2x.png +0 -0
  17. assets/resource/theme/rc/checkbox_indeterminate.png +0 -0
  18. assets/resource/theme/rc/checkbox_indeterminate@2x.png +0 -0
  19. assets/resource/theme/rc/checkbox_indeterminate_disabled.png +0 -0
  20. assets/resource/theme/rc/checkbox_indeterminate_disabled@2x.png +0 -0
  21. assets/resource/theme/rc/checkbox_indeterminate_focus.png +0 -0
  22. assets/resource/theme/rc/checkbox_indeterminate_focus@2x.png +0 -0
  23. assets/resource/theme/rc/checkbox_indeterminate_pressed.png +0 -0
  24. assets/resource/theme/rc/checkbox_indeterminate_pressed@2x.png +0 -0
  25. assets/resource/theme/rc/checkbox_unchecked.png +0 -0
  26. assets/resource/theme/rc/checkbox_unchecked@2x.png +0 -0
  27. assets/resource/theme/rc/checkbox_unchecked_disabled.png +0 -0
  28. assets/resource/theme/rc/checkbox_unchecked_disabled@2x.png +0 -0
  29. assets/resource/theme/rc/checkbox_unchecked_focus.png +0 -0
  30. assets/resource/theme/rc/checkbox_unchecked_focus@2x.png +0 -0
  31. assets/resource/theme/rc/checkbox_unchecked_pressed.png +0 -0
  32. assets/resource/theme/rc/checkbox_unchecked_pressed@2x.png +0 -0
  33. assets/resource/verticalview.png +0 -0
  34. assets/resource/zoom_in.png +0 -0
  35. assets/resource/zoom_neutral (copy).png +0 -0
  36. assets/resource/zoom_neutral.png +0 -0
  37. assets/resource/zoom_out.png +0 -0
  38. data/MNI/mni_icbm152_t1_tal_nlin_sym_09a.nii +0 -0
  39. data/MNI/mni_icbm152_t1_tal_nlin_sym_09a_masked.nii.gz +0 -0
  40. data/MNI/mni_icbm152_t1_tal_nlin_sym_09a_seg.nii.gz +0 -0
  41. docs/manual_images/3D_rightc.png +0 -0
  42. docs/manual_images/3D_rightc_goto.png +0 -0
  43. docs/manual_images/3D_rightc_paint.png +0 -0
  44. docs/manual_images/3D_rightc_paint_draw1.png +0 -0
  45. docs/manual_images/3D_rightc_paint_draw2.png +0 -0
  46. docs/manual_images/3D_rightc_paint_render.png +0 -0
  47. docs/manual_images/3D_rightc_paint_render2.png +0 -0
  48. docs/manual_images/3D_rightc_paint_render3.png +0 -0
  49. docs/manual_images/3D_rightc_paint_render4.png +0 -0
  50. docs/manual_images/3D_rightc_paint_render5.png +0 -0
  51. docs/manual_images/3D_rightc_paint_render6.png +0 -0
  52. docs/manual_images/3D_rightc_seg.png +0 -0
  53. docs/manual_images/exit_toolbar.png +0 -0
  54. docs/manual_images/load_image_file.png +0 -0
  55. docs/manual_images/load_image_file_openp.png +0 -0
  56. docs/manual_images/main_page.png +0 -0
  57. docs/manual_images/menu_file.png +0 -0
  58. docs/manual_images/menu_file_export.png +0 -0
  59. docs/manual_images/menu_file_import.png +0 -0
  60. docs/manual_images/menu_file_settings.png +0 -0
  61. docs/manual_images/menu_file_ss.png +0 -0
  62. docs/manual_images/open_save_load.png +0 -0
  63. docs/manual_images/panning_toolbar.png +0 -0
  64. docs/manual_images/segmentation_toolbar.png +0 -0
  65. docs/manual_images/tab_mri.png +0 -0
  66. docs/manual_images/tab_us.png +0 -0
  67. docs/manual_images/tabs.png +0 -0
  68. docs/manual_images/toolbar_tools.png +0 -0
  69. docs/manual_images/tools_basic.png +0 -0
  70. docs/manual_images/tools_bet.png +0 -0
  71. docs/manual_images/tools_cs.png +0 -0
  72. docs/manual_images/tools_deepbet.png +0 -0
  73. docs/manual_images/tools_imageinfo.png +0 -0
  74. docs/manual_images/tools_maskO.png +0 -0
  75. docs/manual_images/tools_masking.png +0 -0
  76. docs/manual_images/tools_n4b.png +0 -0
  77. docs/manual_images/tools_resize.png +0 -0
  78. docs/manual_images/tools_ruler.png +0 -0
  79. docs/manual_images/tools_seg.png +0 -0
  80. docs/manual_images/tools_threshold.png +0 -0
  81. docs/manual_images/tools_tools.png +0 -0
  82. docs/manual_images/widget_color.png +0 -0
  83. docs/manual_images/widget_color_add.png +0 -0
  84. docs/manual_images/widget_color_add2.png +0 -0
  85. docs/manual_images/widget_color_additional.png +0 -0
  86. docs/manual_images/widget_images.png +0 -0
  87. docs/manual_images/widget_images2.png +0 -0
  88. docs/manual_images/widget_images3.png +0 -0
  89. docs/manual_images/widget_marker.png +0 -0
  90. docs/manual_images/widget_mri.png +0 -0
  91. docs/manual_images/widget_mri2.png +0 -0
  92. docs/manual_images/widget_segintensity.png +0 -0
  93. docs/manual_images/widget_tab_mutualview.png +0 -0
  94. docs/manual_images/widget_tab_mutualview2.png +0 -0
  95. docs/manual_images/widget_table.png +0 -0
  96. docs/manual_images/widget_table2.png +0 -0
  97. docs/manual_images/widget_us.png +0 -0
  98. melage/__init__.py +1 -1
  99. melage/config/__init__.py +100 -0
  100. melage/core/Registration/registration.py +54 -0
  101. melage/{utils/readData.py → core/io.py} +12 -4
  102. melage/{widgets/melageAbout.py → dialogs/AboutDialog.py} +1 -1
  103. melage/dialogs/MaskOperationsDialog.py +146 -0
  104. melage/dialogs/MaskingDialog.py +139 -0
  105. melage/dialogs/RegistrationDialog.py +311 -0
  106. melage/{widgets/ImageThresholding.py → dialogs/ThresholdingDialog.py} +2 -2
  107. melage/dialogs/TransformationDialog.py +275 -0
  108. melage/dialogs/__init__.py +9 -0
  109. melage/dialogs/dynamic_gui.py +327 -0
  110. melage/{widgets/fileDialog_widget.py → dialogs/helpers/FileDialog.py} +226 -1
  111. melage/dialogs/helpers/__init__.py +5 -0
  112. melage/main.py +13 -13
  113. melage/{widgets/mainwindow_widget.py → mainwindow_widget.py} +1434 -1408
  114. melage/plugins/N4_bias/N4.py +115 -0
  115. melage/plugins/N4_bias/N4_schema.py +40 -0
  116. melage/plugins/N4_bias/main/utils.py +46 -0
  117. melage/plugins/__init__.py +2 -0
  118. melage/plugins/bet/bet.py +176 -0
  119. melage/plugins/bet/bet_schema.py +73 -0
  120. melage/{widgets/brain_extraction.py → plugins/bet/main/BET.py} +51 -316
  121. melage/plugins/change_coord/change_coord.py +197 -0
  122. melage/plugins/change_coord/change_coord_schema.py +31 -0
  123. melage/plugins/change_coord/main/utils.py +15 -0
  124. melage/{widgets/Segmentation → plugins/esfcm/main}/FCM.py +3 -5
  125. melage/plugins/esfcm/main/test.py +57 -0
  126. melage/{widgets/Segmentation → plugins/esfcm/main}/utils.py +20 -0
  127. melage/plugins/esfcm/tissue_segmentation.py +124 -0
  128. melage/plugins/esfcm/tissue_segmentation_schema.py +33 -0
  129. melage/plugins/masking_operation/mo.py +115 -0
  130. melage/plugins/masking_operation/mo_schema.py +33 -0
  131. melage/plugins/mga_net/MGA_Net.py +145 -0
  132. melage/plugins/mga_net/MGA_Net_schema.py +29 -0
  133. melage/plugins/mga_net/main/figures/Network.txt +1 -0
  134. melage/{widgets/DeepLModels/new_unet.py → plugins/mga_net/main/model/mga_net.py} +3 -3
  135. melage/plugins/mga_net/main/model/utils.py +258 -0
  136. melage/plugins/mga_net/main/test_mgaNet.py +134 -0
  137. melage/plugins/resize/resize.py +136 -0
  138. melage/plugins/resize/resize_schema.py +41 -0
  139. melage/plugins/ui_helpers.py +144 -0
  140. melage/plugins/warpseg/WarpSeg.py +195 -0
  141. melage/plugins/warpseg/WarpSeg_schema.py +41 -0
  142. melage/plugins/warpseg/__init__.py +2 -0
  143. melage/plugins/warpseg/warpseg_main/data_reader/DDSet.py +303 -0
  144. melage/plugins/warpseg/warpseg_main/data_reader/DDSetSeg.py +279 -0
  145. melage/plugins/warpseg/warpseg_main/data_reader/__init__.py +60 -0
  146. melage/plugins/warpseg/warpseg_main/data_reader/baseData.py +18 -0
  147. melage/plugins/warpseg/warpseg_main/data_reader/utils.py +267 -0
  148. melage/plugins/warpseg/warpseg_main/dist_utils.py +18 -0
  149. melage/plugins/warpseg/warpseg_main/requirements.txt +10 -0
  150. melage/plugins/warpseg/warpseg_main/test.py +272 -0
  151. melage/plugins/warpseg/warpseg_main/train.py +432 -0
  152. melage/plugins/warpseg/warpseg_main/train_reg.py +373 -0
  153. melage/plugins/warpseg/warpseg_main/verify_post_process.py +73 -0
  154. melage/plugins/warpseg/warpseg_main/voxelmorph/__init__.py +45 -0
  155. melage/plugins/warpseg/warpseg_main/voxelmorph/py/__init__.py +1 -0
  156. melage/plugins/warpseg/warpseg_main/voxelmorph/py/utils.py +99 -0
  157. melage/{widgets/Synthstrip.py → plugins/warpseg/warpseg_main/voxelmorph/torch/Unet.py} +71 -51
  158. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/__init__.py +4 -0
  159. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/layers.py +97 -0
  160. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/losses.py +462 -0
  161. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/modelio.py +77 -0
  162. melage/{widgets/DeepLModels/InfantSegment/Unet.py → plugins/warpseg/warpseg_main/voxelmorph/torch/multi_stage_net.py} +76 -52
  163. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/networks.py +308 -0
  164. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/utils.py +470 -0
  165. melage/{utils/DispalyIm.py → rendering/DisplayIm.py} +67 -79
  166. melage/{utils → rendering}/glScientific.py +1 -1
  167. melage/utils/__init__.py +1 -0
  168. melage/utils/utils.py +343 -196
  169. melage/widgets/{dockWidgets.py → DockWidgets.py} +123 -55
  170. melage/widgets/SettingsWidget.py +98 -0
  171. melage/widgets/__init__.py +49 -0
  172. melage/widgets/openglWidgets.py +344 -156
  173. melage/widgets/openglWidgets_bu.py +645 -0
  174. melage/widgets/plugin_manager.py +62 -0
  175. melage-1.0.0.dist-info/METADATA +953 -0
  176. melage-1.0.0.dist-info/RECORD +571 -0
  177. melage-1.0.0.dist-info/entry_points.txt +2 -0
  178. melage-1.0.0.dist-info/top_level.txt +4 -0
  179. melage/requirements22.txt +0 -25
  180. melage/requirements_old.txt +0 -28
  181. melage/resource/theme/rc/checkbox_checked.png +0 -0
  182. melage/resource/theme/rc/checkbox_checked@2x.png +0 -0
  183. melage/resource/theme/rc/checkbox_checked@2x0.png +0 -0
  184. melage/resource/theme/rc/checkbox_checked@2x000.png.png +0 -0
  185. melage/resource/theme/rc/checkbox_checked_disabled.png +0 -0
  186. melage/resource/theme/rc/checkbox_checked_disabled0.png +0 -0
  187. melage/resource/theme/rc/checkbox_checked_disabled@2x.png +0 -0
  188. melage/resource/theme/rc/checkbox_checked_disabled@2x0.png +0 -0
  189. melage/resource/theme/rc/checkbox_checked_focus.png +0 -0
  190. melage/resource/theme/rc/checkbox_checked_focus0.png +0 -0
  191. melage/resource/theme/rc/checkbox_checked_focus@2x.png +0 -0
  192. melage/resource/theme/rc/checkbox_checked_focus@2x0.png +0 -0
  193. melage/resource/theme/rc/checkbox_checked_pressed.png +0 -0
  194. melage/resource/theme/rc/checkbox_checked_pressed0.png +0 -0
  195. melage/resource/theme/rc/checkbox_checked_pressed@2x.png +0 -0
  196. melage/resource/theme/rc/checkbox_checked_pressed@2x0.png +0 -0
  197. melage/resource/theme/rc/checkbox_indeterminate.png +0 -0
  198. melage/resource/theme/rc/checkbox_indeterminate@2x.png +0 -0
  199. melage/resource/theme/rc/checkbox_indeterminate_disabled.png +0 -0
  200. melage/resource/theme/rc/checkbox_indeterminate_disabled@2x.png +0 -0
  201. melage/resource/theme/rc/checkbox_indeterminate_focus.png +0 -0
  202. melage/resource/theme/rc/checkbox_indeterminate_focus@2x.png +0 -0
  203. melage/resource/theme/rc/checkbox_indeterminate_pressed.png +0 -0
  204. melage/resource/theme/rc/checkbox_indeterminate_pressed@2x.png +0 -0
  205. melage/resource/theme/rc/checkbox_unchecked.png +0 -0
  206. melage/resource/theme/rc/checkbox_unchecked0.png +0 -0
  207. melage/resource/theme/rc/checkbox_unchecked00.png +0 -0
  208. melage/resource/theme/rc/checkbox_unchecked@2x.png +0 -0
  209. melage/resource/theme/rc/checkbox_unchecked@2x0.png +0 -0
  210. melage/resource/theme/rc/checkbox_unchecked@2x00.png +0 -0
  211. melage/resource/theme/rc/checkbox_unchecked_disabled.png +0 -0
  212. melage/resource/theme/rc/checkbox_unchecked_disabled0.png +0 -0
  213. melage/resource/theme/rc/checkbox_unchecked_disabled00.png +0 -0
  214. melage/resource/theme/rc/checkbox_unchecked_disabled@2x.png +0 -0
  215. melage/resource/theme/rc/checkbox_unchecked_disabled@2x0.png +0 -0
  216. melage/resource/theme/rc/checkbox_unchecked_disabled@2x00.png +0 -0
  217. melage/resource/theme/rc/checkbox_unchecked_focus.png +0 -0
  218. melage/resource/theme/rc/checkbox_unchecked_focus0.png +0 -0
  219. melage/resource/theme/rc/checkbox_unchecked_focus00.png +0 -0
  220. melage/resource/theme/rc/checkbox_unchecked_focus@2x.png +0 -0
  221. melage/resource/theme/rc/checkbox_unchecked_focus@2x0.png +0 -0
  222. melage/resource/theme/rc/checkbox_unchecked_focus@2x00.png +0 -0
  223. melage/resource/theme/rc/checkbox_unchecked_pressed.png +0 -0
  224. melage/resource/theme/rc/checkbox_unchecked_pressed0.png +0 -0
  225. melage/resource/theme/rc/checkbox_unchecked_pressed00.png +0 -0
  226. melage/resource/theme/rc/checkbox_unchecked_pressed@2x.png +0 -0
  227. melage/resource/theme/rc/checkbox_unchecked_pressed@2x0.png +0 -0
  228. melage/resource/theme/rc/checkbox_unchecked_pressed@2x00.png +0 -0
  229. melage/some_notes.txt +0 -3
  230. melage/utils/GMM.py +0 -720
  231. melage/utils/Shaders_bu.py +0 -314
  232. melage/utils/__init__0.py +0 -7
  233. melage/utils/glScientific_bc.py +0 -1585
  234. melage/utils/registration.py +0 -512
  235. melage/utils/source_folder.py +0 -18
  236. melage/version.txt +0 -1
  237. melage/widgets/ApplyMask.py +0 -212
  238. melage/widgets/ChangeSystem.py +0 -152
  239. melage/widgets/DeepLModels/NPP/dataset/mri_dataset_affine.py +0 -149
  240. melage/widgets/DeepLModels/NPP/models/checkpoints/npp_v1.pth.py +0 -0
  241. melage/widgets/DeepLModels/NPP/models/losses.py +0 -146
  242. melage/widgets/DeepLModels/NPP/models/model.py +0 -272
  243. melage/widgets/DeepLModels/NPP/models/utils.py +0 -303
  244. melage/widgets/DeepLModels/NPP/npp.py +0 -116
  245. melage/widgets/DeepLModels/NPP/requirements.txt +0 -8
  246. melage/widgets/DeepLModels/NPP/train/train.py +0 -116
  247. melage/widgets/DeepLModels/Unet3DAtt.py +0 -657
  248. melage/widgets/DeepLModels/Unet3D_basic.py +0 -648
  249. melage/widgets/DeepLModels/new_unet_old.py +0 -639
  250. melage/widgets/DeepLModels/new_unet_old2.py +0 -658
  251. melage/widgets/MaskOperations.py +0 -147
  252. melage/widgets/N4Dialog.py +0 -241
  253. melage/widgets/Segmentation/__init__.py +0 -588
  254. melage/widgets/SemiAutoSeg.py +0 -666
  255. melage/widgets/__init__0.py +0 -5
  256. melage/widgets/about.py +0 -246
  257. melage/widgets/activator.py +0 -147
  258. melage/widgets/be_dl.py +0 -409
  259. melage/widgets/be_dl_unet3d.py +0 -441
  260. melage/widgets/brain_extraction_dl.py +0 -887
  261. melage/widgets/brain_extraction_dl_bu.py +0 -869
  262. melage/widgets/registrationWidget.py +0 -342
  263. melage/widgets/settings_widget.py +0 -77
  264. melage/widgets/tranformationWidget.py +0 -275
  265. melage-0.0.65.dist-info/METADATA +0 -742
  266. melage-0.0.65.dist-info/RECORD +0 -501
  267. melage-0.0.65.dist-info/entry_points.txt +0 -2
  268. melage-0.0.65.dist-info/top_level.txt +0 -1
  269. {melage/resource → assets}/main.ico +0 -0
  270. {melage → assets}/resource/0circle.png +0 -0
  271. {melage → assets}/resource/0circle_faded.png +0 -0
  272. {melage → assets}/resource/3d.png +0 -0
  273. {melage → assets}/resource/3d.psd +0 -0
  274. {melage → assets}/resource/3dFaded.png +0 -0
  275. {melage → assets}/resource/Eraser.png +0 -0
  276. {melage → assets}/resource/EraserFaded.png +0 -0
  277. {melage → assets}/resource/EraserX.png +0 -0
  278. {melage → assets}/resource/EraserXFaded.png +0 -0
  279. {melage → assets}/resource/Eraser_icon.svg +0 -0
  280. {melage → assets}/resource/Hand.png +0 -0
  281. {melage → assets}/resource/HandIcons_0.png +0 -0
  282. {melage → assets}/resource/Hand_IX.png +0 -0
  283. {melage → assets}/resource/Hand_IXFaded.png +0 -0
  284. {melage → assets}/resource/Handsqueezed.png +0 -0
  285. {melage → assets}/resource/Handwriting (copy).png +0 -0
  286. {melage → assets}/resource/Handwriting.png +0 -0
  287. {melage → assets}/resource/HandwritingMinus.png +0 -0
  288. {melage → assets}/resource/HandwritingMinusX.png +0 -0
  289. {melage → assets}/resource/HandwritingPlus.png +0 -0
  290. {melage → assets}/resource/HandwritingPlusX.png +0 -0
  291. {melage → assets}/resource/Move_icon.svg +0 -0
  292. {melage → assets}/resource/PngItem_2422924.png +0 -0
  293. {melage → assets}/resource/about.png +0 -0
  294. {melage → assets}/resource/about_logo.png +0 -0
  295. {melage → assets}/resource/about_logo0.png +0 -0
  296. {melage → assets}/resource/action_check.png +0 -0
  297. {melage → assets}/resource/action_check_OFF.png +0 -0
  298. {melage → assets}/resource/arrow).png +0 -0
  299. {melage → assets}/resource/arrow.png +0 -0
  300. {melage → assets}/resource/arrowFaded.png +0 -0
  301. {melage → assets}/resource/arrow_org.png +0 -0
  302. {melage → assets}/resource/arrow_org.png.png +0 -0
  303. {melage → assets}/resource/arrows.png +0 -0
  304. {melage → assets}/resource/authors.mp4 +0 -0
  305. {melage → assets}/resource/box.png +0 -0
  306. {melage → assets}/resource/check-image-icon-0.jpg +0 -0
  307. {melage → assets}/resource/circle.png +0 -0
  308. {melage → assets}/resource/circle_faded.png +0 -0
  309. {melage → assets}/resource/circle_or.png +0 -0
  310. {melage → assets}/resource/close.png +0 -0
  311. {melage → assets}/resource/close_bg.png +0 -0
  312. {melage → assets}/resource/color/Simple.txt +0 -0
  313. {melage → assets}/resource/color/Tissue.txt +0 -0
  314. {melage → assets}/resource/color/Tissue12.txt +0 -0
  315. {melage → assets}/resource/color/albert_LUT.txt +0 -0
  316. {melage → assets}/resource/color/mcrib_LUT.txt +0 -0
  317. {melage → assets}/resource/color/pediatric1.txt +0 -0
  318. {melage → assets}/resource/color/pediatric1_old.txt +0 -0
  319. {melage → assets}/resource/color/pediatric2.txt +0 -0
  320. {melage → assets}/resource/color/pediatric3.txt +0 -0
  321. {melage → assets}/resource/color/pediatrics (copy).csv +0 -0
  322. {melage → assets}/resource/color/tissue_seg.txt +0 -0
  323. {melage → assets}/resource/contour.png +0 -0
  324. {melage → assets}/resource/contour.svg +0 -0
  325. {melage → assets}/resource/contourFaded.png +0 -0
  326. {melage → assets}/resource/contourX.png +0 -0
  327. {melage → assets}/resource/contourXFaded.png +0 -0
  328. {melage → assets}/resource/dti.png +0 -0
  329. {melage → assets}/resource/dti0.png +0 -0
  330. {melage → assets}/resource/dti222.png +0 -0
  331. {melage → assets}/resource/dti_or.png +0 -0
  332. {melage → assets}/resource/eco.png +0 -0
  333. {melage → assets}/resource/eco22.png +0 -0
  334. {melage → assets}/resource/eco_old.png +0 -0
  335. {melage → assets}/resource/eco_or.png +0 -0
  336. {melage → assets}/resource/eco_or2.png +0 -0
  337. {melage → assets}/resource/eco_seg.png +0 -0
  338. {melage → assets}/resource/eco_seg_old.png +0 -0
  339. {melage → assets}/resource/export.png +0 -0
  340. {melage → assets}/resource/hand-grab-icon-10.jpg +0 -0
  341. {melage → assets}/resource/hand-grab-icon-25.jpg +0 -0
  342. {melage → assets}/resource/info.png +0 -0
  343. {melage → assets}/resource/line.png +0 -0
  344. {melage → assets}/resource/linefaded.png +0 -0
  345. {melage → assets}/resource/load.png +0 -0
  346. {melage → assets}/resource/manual_images/3D_rightc.png +0 -0
  347. {melage → assets}/resource/manual_images/3D_rightc_goto.png +0 -0
  348. {melage → assets}/resource/manual_images/3D_rightc_paint.png +0 -0
  349. {melage → assets}/resource/manual_images/3D_rightc_paint_draw1.png +0 -0
  350. {melage → assets}/resource/manual_images/3D_rightc_paint_draw2.png +0 -0
  351. {melage → assets}/resource/manual_images/3D_rightc_paint_render.png +0 -0
  352. {melage → assets}/resource/manual_images/3D_rightc_paint_render2.png +0 -0
  353. {melage → assets}/resource/manual_images/3D_rightc_paint_render3.png +0 -0
  354. {melage → assets}/resource/manual_images/3D_rightc_paint_render4.png +0 -0
  355. {melage → assets}/resource/manual_images/3D_rightc_paint_render5.png +0 -0
  356. {melage → assets}/resource/manual_images/3D_rightc_paint_render6.png +0 -0
  357. {melage → assets}/resource/manual_images/3D_rightc_seg.png +0 -0
  358. {melage → assets}/resource/manual_images/exit_toolbar.png +0 -0
  359. {melage → assets}/resource/manual_images/load_image_file.png +0 -0
  360. {melage → assets}/resource/manual_images/load_image_file_openp.png +0 -0
  361. {melage → assets}/resource/manual_images/main_page.png +0 -0
  362. {melage → assets}/resource/manual_images/menu_file.png +0 -0
  363. {melage → assets}/resource/manual_images/menu_file_export.png +0 -0
  364. {melage → assets}/resource/manual_images/menu_file_import.png +0 -0
  365. {melage → assets}/resource/manual_images/menu_file_settings.png +0 -0
  366. {melage → assets}/resource/manual_images/menu_file_ss.png +0 -0
  367. {melage → assets}/resource/manual_images/open_save_load.png +0 -0
  368. {melage → assets}/resource/manual_images/panning_toolbar.png +0 -0
  369. {melage → assets}/resource/manual_images/segmentation_toolbar.png +0 -0
  370. {melage → assets}/resource/manual_images/tab_mri.png +0 -0
  371. {melage → assets}/resource/manual_images/tab_us.png +0 -0
  372. {melage → assets}/resource/manual_images/tabs.png +0 -0
  373. {melage → assets}/resource/manual_images/toolbar_tools.png +0 -0
  374. {melage → assets}/resource/manual_images/tools_basic.png +0 -0
  375. {melage → assets}/resource/manual_images/tools_bet.png +0 -0
  376. {melage → assets}/resource/manual_images/tools_cs.png +0 -0
  377. {melage → assets}/resource/manual_images/tools_deepbet.png +0 -0
  378. {melage → assets}/resource/manual_images/tools_imageinfo.png +0 -0
  379. {melage → assets}/resource/manual_images/tools_maskO.png +0 -0
  380. {melage → assets}/resource/manual_images/tools_masking.png +0 -0
  381. {melage → assets}/resource/manual_images/tools_n4b.png +0 -0
  382. {melage → assets}/resource/manual_images/tools_resize.png +0 -0
  383. {melage → assets}/resource/manual_images/tools_ruler.png +0 -0
  384. {melage → assets}/resource/manual_images/tools_seg.png +0 -0
  385. {melage → assets}/resource/manual_images/tools_threshold.png +0 -0
  386. {melage → assets}/resource/manual_images/tools_tools.png +0 -0
  387. {melage → assets}/resource/manual_images/widget_color.png +0 -0
  388. {melage → assets}/resource/manual_images/widget_color_add.png +0 -0
  389. {melage → assets}/resource/manual_images/widget_color_add2.png +0 -0
  390. {melage → assets}/resource/manual_images/widget_color_additional.png +0 -0
  391. {melage → assets}/resource/manual_images/widget_images.png +0 -0
  392. {melage → assets}/resource/manual_images/widget_images2.png +0 -0
  393. {melage → assets}/resource/manual_images/widget_images3.png +0 -0
  394. {melage → assets}/resource/manual_images/widget_marker.png +0 -0
  395. {melage → assets}/resource/manual_images/widget_mri.png +0 -0
  396. {melage → assets}/resource/manual_images/widget_mri2.png +0 -0
  397. {melage → assets}/resource/manual_images/widget_segintensity.png +0 -0
  398. {melage → assets}/resource/manual_images/widget_tab_mutualview.png +0 -0
  399. {melage → assets}/resource/manual_images/widget_tab_mutualview2.png +0 -0
  400. {melage → assets}/resource/manual_images/widget_table.png +0 -0
  401. {melage → assets}/resource/manual_images/widget_table2.png +0 -0
  402. {melage → assets}/resource/manual_images/widget_us.png +0 -0
  403. {melage → assets}/resource/melage_top.ico +0 -0
  404. {melage → assets}/resource/melage_top.png +0 -0
  405. {melage → assets}/resource/melage_top0.png +0 -0
  406. {melage → assets}/resource/melage_top1.png +0 -0
  407. {melage → assets}/resource/melage_top4.png +0 -0
  408. {melage → assets}/resource/mri (copy).png +0 -0
  409. {melage → assets}/resource/mri.png +0 -0
  410. {melage → assets}/resource/mri0.png +0 -0
  411. {melage → assets}/resource/mri000.png +0 -0
  412. {melage → assets}/resource/mri22.png +0 -0
  413. {melage → assets}/resource/mri_big.png +0 -0
  414. {melage → assets}/resource/mri_old.png +0 -0
  415. {melage → assets}/resource/mri_seg.png +0 -0
  416. {melage → assets}/resource/mri_seg_old.png +0 -0
  417. {melage → assets}/resource/new.png +0 -0
  418. {melage → assets}/resource/open.png +0 -0
  419. {melage → assets}/resource/open2.png +0 -0
  420. {melage → assets}/resource/pan.png +0 -0
  421. {melage → assets}/resource/pencil.png +0 -0
  422. {melage → assets}/resource/pencilFaded.png +0 -0
  423. {melage → assets}/resource/points.png +0 -0
  424. {melage → assets}/resource/pointsFaded.png +0 -0
  425. {melage → assets}/resource/rotate.png +0 -0
  426. {melage → assets}/resource/ruler.png +0 -0
  427. {melage → assets}/resource/rulerFaded.png +0 -0
  428. {melage → assets}/resource/s.png +0 -0
  429. {melage → assets}/resource/s.psd +0 -0
  430. {melage → assets}/resource/save.png +0 -0
  431. {melage → assets}/resource/saveas.png +0 -0
  432. {melage → assets}/resource/seg_mri.png +0 -0
  433. {melage → assets}/resource/seg_mri2.png +0 -0
  434. {melage → assets}/resource/settings.png +0 -0
  435. {melage → assets}/resource/synch.png +0 -0
  436. {melage → assets}/resource/synchFaded.png +0 -0
  437. {melage → assets}/resource/theme/rc/.keep +0 -0
  438. {melage → assets}/resource/theme/rc/arrow_down.png +0 -0
  439. {melage → assets}/resource/theme/rc/arrow_down@2x.png +0 -0
  440. {melage → assets}/resource/theme/rc/arrow_down_disabled.png +0 -0
  441. {melage → assets}/resource/theme/rc/arrow_down_disabled@2x.png +0 -0
  442. {melage → assets}/resource/theme/rc/arrow_down_focus.png +0 -0
  443. {melage → assets}/resource/theme/rc/arrow_down_focus@2x.png +0 -0
  444. {melage → assets}/resource/theme/rc/arrow_down_pressed.png +0 -0
  445. {melage → assets}/resource/theme/rc/arrow_down_pressed@2x.png +0 -0
  446. {melage → assets}/resource/theme/rc/arrow_left.png +0 -0
  447. {melage → assets}/resource/theme/rc/arrow_left@2x.png +0 -0
  448. {melage → assets}/resource/theme/rc/arrow_left_disabled.png +0 -0
  449. {melage → assets}/resource/theme/rc/arrow_left_disabled@2x.png +0 -0
  450. {melage → assets}/resource/theme/rc/arrow_left_focus.png +0 -0
  451. {melage → assets}/resource/theme/rc/arrow_left_focus@2x.png +0 -0
  452. {melage → assets}/resource/theme/rc/arrow_left_pressed.png +0 -0
  453. {melage → assets}/resource/theme/rc/arrow_left_pressed@2x.png +0 -0
  454. {melage → assets}/resource/theme/rc/arrow_right.png +0 -0
  455. {melage → assets}/resource/theme/rc/arrow_right@2x.png +0 -0
  456. {melage → assets}/resource/theme/rc/arrow_right_disabled.png +0 -0
  457. {melage → assets}/resource/theme/rc/arrow_right_disabled@2x.png +0 -0
  458. {melage → assets}/resource/theme/rc/arrow_right_focus.png +0 -0
  459. {melage → assets}/resource/theme/rc/arrow_right_focus@2x.png +0 -0
  460. {melage → assets}/resource/theme/rc/arrow_right_pressed.png +0 -0
  461. {melage → assets}/resource/theme/rc/arrow_right_pressed@2x.png +0 -0
  462. {melage → assets}/resource/theme/rc/arrow_up.png +0 -0
  463. {melage → assets}/resource/theme/rc/arrow_up@2x.png +0 -0
  464. {melage → assets}/resource/theme/rc/arrow_up_disabled.png +0 -0
  465. {melage → assets}/resource/theme/rc/arrow_up_disabled@2x.png +0 -0
  466. {melage → assets}/resource/theme/rc/arrow_up_focus.png +0 -0
  467. {melage → assets}/resource/theme/rc/arrow_up_focus@2x.png +0 -0
  468. {melage → assets}/resource/theme/rc/arrow_up_pressed.png +0 -0
  469. {melage → assets}/resource/theme/rc/arrow_up_pressed@2x.png +0 -0
  470. {melage → assets}/resource/theme/rc/base_icon.png +0 -0
  471. {melage → assets}/resource/theme/rc/base_icon@2x.png +0 -0
  472. {melage → assets}/resource/theme/rc/base_icon_disabled.png +0 -0
  473. {melage → assets}/resource/theme/rc/base_icon_disabled@2x.png +0 -0
  474. {melage → assets}/resource/theme/rc/base_icon_focus.png +0 -0
  475. {melage → assets}/resource/theme/rc/base_icon_focus@2x.png +0 -0
  476. {melage → assets}/resource/theme/rc/base_icon_pressed.png +0 -0
  477. {melage → assets}/resource/theme/rc/base_icon_pressed@2x.png +0 -0
  478. {melage → assets}/resource/theme/rc/branch_closed.png +0 -0
  479. {melage → assets}/resource/theme/rc/branch_closed@2x.png +0 -0
  480. {melage → assets}/resource/theme/rc/branch_closed_disabled.png +0 -0
  481. {melage → assets}/resource/theme/rc/branch_closed_disabled@2x.png +0 -0
  482. {melage → assets}/resource/theme/rc/branch_closed_focus.png +0 -0
  483. {melage → assets}/resource/theme/rc/branch_closed_focus@2x.png +0 -0
  484. {melage → assets}/resource/theme/rc/branch_closed_pressed.png +0 -0
  485. {melage → assets}/resource/theme/rc/branch_closed_pressed@2x.png +0 -0
  486. {melage → assets}/resource/theme/rc/branch_end.png +0 -0
  487. {melage → assets}/resource/theme/rc/branch_end@2x.png +0 -0
  488. {melage → assets}/resource/theme/rc/branch_end_disabled.png +0 -0
  489. {melage → assets}/resource/theme/rc/branch_end_disabled@2x.png +0 -0
  490. {melage → assets}/resource/theme/rc/branch_end_focus.png +0 -0
  491. {melage → assets}/resource/theme/rc/branch_end_focus@2x.png +0 -0
  492. {melage → assets}/resource/theme/rc/branch_end_pressed.png +0 -0
  493. {melage → assets}/resource/theme/rc/branch_end_pressed@2x.png +0 -0
  494. {melage → assets}/resource/theme/rc/branch_line.png +0 -0
  495. {melage → assets}/resource/theme/rc/branch_line@2x.png +0 -0
  496. {melage → assets}/resource/theme/rc/branch_line_disabled.png +0 -0
  497. {melage → assets}/resource/theme/rc/branch_line_disabled@2x.png +0 -0
  498. {melage → assets}/resource/theme/rc/branch_line_focus.png +0 -0
  499. {melage → assets}/resource/theme/rc/branch_line_focus@2x.png +0 -0
  500. {melage → assets}/resource/theme/rc/branch_line_pressed.png +0 -0
  501. {melage → assets}/resource/theme/rc/branch_line_pressed@2x.png +0 -0
  502. {melage → assets}/resource/theme/rc/branch_more.png +0 -0
  503. {melage → assets}/resource/theme/rc/branch_more@2x.png +0 -0
  504. {melage → assets}/resource/theme/rc/branch_more_disabled.png +0 -0
  505. {melage → assets}/resource/theme/rc/branch_more_disabled@2x.png +0 -0
  506. {melage → assets}/resource/theme/rc/branch_more_focus.png +0 -0
  507. {melage → assets}/resource/theme/rc/branch_more_focus@2x.png +0 -0
  508. {melage → assets}/resource/theme/rc/branch_more_pressed.png +0 -0
  509. {melage → assets}/resource/theme/rc/branch_more_pressed@2x.png +0 -0
  510. {melage → assets}/resource/theme/rc/branch_open.png +0 -0
  511. {melage → assets}/resource/theme/rc/branch_open@2x.png +0 -0
  512. {melage → assets}/resource/theme/rc/branch_open_disabled.png +0 -0
  513. {melage → assets}/resource/theme/rc/branch_open_disabled@2x.png +0 -0
  514. {melage → assets}/resource/theme/rc/branch_open_focus.png +0 -0
  515. {melage → assets}/resource/theme/rc/branch_open_focus@2x.png +0 -0
  516. {melage → assets}/resource/theme/rc/branch_open_pressed.png +0 -0
  517. {melage → assets}/resource/theme/rc/branch_open_pressed@2x.png +0 -0
  518. {melage → assets}/resource/theme/rc/checkbox_checked0.png +0 -0
  519. {melage → assets}/resource/theme/rc/line_horizontal.png +0 -0
  520. {melage → assets}/resource/theme/rc/line_horizontal@2x.png +0 -0
  521. {melage → assets}/resource/theme/rc/line_horizontal_disabled.png +0 -0
  522. {melage → assets}/resource/theme/rc/line_horizontal_disabled@2x.png +0 -0
  523. {melage → assets}/resource/theme/rc/line_horizontal_focus.png +0 -0
  524. {melage → assets}/resource/theme/rc/line_horizontal_focus@2x.png +0 -0
  525. {melage → assets}/resource/theme/rc/line_horizontal_pressed.png +0 -0
  526. {melage → assets}/resource/theme/rc/line_horizontal_pressed@2x.png +0 -0
  527. {melage → assets}/resource/theme/rc/line_vertical.png +0 -0
  528. {melage → assets}/resource/theme/rc/line_vertical@2x.png +0 -0
  529. {melage → assets}/resource/theme/rc/line_vertical_disabled.png +0 -0
  530. {melage → assets}/resource/theme/rc/line_vertical_disabled@2x.png +0 -0
  531. {melage → assets}/resource/theme/rc/line_vertical_focus.png +0 -0
  532. {melage → assets}/resource/theme/rc/line_vertical_focus@2x.png +0 -0
  533. {melage → assets}/resource/theme/rc/line_vertical_pressed.png +0 -0
  534. {melage → assets}/resource/theme/rc/line_vertical_pressed@2x.png +0 -0
  535. {melage → assets}/resource/theme/rc/radio_checked.png +0 -0
  536. {melage → assets}/resource/theme/rc/radio_checked@2x.png +0 -0
  537. {melage → assets}/resource/theme/rc/radio_checked_disabled.png +0 -0
  538. {melage → assets}/resource/theme/rc/radio_checked_disabled@2x.png +0 -0
  539. {melage → assets}/resource/theme/rc/radio_checked_focus.png +0 -0
  540. {melage → assets}/resource/theme/rc/radio_checked_focus@2x.png +0 -0
  541. {melage → assets}/resource/theme/rc/radio_checked_pressed.png +0 -0
  542. {melage → assets}/resource/theme/rc/radio_checked_pressed@2x.png +0 -0
  543. {melage → assets}/resource/theme/rc/radio_unchecked.png +0 -0
  544. {melage → assets}/resource/theme/rc/radio_unchecked@2x.png +0 -0
  545. {melage → assets}/resource/theme/rc/radio_unchecked_disabled.png +0 -0
  546. {melage → assets}/resource/theme/rc/radio_unchecked_disabled@2x.png +0 -0
  547. {melage → assets}/resource/theme/rc/radio_unchecked_focus.png +0 -0
  548. {melage → assets}/resource/theme/rc/radio_unchecked_focus@2x.png +0 -0
  549. {melage → assets}/resource/theme/rc/radio_unchecked_pressed.png +0 -0
  550. {melage → assets}/resource/theme/rc/radio_unchecked_pressed@2x.png +0 -0
  551. {melage → assets}/resource/theme/rc/toolbar_move_horizontal.png +0 -0
  552. {melage → assets}/resource/theme/rc/toolbar_move_horizontal@2x.png +0 -0
  553. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_disabled.png +0 -0
  554. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_disabled@2x.png +0 -0
  555. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_focus.png +0 -0
  556. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_focus@2x.png +0 -0
  557. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_pressed.png +0 -0
  558. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_pressed@2x.png +0 -0
  559. {melage → assets}/resource/theme/rc/toolbar_move_vertical.png +0 -0
  560. {melage → assets}/resource/theme/rc/toolbar_move_vertical@2x.png +0 -0
  561. {melage → assets}/resource/theme/rc/toolbar_move_vertical_disabled.png +0 -0
  562. {melage → assets}/resource/theme/rc/toolbar_move_vertical_disabled@2x.png +0 -0
  563. {melage → assets}/resource/theme/rc/toolbar_move_vertical_focus.png +0 -0
  564. {melage → assets}/resource/theme/rc/toolbar_move_vertical_focus@2x.png +0 -0
  565. {melage → assets}/resource/theme/rc/toolbar_move_vertical_pressed.png +0 -0
  566. {melage → assets}/resource/theme/rc/toolbar_move_vertical_pressed@2x.png +0 -0
  567. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal.png +0 -0
  568. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal@2x.png +0 -0
  569. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_disabled.png +0 -0
  570. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_disabled@2x.png +0 -0
  571. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_focus.png +0 -0
  572. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_focus@2x.png +0 -0
  573. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_pressed.png +0 -0
  574. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_pressed@2x.png +0 -0
  575. {melage → assets}/resource/theme/rc/toolbar_separator_vertical.png +0 -0
  576. {melage → assets}/resource/theme/rc/toolbar_separator_vertical@2x.png +0 -0
  577. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_disabled.png +0 -0
  578. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_disabled@2x.png +0 -0
  579. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_focus.png +0 -0
  580. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_focus@2x.png +0 -0
  581. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_pressed.png +0 -0
  582. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_pressed@2x.png +0 -0
  583. {melage → assets}/resource/theme/rc/transparent.png +0 -0
  584. {melage → assets}/resource/theme/rc/transparent@2x.png +0 -0
  585. {melage → assets}/resource/theme/rc/transparent_disabled.png +0 -0
  586. {melage → assets}/resource/theme/rc/transparent_disabled@2x.png +0 -0
  587. {melage → assets}/resource/theme/rc/transparent_focus.png +0 -0
  588. {melage → assets}/resource/theme/rc/transparent_focus@2x.png +0 -0
  589. {melage → assets}/resource/theme/rc/transparent_pressed.png +0 -0
  590. {melage → assets}/resource/theme/rc/transparent_pressed@2x.png +0 -0
  591. {melage → assets}/resource/theme/rc/window_close.png +0 -0
  592. {melage → assets}/resource/theme/rc/window_close@2x.png +0 -0
  593. {melage → assets}/resource/theme/rc/window_close_disabled.png +0 -0
  594. {melage → assets}/resource/theme/rc/window_close_disabled@2x.png +0 -0
  595. {melage → assets}/resource/theme/rc/window_close_focus.png +0 -0
  596. {melage → assets}/resource/theme/rc/window_close_focus@2x.png +0 -0
  597. {melage → assets}/resource/theme/rc/window_close_pressed.png +0 -0
  598. {melage → assets}/resource/theme/rc/window_close_pressed@2x.png +0 -0
  599. {melage → assets}/resource/theme/rc/window_grip.png +0 -0
  600. {melage → assets}/resource/theme/rc/window_grip@2x.png +0 -0
  601. {melage → assets}/resource/theme/rc/window_grip_disabled.png +0 -0
  602. {melage → assets}/resource/theme/rc/window_grip_disabled@2x.png +0 -0
  603. {melage → assets}/resource/theme/rc/window_grip_focus.png +0 -0
  604. {melage → assets}/resource/theme/rc/window_grip_focus@2x.png +0 -0
  605. {melage → assets}/resource/theme/rc/window_grip_pressed.png +0 -0
  606. {melage → assets}/resource/theme/rc/window_grip_pressed@2x.png +0 -0
  607. {melage → assets}/resource/theme/rc/window_minimize.png +0 -0
  608. {melage → assets}/resource/theme/rc/window_minimize@2x.png +0 -0
  609. {melage → assets}/resource/theme/rc/window_minimize_disabled.png +0 -0
  610. {melage → assets}/resource/theme/rc/window_minimize_disabled@2x.png +0 -0
  611. {melage → assets}/resource/theme/rc/window_minimize_focus.png +0 -0
  612. {melage → assets}/resource/theme/rc/window_minimize_focus@2x.png +0 -0
  613. {melage → assets}/resource/theme/rc/window_minimize_pressed.png +0 -0
  614. {melage → assets}/resource/theme/rc/window_minimize_pressed@2x.png +0 -0
  615. {melage → assets}/resource/theme/rc/window_undock.png +0 -0
  616. {melage → assets}/resource/theme/rc/window_undock@2x.png +0 -0
  617. {melage → assets}/resource/theme/rc/window_undock_disabled.png +0 -0
  618. {melage → assets}/resource/theme/rc/window_undock_disabled@2x.png +0 -0
  619. {melage → assets}/resource/theme/rc/window_undock_focus.png +0 -0
  620. {melage → assets}/resource/theme/rc/window_undock_focus@2x.png +0 -0
  621. {melage → assets}/resource/theme/rc/window_undock_pressed.png +0 -0
  622. {melage → assets}/resource/theme/rc/window_undock_pressed@2x.png +0 -0
  623. {melage → assets}/resource/theme/style.qss +0 -0
  624. {melage → assets}/resource/tract.png +0 -0
  625. {melage → assets}/resource/view1.png +0 -0
  626. {melage → assets}/resource/view1_eco.png +0 -0
  627. {melage → assets}/resource/view1_mri.png +0 -0
  628. {melage → assets}/resource/view1_seg.png +0 -0
  629. {melage → assets}/resource/view2.png +0 -0
  630. {melage → assets}/resource/view2_seg.png +0 -0
  631. {melage → assets}/resource/w.png +0 -0
  632. {melage → assets}/resource/zoom_inFaded.png +0 -0
  633. /melage/resource/zoom_in.png → /assets/resource/zoom_in_old.png +0 -0
  634. {melage → assets}/resource/zoom_outFaded.png +0 -0
  635. /melage/resource/zoom_out.png → /assets/resource/zoom_out_old.png +0 -0
  636. /melage/{widgets/activation.py → dialogs/ActivationDialog.py} +0 -0
  637. /melage/{widgets/HistImage.py → dialogs/HistogramDialog.py} +0 -0
  638. /melage/{widgets/iminfo.py → dialogs/ImInfoDialog.py} +0 -0
  639. /melage/{widgets/colorwidget.py → dialogs/helpers/ColorDialog.py} +0 -0
  640. /melage/{utils/custom_QScrollBar.py → dialogs/helpers/CustomScrollbar.py} +0 -0
  641. /melage/{widgets/repeat_widget.py → dialogs/helpers/RepeatDialog.py} +0 -0
  642. /melage/{widgets/screenshot_widget.py → dialogs/helpers/ScreenshotDialog.py} +0 -0
  643. /melage/{cli.py → melage.py} +0 -0
  644. /melage/{utils/brain_extraction_helper.py → plugins/bet/main/utils.py} +0 -0
  645. /melage/{graphics → rendering}/GLGraphicsItem.py +0 -0
  646. /melage/{graphics → rendering}/GLViewWidget.py +0 -0
  647. /melage/{graphics → rendering}/Transform3D.py +0 -0
  648. /melage/{graphics → rendering}/__init__.py +0 -0
  649. /melage/{graphics → rendering}/functions.py +0 -0
  650. /melage/{utils → rendering/helpers}/Shaders_120.py +0 -0
  651. /melage/{utils → rendering/helpers}/Shaders_330.py +0 -0
  652. /melage/{graphics → rendering}/items/GLAxisItem.py +0 -0
  653. /melage/{graphics → rendering}/items/GLGridItem.py +0 -0
  654. /melage/{graphics → rendering}/items/GLPolygonItem.py +0 -0
  655. /melage/{graphics → rendering}/items/GLScatterPlotItem.py +0 -0
  656. /melage/{graphics → rendering}/items/GLVolumeItem.py +0 -0
  657. /melage/{graphics → rendering}/items/GLVolumeItem_b.py +0 -0
  658. /melage/{graphics → rendering}/items/__init__.py +0 -0
  659. /melage/{graphics → rendering}/shaders.py +0 -0
  660. /melage/widgets/{enhanceImWidget.py → EnhanceImageWidget.py} +0 -0
  661. {melage-0.0.65.dist-info → melage-1.0.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,470 @@
1
+ import torch
2
+ import torch.nn.functional as F
3
+ import torch.nn as nn
4
+ import ants
5
+ import nibabel as nib
6
+
7
+ import numpy as np
8
+ from scipy.ndimage import gaussian_filter
9
+ from scipy.ndimage import zoom
10
+
11
+ def intensity_res(imT1, prob):
12
+ # Avoid division by zero
13
+ eps = 1e-5
14
+
15
+ # Ensure input tensors are on the same device (e.g., CUDA or CPU)
16
+ imT1 = imT1.float() # Ensure imT1 is a float tensor
17
+ prob = prob.float() # Ensure prob is a float tensor
18
+
19
+ # Broadcast imT1 to match the shape of prob (B, K, D, H, W)
20
+ if imT1.shape[1] == 1:
21
+ imT1_broadcast = imT1.expand(-1, prob.shape[1], -1, -1, -1) # Broadcast imT1 to (B, K, D, H, W)
22
+ else:
23
+ imT1_broadcast = imT1 # (B, K, D, H, W), no need to broadcast if shapes already match
24
+
25
+ # Mean: mu_k shape (B, K)
26
+ sum_prob = torch.sum(prob, dim=(2, 3, 4)) # Sum over the spatial dimensions
27
+ mu_k = torch.sum(prob * imT1_broadcast, dim=(2, 3, 4)) / (sum_prob + eps)
28
+
29
+ # Variance: var_k shape (B, K)
30
+ mu_k_broadcast = mu_k.unsqueeze(-1).unsqueeze(-1).unsqueeze(-1) # (B, K, 1, 1, 1) for broadcasting
31
+ var_k = torch.sum(prob * (imT1_broadcast - mu_k_broadcast) ** 2, dim=(2, 3, 4)) / (sum_prob + eps)
32
+
33
+ # Standard deviation: std_k shape (B, K)
34
+ std_k = torch.sqrt(var_k + eps)
35
+
36
+ # Expand for broadcasting
37
+ mu = mu_k.unsqueeze(-1).unsqueeze(-1).unsqueeze(-1) # shape (B, K, 1, 1, 1)
38
+ std = std_k.unsqueeze(-1).unsqueeze(-1).unsqueeze(-1) # shape (B, K, 1, 1, 1)
39
+
40
+ # Log-likelihood under Gaussian model
41
+ log_likelihood = -0.5 * ((imT1_broadcast - mu) ** 2) / (std ** 2 + eps) \
42
+ - torch.log(std + eps) \
43
+ - 0.5 * np.log(2 * np.pi)
44
+
45
+ # Softmax across regions (K) to get confidence weights
46
+ logits = log_likelihood
47
+ logits_max = torch.max(logits, dim=1, keepdim=True).values # Numerical stability (subtract max)
48
+ exp_logits = torch.exp(logits - logits_max) # for numerical stability
49
+ confidence_weights = exp_logits / (torch.sum(exp_logits, dim=1, keepdim=True) + eps) # shape (B, K, D, H, W)
50
+
51
+ return confidence_weights
52
+
53
+ def create_image_from_prob(imT1, prob_value):
54
+ topk_probs, topk_labels = torch.topk(prob_value, k=1, dim=1)
55
+
56
+ centers = (prob_value * imT1).sum(dim=[2, 3, 4]) / (prob_value.sum(dim=[2, 3, 4]) + 1e-5) # shape [B, C]
57
+ # Reshape centers for broadcasting: [B, C, 1, 1, 1]
58
+ centers_expanded = centers.view(centers.shape[0], centers.shape[1], 1, 1, 1)
59
+ # Expand to match spatial dims of topk_labels: [B, C, D, H, W]
60
+ centers_expanded = centers_expanded.expand(-1, -1, *topk_labels.shape[2:])
61
+ # Make sure topk_labels is shaped for indexing: [B, 1, D, H, W] (for class/channel selection)
62
+ # It should be long/int type
63
+ topk_labels = topk_labels.long() # Add channel dim for gather
64
+ # Gather values: [B, 1, D, H, W]
65
+ new_image = torch.gather(centers_expanded, dim=1, index=topk_labels)
66
+
67
+ return new_image
68
+
69
+ def write_to_file(prob_atlas_size,mask_original, mask_new, prob_new, pathOrigin):
70
+ imA = read_atlas_file(pathOrigin, rewrite_to_file=True)
71
+
72
+ mask_original = mask_original.squeeze().detach().cpu().numpy()
73
+ mask_original = nib.Nifti1Image(mask_original.astype(np.int16), affine=imA.affine, header=imA.header)
74
+
75
+ mask_original.to_filename(mask_new)
76
+
77
+ prob_atlas_size = prob_atlas_size.squeeze().detach().cpu().numpy()
78
+ prob_atlas_size = nib.Nifti1Image(prob_atlas_size, affine=imA.affine, header=imA.header)
79
+
80
+ prob_atlas_size.to_filename(prob_new)
81
+ print(f'OutProb_original: {prob_new}')
82
+
83
+
84
+
85
+ class Histogram_Matching(nn.Module):
86
+ def __init__(self, differentiable=True, bins=32, sigma=None):
87
+ super(Histogram_Matching, self).__init__()
88
+ self.differentiable = differentiable
89
+ self.bins = bins
90
+ self.sigma = sigma if sigma is not None else 5.0
91
+
92
+ def forward(self, dst, ref):
93
+ B, C, D, H, W = dst.shape
94
+ assert dst.device == ref.device
95
+
96
+ hist_dst = self.cal_hist(dst)
97
+ hist_ref = self.cal_hist(ref)
98
+
99
+ tables = self.cal_trans_batch(hist_dst, hist_ref)
100
+
101
+ dst_flat = dst.view(B*C, -1) * (self.bins - 1) # scale intensities
102
+ dst_flat = dst_flat.unsqueeze(2) # (B*C, N, 1)
103
+
104
+ indices = torch.linspace(0, self.bins-1, self.bins, device=dst.device).view(1, 1, -1) # (1,1,bins)
105
+
106
+ weights = torch.softmax(-((dst_flat - indices)**2) / (2*(self.sigma**2)), dim=-1) # (B*C, N, bins)
107
+
108
+ matched = torch.bmm(weights, tables.unsqueeze(-1)).squeeze(-1) # (B*C, N)
109
+
110
+ matched = matched.view(B, C, D, H, W) / (self.bins - 1) # back to [0,1]
111
+
112
+ return matched
113
+
114
+ def cal_hist(self, img):
115
+ B, C, D, H, W = img.shape
116
+ if self.differentiable:
117
+ hists = self.soft_histc_batch(img * (self.bins - 1))
118
+ else:
119
+ hists = torch.stack([
120
+ torch.histc(img[b, c] * (self.bins - 1), bins=self.bins, min=0, max=self.bins-1)
121
+ for b in range(B) for c in range(C)
122
+ ])
123
+ hists = F.normalize(hists.float(), p=1, dim=1)
124
+ cdfs = torch.cumsum(hists, dim=1)
125
+ return cdfs
126
+
127
+ def soft_histc_batch(self, x):
128
+ B, C, D, H, W = x.shape
129
+ x = x.view(B*C, -1)
130
+
131
+ delta = 1.0
132
+ centers = torch.linspace(0, self.bins-1, self.bins, device=x.device).float()
133
+ centers = centers[None, :, None] # (1, bins, 1)
134
+
135
+ x = x.unsqueeze(1) # (B*C, 1, N)
136
+
137
+ soft_bins = torch.sigmoid((x - centers + delta/2) * self.sigma) - torch.sigmoid((x - centers - delta/2) * self.sigma)
138
+ soft_hist = soft_bins.sum(dim=2) # (B*C, bins)
139
+
140
+ return soft_hist
141
+
142
+ def cal_trans_batch(self, cdf_src, cdf_ref):
143
+ Bc, bins = cdf_src.shape
144
+ cdf_src = cdf_src.unsqueeze(2) # (B*C, bins, 1)
145
+ cdf_ref = cdf_ref.unsqueeze(1) # (B*C, 1, bins)
146
+
147
+ dist = torch.abs(cdf_src - cdf_ref) # (B*C, bins, bins)
148
+
149
+ mapping = dist.argmin(dim=2) # (B*C, bins)
150
+
151
+ return mapping.float()
152
+
153
+ def erode_mask(mask, radius=1):
154
+ kernel = torch.ones((1, 1, 2*radius+1, 2*radius+1, 2*radius+1), device=mask.device)
155
+ padded = F.pad(mask.float(), [radius]*6, mode='replicate')
156
+ eroded = F.conv3d(padded, kernel) == kernel.numel()
157
+ return eroded.float()
158
+
159
+ def adjust_probs_with_uncertainty(probs, uncertainty, min_temp=1.0, max_temp=5.0):
160
+ # Normalize uncertainty to [0, 1]
161
+ norm_unc = (uncertainty - uncertainty.min()) / (uncertainty.max() - uncertainty.min() + 1e-5)
162
+
163
+ # Convert normalized uncertainty to temperature (higher temp = more smoothing)
164
+ temp = min_temp + (max_temp - min_temp) * norm_unc # shape: (B, 1, D, H, W)
165
+
166
+ # To avoid instability, apply temp scaling in log-space
167
+ log_probs = torch.log(probs + 1e-8)
168
+ log_probs_scaled = log_probs / temp # broadcast over channels
169
+
170
+ probs_adj = F.softmax(log_probs_scaled, dim=1)
171
+ return probs_adj
172
+
173
+ def get_back_to_size_torch(img: torch.Tensor, pad_width):
174
+ (pad_x, pad_y, pad_z) = pad_width
175
+ pad_x1, pad_x2 = pad_x
176
+ pad_y1, pad_y2 = pad_y
177
+ pad_z1, pad_z2 = pad_z
178
+
179
+ unpadded_img = img[
180
+ ...,
181
+ pad_x1 : -pad_x2 if pad_x2 > 0 else None,
182
+ pad_y1 : -pad_y2 if pad_y2 > 0 else None,
183
+ pad_z1 : -pad_z2 if pad_z2 > 0 else None,
184
+ ]
185
+ return unpadded_img
186
+
187
+
188
+ def calculate_jacobian_determinant_3d(flow):
189
+ """Calculates the Jacobian determinant of a 3D deformation field."""
190
+ B, _, D, H, W = flow.shape
191
+ device = flow.device
192
+ grid_z, grid_y, grid_x = torch.meshgrid(torch.arange(D, device=device), torch.arange(H, device=device),
193
+ torch.arange(W, device=device), indexing='ij')
194
+ grid = torch.stack((grid_x, grid_y, grid_z), dim=0).float()
195
+ grid = grid.unsqueeze(0).repeat(B, 1, 1, 1, 1)
196
+ transform_map = grid + flow
197
+
198
+ diff_x = transform_map[..., 1:] - transform_map[..., :-1]
199
+ grad_x = torch.cat([diff_x, diff_x[..., -1:]], dim=-1)
200
+ diff_y = transform_map[..., 1:, :] - transform_map[..., :-1, :]
201
+ grad_y = torch.cat([diff_y, diff_y[..., -1:, :]], dim=-2)
202
+ diff_z = transform_map[:, :, 1:, :, :] - transform_map[:, :, :-1, :, :]
203
+ grad_z = torch.cat([diff_z, diff_z[:, :, -1:, :, :]], dim=-3)
204
+
205
+ J_xx, J_yx, J_zx = grad_x[:, 0, ...], grad_x[:, 1, ...], grad_x[:, 2, ...]
206
+ J_xy, J_yy, J_zy = grad_y[:, 0, ...], grad_y[:, 1, ...], grad_y[:, 2, ...]
207
+ J_xz, J_yz, J_zz = grad_z[:, 0, ...], grad_z[:, 1, ...], grad_z[:, 2, ...]
208
+
209
+ determinant = (J_xx * (J_yy * J_zz - J_zy * J_yz) - J_xy * (J_yx * J_zz - J_zx * J_yz) + J_xz * (
210
+ J_yx * J_zy - J_zx * J_yy))
211
+ return determinant.unsqueeze(1)
212
+
213
+
214
+ def spatial_transformer_field(image, deformation_field, mode='bilinear'):
215
+ device = image.device
216
+ D, H, W = image.shape[2:]
217
+ d_coords, h_coords, w_coords = torch.meshgrid(torch.linspace(-1, 1, D), torch.linspace(-1, 1, H), torch.linspace(-1, 1, W), indexing='ij')
218
+ identity_grid = torch.stack([w_coords, h_coords, d_coords], dim=-1).unsqueeze(0).to(device)
219
+ scaling = torch.tensor([2 / (W - 1), 2 / (H - 1), 2 / (D - 1)], device=device)
220
+ deformation_field_normalized = deformation_field.permute(0, 2, 3, 4, 1) * scaling
221
+ sampling_grid = identity_grid + deformation_field_normalized
222
+ if mode=='bilinear':
223
+ warped_image = F.grid_sample(image, sampling_grid, mode='bilinear', padding_mode='border', align_corners=True)
224
+ elif mode=='nearest':
225
+ warped_image = warped_image = F.grid_sample(image, sampling_grid, mode='nearest', padding_mode='border', align_corners=True)
226
+ else:
227
+ return None
228
+ return warped_image
229
+
230
+ def augment_based_on_deform_field(source, atlas_probs):
231
+ # Define which ROIs you want to smooth
232
+
233
+
234
+
235
+ IMAGE_SHAPE = source.shape[2:]
236
+ DEFORMATION_COARSE_GRID = (4, 2, 4)
237
+ DEFORMATION_MAGNITUDE = 8.0 # Max displacement in pixels
238
+ deformation_field = generate_smooth_deformation_field(
239
+ shape=IMAGE_SHAPE,
240
+ coarse_grid_shape=DEFORMATION_COARSE_GRID,
241
+ magnitude=DEFORMATION_MAGNITUDE
242
+ )
243
+ print("Calculating Jacobian determinant...")
244
+ jacobian_map = calculate_jacobian_determinant_3d(deformation_field)
245
+ y_source = spatial_transformer_field(source, deformation_field)
246
+ prob_atlas = spatial_transformer_field(atlas_probs, deformation_field, mode='nearest') # *mask
247
+ # c. Modulate the intensity of the warped image using the Jacobian
248
+ print("Modulating intensity based on deformation...")
249
+ INTENSITY_EFFECT_STRENGTH = 0.8 # How much compression/expansion changes brightness
250
+ INTENSITY_NOISE_LEVEL = 0.01 # How much random noise to add
251
+ modulated_image = modulate_intensity_with_jacobian(
252
+ y_source, prob_atlas, jacobian_map,
253
+ effect_strength=INTENSITY_EFFECT_STRENGTH,
254
+ noise_level=INTENSITY_NOISE_LEVEL
255
+ )
256
+ return modulated_image, prob_atlas
257
+
258
+ # --- NEW FUNCTION ---
259
+ def modulate_intensity_with_jacobian(base_image, atlas, jacobian_map, effect_strength=0.5, noise_level=0.1):
260
+ """
261
+ Modulates image intensity within ROIs based on local Jacobian values.
262
+
263
+ Args:
264
+ base_image (torch.Tensor): The image to modify (1, 1, D, H, W).
265
+ atlas (torch.Tensor): Atlas with integer labels for ROIs (1, 1, D, H, W).
266
+ jacobian_map (torch.Tensor): The Jacobian determinant map (1, 1, D, H, W).
267
+ effect_strength (float): How strongly the Jacobian affects intensity.
268
+ Positive: compression -> brighter.
269
+ Negative: compression -> darker.
270
+ noise_level (float): The standard deviation of Gaussian noise to add.
271
+
272
+ Returns:
273
+ torch.Tensor: The image with modulated intensities.
274
+ """
275
+ #modulated_image = base_image.clone()
276
+
277
+ pixels_in_roi = base_image
278
+ jacobian_in_roi = jacobian_map
279
+
280
+ # 1. Calculate the deterministic intensity modulation factor
281
+ # (J-1) centers the effect: J=1 -> no change. J<1 (compression) -> negative.
282
+
283
+ modulation_factor = 1.0 - (jacobian_in_roi - (jacobian_in_roi.mean()+2*jacobian_in_roi.std())) * effect_strength
284
+
285
+ # 2. Create a random noise component
286
+ random_noise = torch.randn_like(pixels_in_roi) * noise_level
287
+
288
+ # 3. Apply the changes
289
+ modified_pixels = pixels_in_roi * modulation_factor + random_noise
290
+
291
+ # Place the modified pixels back into the image
292
+ modulated_image = modified_pixels
293
+
294
+ """
295
+
296
+
297
+ # Process each ROI label found in the atlas
298
+ for label in torch.unique(atlas)[1:]: # Skip background (label 0)
299
+ mask = (atlas == label)
300
+
301
+ # Get the pixels and corresponding Jacobian values for this ROI
302
+ pixels_in_roi = base_image[mask]
303
+ jacobian_in_roi = jacobian_map[mask]
304
+
305
+ # 1. Calculate the deterministic intensity modulation factor
306
+ # (J-1) centers the effect: J=1 -> no change. J<1 (compression) -> negative.
307
+ modulation_factor = 1.0 - (jacobian_in_roi - 1.0) * effect_strength
308
+
309
+ # 2. Create a random noise component
310
+ random_noise = torch.randn_like(pixels_in_roi) * noise_level
311
+
312
+ # 3. Apply the changes
313
+ modified_pixels = pixels_in_roi * modulation_factor + random_noise
314
+
315
+ # Place the modified pixels back into the image
316
+ modulated_image[mask] = modified_pixels
317
+ """
318
+ return modulated_image
319
+ def generate_smooth_deformation_field(shape, coarse_grid_shape, magnitude):
320
+
321
+ """
322
+ Generates a smooth, random 3D deformation field.
323
+
324
+ This works by creating a very low-resolution random vector field and then
325
+ upsampling and smoothing it into a high-resolution, plausible deformation.
326
+
327
+ Args:
328
+ shape (tuple): The final shape of the field (D, H, W).
329
+ coarse_grid_shape (tuple): The low-resolution grid size (e.g., (4, 4, 4)).
330
+ magnitude (float): A scaling factor for the displacement strength.
331
+
332
+ Returns:
333
+ torch.Tensor: The smooth deformation field of shape (1, 3, D, H, W).
334
+ """
335
+ # 1. Create the coarse, random vector field
336
+ coarse_field = np.random.randn(*coarse_grid_shape, 3) * magnitude
337
+
338
+ # 2. Upsample the coarse field to the final shape
339
+ zoom_factors = [s / cs for s, cs in zip(shape, coarse_grid_shape)]
340
+
341
+ # Upsample each displacement channel (x, y, z)
342
+ upsampled_field = np.zeros((*shape, 3))
343
+ for i in range(3):
344
+ upsampled_field[..., i] = zoom(coarse_field[..., i], zoom=zoom_factors, order=3) # Cubic spline interpolation
345
+
346
+ # 3. Smooth the upsampled field to make it physically plausible
347
+ # A large sigma creates very smooth, large-scale deformations.
348
+ smoothed_field = np.zeros_like(upsampled_field)
349
+ for i in range(3):
350
+ smoothed_field[..., i] = gaussian_filter(upsampled_field[..., i], sigma=10)
351
+
352
+ # 4. Convert to a PyTorch tensor and format for the spatial transformer
353
+ # The channels need to be in the second dimension (B, C, D, H, W)
354
+ # The standard for grid_sample is (x, y, z), which corresponds to (W, H, D)
355
+ #flow_tensor = torch.from_numpy(smoothed_field).permute(3, 0, 1, 2).unsqueeze(0).float()
356
+
357
+ # PyTorch flow fields are ordered (x,y,z), corresponding to W,H,D dimensions
358
+ # Our numpy array was D,H,W,C so we permute C,D,H,W
359
+ # Let's re-order the numpy array for clarity before converting to tensor
360
+ smoothed_field_xyz = smoothed_field[..., [2, 1, 0]] # Reorder to x,y,z
361
+ flow_tensor = torch.from_numpy(smoothed_field_xyz).permute(3, 0, 1, 2).unsqueeze(0).float()
362
+
363
+ return flow_tensor
364
+
365
+
366
+ def restore_zero_torch(cropped_data: torch.Tensor, original_shape, min_max, value=0):
367
+ """
368
+ Restore the cropped data back to the original shape with padding (default = 0).
369
+
370
+ :param cropped_data: The cropped tensor from remove_zero
371
+ :param original_shape: The shape of the original full image
372
+ :param min_max: The min/max indices used for cropping
373
+ :param value: The padding value to fill
374
+ :return: Restored full-size tensor
375
+ """
376
+ if min_max.abs().sum()==0:
377
+ return cropped_data
378
+ B, C, _, _, _ = cropped_data.shape
379
+ W,H, D = original_shape
380
+ restored = torch.full((B,C,W,H,D), value, dtype=cropped_data.dtype, device=cropped_data.device)
381
+
382
+ restored[:,:,
383
+ min_max[0][0]:min_max[0][1] + 1,
384
+ min_max[1][0]:min_max[1][1] + 1,
385
+ min_max[2][0]:min_max[2][1] + 1
386
+ ] = cropped_data
387
+
388
+ return restored
389
+
390
+ def change_to_original(im_changed, data, batch_num=0):
391
+ im1 = get_back_to_size_torch(im_changed, data['pad_width'][batch_num])
392
+ im1 = restore_zero_torch(im1, data['shape_original'][batch_num], data['min_max'][batch_num])
393
+ return im1
394
+
395
+ def differentiable_boundary(mask, kernel_size=3):
396
+ """Returns soft boundary: high when neighbor differs from center."""
397
+ # Laplacian-like filter via average pooling
398
+ pad = kernel_size // 2
399
+ avg_mask = F.avg_pool3d(mask, kernel_size=kernel_size, stride=1, padding=pad)
400
+ return torch.abs(avg_mask - mask)
401
+
402
+
403
+ def laplacian_3d(image):
404
+ # 3D Laplacian kernel (center - 6 neighbors)
405
+ kernel = torch.tensor([[[[0, 0, 0],
406
+ [0, -1, 0],
407
+ [0, 0, 0]],
408
+
409
+ [[0, -1, 0],
410
+ [-1, 6, -1],
411
+ [0, -1, 0]],
412
+
413
+ [[0, 0, 0],
414
+ [0, -1, 0],
415
+ [0, 0, 0]]]], dtype=image.dtype, device=image.device)
416
+
417
+ kernel = kernel.unsqueeze(0) # shape: [1, 1, 3, 3, 3]
418
+
419
+ # Apply convolution
420
+ lap = F.conv3d(image, kernel, padding=1)
421
+ return lap
422
+ def soft_erode(img, iterations=3):
423
+ for _ in range(iterations):
424
+ img = -F.max_pool3d(-img, kernel_size=3, stride=1, padding=1)
425
+ return img
426
+
427
+ def soft_skeletonize(img, iterations=3):
428
+ skel = F.relu(img - soft_erode(img, iterations))
429
+ return skel
430
+ def gradient_3d(img):
431
+ dz = img[:, :, 1:, :, :] - img[:, :, :-1, :, :]
432
+ dy = img[:, :, :, 1:, :] - img[:, :, :, :-1, :]
433
+ dx = img[:, :, :, :, 1:] - img[:, :, :, :, :-1]
434
+ return dx, dy, dz
435
+
436
+ def bending_energy_loss(disp):
437
+ """
438
+ disp: tensor of shape (B, 3, D, H, W), displacement field
439
+ """
440
+ dx = disp[:, :, 2:, 1:-1, 1:-1] - 2 * disp[:, :, 1:-1, 1:-1, 1:-1] + disp[:, :, :-2, 1:-1, 1:-1]
441
+ dy = disp[:, :, 1:-1, 2:, 1:-1] - 2 * disp[:, :, 1:-1, 1:-1, 1:-1] + disp[:, :, 1:-1, :-2, 1:-1]
442
+ dz = disp[:, :, 1:-1, 1:-1, 2:] - 2 * disp[:, :, 1:-1, 1:-1, 1:-1] + disp[:, :, 1:-1, 1:-1, :-2]
443
+ return (dx.pow(2) + dy.pow(2) + dz.pow(2)).mean()
444
+
445
+ def gm_highest_at_wm_border(P_WM, P_GM, P_BG, P_GM_previous, eps=1e-6):
446
+ """
447
+ Computes a soft, differentiable metric for:
448
+ where WM touches CSF or BG, is GM the highest?
449
+ """
450
+
451
+
452
+ # Extract individual tissue probs
453
+ wm = P_WM
454
+ gm = P_GM
455
+ bg = P_BG
456
+
457
+ # Define WM border using soft boundary detection
458
+ kernel = torch.zeros((1, 1, 3, 3, 3), device=P_BG.device)
459
+ offsets = [(0, 1, 1), (1, 0, 1), (1, 1, 0),
460
+ (1, 1, 2), (1, 2, 1), (2, 1, 1)]
461
+ for i, j, k in offsets:
462
+ kernel[0, 0, i, j, k] = 1.0
463
+ neighbour_wm = F.conv3d((wm > 0.5).float(), kernel, padding=1)/6. # (B, 1, H, W, D)
464
+ wm_boundary = (neighbour_wm-wm).abs()
465
+ # Compute contact with CSF or BG: high where neighboring probs are nonzero
466
+ csf_or_bg = ( (bg[0]==0)).float()
467
+ touching = (wm_boundary * csf_or_bg)>0 # soft mask for "touching" regions
468
+ gm[touching] = P_GM_previous[touching]
469
+
470
+ return gm # in [0, 1], higher = more GM dominance at WM borders
@@ -22,10 +22,10 @@ import math
22
22
  from collections import defaultdict
23
23
  from sys import platform
24
24
  if platform=='darwin':
25
- from melage.utils.Shaders_120 import vsrc, fsrc, fsrcPaint, vsrcPaint
25
+ from melage.rendering.helpers.Shaders_120 import vsrc, fsrc, fsrcPaint, vsrcPaint
26
26
  else:
27
- from melage.utils.Shaders_330 import vsrc, fsrc, fsrcPaint, vsrcPaint
28
- from melage.utils.GMM import GaussianMixture
27
+ from melage.rendering.helpers.Shaders_330 import vsrc, fsrc, fsrcPaint, vsrcPaint
28
+
29
29
  from melage.utils.utils import LargestCC
30
30
  from sklearn.mixture import GaussianMixture
31
31
 
@@ -970,97 +970,84 @@ class GLWidget(QOpenGLWidget):
970
970
  if self.imSlice is None:
971
971
  return
972
972
 
973
- self.UpdatePaintInfo()
974
973
  self.makeObject()
975
974
 
976
-
977
975
  def UpdatePaintInfo(self):
978
976
  """
979
- Update infroamtion of the iamge
980
- :return:
981
- """
982
- self.windowAR = self.width() / (self.height()+0.000001) #windows aspect ratio
983
- imWidth = self.imWidth
984
- imHeight = self.imHeight
985
-
986
- ratioX = imWidth / self.width()
987
- ratioY = imHeight / (self.height()+0.000001)
988
- if self.width() > self.height():
989
- if imWidth <= imHeight:
990
-
991
- self.zoomed_height = imHeight
992
- # self.zoomed_height /= self.imAr
993
- self.bottom = 0
994
- self.top = self.bottom + self.zoomed_height
995
-
996
- # rescale to the image width
997
- self.zoomed_width = ratioY * self.width()
998
-
999
- # image left position
1000
- self.left = imWidth / 2 - (self.zoomed_height * self.windowAR - self.zoomed_width / 2)
1001
-
1002
- # image right position
1003
- self.right = self.left + self.zoomed_width
1004
- else:
1005
- if ratioX < 1 and ratioY > 1:
1006
- self.zoomed_height = imHeight
1007
- self.bottom = 0 #
1008
- self.top = self.bottom + self.zoomed_height
1009
-
1010
- self.zoomed_width = ratioY * self.width()
1011
- self.left = imWidth / 2 - (self.zoomed_height * self.windowAR - self.zoomed_width / 2)
1012
- self.right = self.left + self.zoomed_width
1013
-
1014
-
1015
- else:
1016
- self.zoomed_width = imWidth
1017
- self.left = 0 # -imWidth * (self.windowAR - 1) / 2
1018
- self.right = self.left + self.zoomed_width
1019
-
1020
- self.zoomed_height = ratioX * self.height()
1021
- self.bottom = imHeight / 2 - (self.zoomed_width / self.windowAR - self.zoomed_height / 2)
1022
- self.top = self.bottom + self.zoomed_height
977
+ Update information of the image with a simplified "fit" scaling.
978
+
979
+ This centers the image and scales it to fit within the window
980
+ while preserving its aspect ratio, creating "letterboxing" or
981
+ "pillarboxing" as needed.
982
+ """
983
+ # Add a small epsilon to prevent division by zero
984
+ epsilon = 0.000001
985
+
986
+ window_w = self.width()
987
+ window_h = self.height() + epsilon
988
+ img_w = self.imWidth
989
+ img_h = self.imHeight
990
+ #print(f"windw w {window_w} and {window_h}")
991
+ # Handle case where image might not be loaded yet
992
+ if img_w == 0 or img_h == 0:
993
+ self.left = 0
994
+ self.right = window_w
995
+ self.bottom = 0
996
+ self.top = window_h
997
+ return
1023
998
 
999
+ img_h += epsilon # Add epsilon to image height as well
1024
1000
 
1025
- elif self.width() <= self.height():
1001
+ # 1. Calculate Aspect Ratios
1002
+ window_ar = window_w / window_h
1003
+ image_ar = img_w / img_h
1026
1004
 
1027
- if imWidth <= imHeight:
1028
- if ratioX < 1 and ratioY > 1 or ratioX / ratioY < 1:
1029
- self.zoomed_height = imHeight
1030
- self.bottom = 0
1031
- self.top = self.bottom + self.zoomed_height
1005
+ # 2. Compare aspect ratios to determine the limiting dimension
1006
+ if window_ar > image_ar:
1007
+ # --- CASE 1: Window is "wider" than the image ---
1008
+ # The image is "taller" relative to the window.
1009
+ # We are limited by the image's HEIGHT.
1010
+ # This will create "pillarboxing" (black bars on left/right).
1032
1011
 
1033
- self.zoomed_width = ratioY * self.width()
1012
+ # The view's height will be the image's height
1013
+ view_height = img_h
1014
+ # The view's width must be calculated from the view's height
1015
+ # to match the window's aspect ratio.
1016
+ view_width = view_height * window_ar
1034
1017
 
1035
- self.left = imWidth / 2 - (self.zoomed_height * self.windowAR - self.zoomed_width / 2)
1036
- self.right = self.left + self.zoomed_width
1018
+ # Center the view horizontally around the image's center
1019
+ self.bottom = 0
1020
+ self.top = img_h
1021
+ self.left = (img_w / 2.0) - (view_width / 2.0)
1022
+ self.right = (img_w / 2.0) + (view_width / 2.0)
1037
1023
 
1038
1024
 
1039
- else:
1040
- self.zoomed_width = imWidth
1041
- self.left = 0
1042
- self.right = self.left + self.zoomed_width
1025
+ else:
1026
+ # --- CASE 2: Image is "wider" than the window ---
1027
+ # The image is "wider" relative to the window.
1028
+ # We are limited by the image's WIDTH.
1029
+ # This will create "letterboxing" (black bars on top/bottom).
1043
1030
 
1044
- self.zoomed_height = ratioX * self.height()
1045
- self.bottom = imHeight / 2 - (self.zoomed_width / self.windowAR - self.zoomed_height / 2)
1046
- self.top = self.bottom + self.zoomed_height
1031
+ # The view's width will be the image's width
1032
+ view_width = img_w
1033
+ # The view's height must be calculated from the view's width
1034
+ # to match the window's aspect ratio.
1035
+ view_height = view_width / window_ar
1047
1036
 
1037
+ # Center the view vertically around the image's center
1038
+ self.left = 0
1039
+ self.right = img_w
1040
+ self.bottom = (img_h / 2.0) - (view_height / 2.0)
1041
+ self.top = (img_h / 2.0) + (view_height / 2.0)
1048
1042
 
1049
- else:
1050
1043
 
1051
- self.zoomed_width = imWidth
1052
- self.left = 0
1053
- self.right = self.left + self.zoomed_width
1054
1044
 
1055
- self.zoomed_height = ratioX * self.height()
1056
- #self.zoomed_height = 2*imWidth/self.imAr
1045
+ # These are just for information, not used by glOrtho
1046
+ self.zoomed_width = view_width
1047
+ self.zoomed_height = view_height
1057
1048
 
1058
- self.bottom = imHeight / 2 - (self.zoomed_width / self.windowAR - self.zoomed_height / 2)
1059
- self.top = self.bottom + self.zoomed_height
1060
- #if self.currentWidnowName != 'axial' and self.imType == 't1':
1061
- # self.updateScale( self.width()//2, self.height()//2, 1, 0.5)
1062
1049
  self.halfH = self.height() // 2
1063
- glEnable(GL_NORMALIZE) # light normalization
1050
+ glEnable(GL_NORMALIZE)
1064
1051
 
1065
1052
  def drawImage(self):
1066
1053
 
@@ -1394,6 +1381,7 @@ class GLWidget(QOpenGLWidget):
1394
1381
  def resizeGL(self, width, height):
1395
1382
  if self.imSlice is None:
1396
1383
  return
1384
+ self.UpdatePaintInfo()
1397
1385
  side = min(width, height)
1398
1386
  #Set viewport
1399
1387
  glViewport((width- side) // 2, (height-side) // 2, self.imWidth,
@@ -1613,7 +1601,7 @@ class GLWidget(QOpenGLWidget):
1613
1601
  else:
1614
1602
  self._magic_slice = None
1615
1603
  elif self.enabledCircle:
1616
- # from melage.utils.utils import
1604
+ # from MELAGE.utils.utils import
1617
1605
  if self._NenabledCircle > 0 and self.colorInd != 9876:
1618
1606
 
1619
1607
  self._center_circle = []
@@ -1950,7 +1938,7 @@ class GLWidget(QOpenGLWidget):
1950
1938
  polErase = ConvertPToPolygons(self.erasePoints) # convert to polygons
1951
1939
  self.erasePolygon(polErase)
1952
1940
  elif self.enabledCircle:
1953
- #from melage.utils.utils import
1941
+ #from MELAGE.utils.utils import
1954
1942
  if self._NenabledCircle>0:
1955
1943
 
1956
1944
  self._center_circle=[]
@@ -2077,7 +2065,7 @@ class GLWidget(QOpenGLWidget):
2077
2065
  seg_c = segmented_image[int(yc_mp)-min_whit[0], int(xc_mp)-min_whit[1]]
2078
2066
  (segmented_image-seg_c)
2079
2067
 
2080
- from melage.utils.utils import Threshold_MultiOtsu
2068
+ from MELAGE.utils.utils import Threshold_MultiOtsu
2081
2069
  num_class = 3
2082
2070
 
2083
2071
  ths = Threshold_MultiOtsu(im1, num_class)
@@ -3,7 +3,7 @@ __author__= 'Bahram Jafrasteh'
3
3
  import numpy as np
4
4
  import sys
5
5
  sys.path.append('../')
6
- from melage.graphics import GLViewWidget, GLAxisItem, GLScatterPlotItem, GLGridItem, GLVolumeItem, GLPolygonItem
6
+ from melage.rendering import GLViewWidget, GLAxisItem, GLScatterPlotItem, GLGridItem, GLVolumeItem, GLPolygonItem
7
7
  from OpenGL.GL import *
8
8
  from collections import defaultdict
9
9
  from PyQt5.QtWidgets import QApplication, QWidget, QMenu, QAction, QSlider, QFileDialog