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,197 @@
1
+ import numpy as np
2
+ from PyQt5.QtWidgets import QMessageBox
3
+ from melage.widgets import MelagePlugin
4
+ from melage.dialogs.dynamic_gui import DynamicDialog
5
+ from .change_coord_schema import get_schema
6
+ from PyQt5.QtCore import Qt
7
+ from PyQt5.QtCore import pyqtSignal
8
+ from .main.utils import changeCoordSystem
9
+ # --- THE LOGIC CLASS ---
10
+ class ChangeCoordLogic(DynamicDialog):
11
+ """
12
+ This class handles the BRAIN of the WarpSeg tool.
13
+ The LOOKS are handled automatically by DynamicDialog + Schema.
14
+ """
15
+ completed = pyqtSignal(object)
16
+ AXIS_GROUPS = [
17
+ {'R', 'L'},
18
+ {'A', 'P'},
19
+ {'S', 'I'}
20
+ ]
21
+ ALL_OPTIONS = ['R', 'L', 'A', 'P', 'S', 'I']
22
+
23
+ def __init__(self, data_context,parent=None):
24
+ # 1. Initialize DynamicDialog with the Schema
25
+ # This single line builds the entire window!
26
+
27
+ super().__init__(parent)
28
+ self.create_main_ui(schema=get_schema(), default_items=False)
29
+ self.setAttribute(Qt.WA_DeleteOnClose)
30
+ self.data_context = data_context
31
+
32
+ # 2. AUTOMATICALLY WIDGET BINDING
33
+ # Iterate over all widgets created by the schema and bind them to 'self'.
34
+ for widget_id, widget_obj in self.widgets.items():
35
+ setattr(self, widget_id, widget_obj)
36
+
37
+ # 3. GENERAL PURPOSE SIGNAL CONNECTION (Auto-Connect)
38
+ # Instead of a hardcoded dictionary, we iterate through every widget from the schema
39
+ # and look for a matching method in this class named: on_<ID>_<Signal>
40
+ # This works for ANY schema changes automatically.
41
+ supported_signals = [
42
+ "clicked", "toggled", "currentIndexChanged",
43
+ "textChanged", "valueChanged"
44
+ ]
45
+
46
+ for widget_id, widget_obj in self.widgets.items():
47
+ for signal_name in supported_signals:
48
+ # 1. Check if the widget has this signal (e.g., Button has 'clicked')
49
+ if hasattr(widget_obj, signal_name):
50
+ # 2. Check if WE have a handler method (e.g., 'on_btn_apply_clicked')
51
+ handler_name = f"on_{widget_id}_{signal_name}"
52
+ if hasattr(self, handler_name):
53
+ # 3. Connect them!
54
+ signal = getattr(widget_obj, signal_name)
55
+ handler = getattr(self, handler_name)
56
+ # Disconnect first to be safe (idempotent), then connect
57
+ try:
58
+ signal.disconnect(handler)
59
+ except TypeError:
60
+ pass
61
+ signal.connect(handler)
62
+ # print(f"Auto-connected: {widget_id}.{signal_name} -> {handler_name}")
63
+ self.update_2nd_combo()
64
+
65
+ @property
66
+ def ui_schema(self):
67
+ # We call the function to get the dictionary
68
+ return get_schema()
69
+
70
+ def get_axis_group(self, letter):
71
+ """Helper: Returns the set containing the letter (e.g., 'R' -> {'R', 'L'})"""
72
+ for group in self.AXIS_GROUPS:
73
+ if letter in group:
74
+ return group
75
+ return set()
76
+
77
+ def update_2nd_combo(self):
78
+ """
79
+ Filters Combo 2 based on Combo 1 selection.
80
+ """
81
+ selection_1 = self.combo_1st.currentText()
82
+ forbidden_group = self.get_axis_group(selection_1)
83
+
84
+ # Calculate allowed options for 2nd box
85
+ # Logic: All Options MINUS the axis used in box 1
86
+ allowed = [opt for opt in self.ALL_OPTIONS if opt not in forbidden_group]
87
+
88
+ # Repopulate 2nd Combo
89
+ self._repopulate_combo(self.combo_2nd, allowed)
90
+
91
+ # Force update of 3rd combo because 2nd changed
92
+ self.update_3rd_combo()
93
+
94
+ def update_3rd_combo(self):
95
+ """
96
+ Filters Combo 3 based on Combo 1 AND Combo 2 selection.
97
+ """
98
+ selection_1 = self.combo_1st.currentText()
99
+ selection_2 = self.combo_2nd.currentText()
100
+
101
+ group_1 = self.get_axis_group(selection_1)
102
+ group_2 = self.get_axis_group(selection_2)
103
+
104
+ # Calculate allowed options for 3rd box
105
+ # Logic: All Options MINUS axis 1 MINUS axis 2
106
+ allowed = [
107
+ opt for opt in self.ALL_OPTIONS
108
+ if opt not in group_1 and opt not in group_2
109
+ ]
110
+
111
+ # Repopulate 3rd Combo
112
+ self._repopulate_combo(self.combo_3rd, allowed)
113
+
114
+ def _repopulate_combo(self, combo_widget, allowed_options):
115
+ """
116
+ Safely updates items while trying to preserve the current selection.
117
+ """
118
+ current_val = combo_widget.currentText()
119
+
120
+ # Block signals to prevent infinite recursion loops during update
121
+ combo_widget.blockSignals(True)
122
+ combo_widget.clear()
123
+ combo_widget.addItems(allowed_options)
124
+
125
+ # Try to restore previous selection, otherwise pick index 0
126
+ index = combo_widget.findText(current_val)
127
+ if index >= 0:
128
+ combo_widget.setCurrentIndex(index)
129
+ else:
130
+ combo_widget.setCurrentIndex(0)
131
+
132
+ combo_widget.blockSignals(False)
133
+
134
+ # Renamed from 'run_process' to match the schema ID 'btn_apply'
135
+ def on_btn_apply_clicked(self):
136
+ view = self.combo_view.currentText()
137
+ data_view = self.data_context[view]
138
+ if data_view is None:
139
+ QMessageBox.information(self, "Error", "No image data available for the selected view.")
140
+ return
141
+
142
+ try:
143
+ """The main execution function."""
144
+ self.progress_bar.setValue(10)
145
+
146
+ data = data_view.get_fdata().copy()
147
+ if len(data.shape)<=1:
148
+ raise ValueError("Input image must be at least 2D NIfTI.")
149
+
150
+ el_1 = self.combo_1st.currentText()
151
+ el_2 = self.combo_2nd.currentText()
152
+ el_3 = self.combo_3rd.currentText()
153
+ target = f"{el_1}{el_2}{el_3}"
154
+ used_axes = [self.get_axis_group(x) for x in [el_1, el_2, el_3]]
155
+ unique_axes = set(tuple(s) for s in used_axes)
156
+
157
+ if len(unique_axes) != 3:
158
+ raise ValueError(f"Invalid orientation {target}. Axes must be orthogonal.")
159
+ if np.unique([el_1, el_2, el_3]).shape[0]!=3:
160
+ QMessageBox.information(self, "INVALID COORDINATION SYSTEM", f"{target} is not a valid coorrdiantion system")
161
+ self.progress_bar.setValue(0)
162
+ return
163
+ im = changeCoordSystem(im=data_view, target=target)
164
+ result_package = {
165
+ "image": im.get_fdata(),
166
+ "affine": im.affine,
167
+ "label": np.zeros_like(im.get_fdata()),
168
+ "view": view
169
+ }
170
+ self.completed.emit(result_package)
171
+ self.progress_bar.setValue(100)
172
+ #QMessageBox.information(self, "Done", "Segmentation Complete")
173
+
174
+ except Exception as e:
175
+ QMessageBox.information(self, "Error", f"{e}")
176
+ self.progress_bar.setValue(0)
177
+
178
+ def on_context_action(self, text, widget):
179
+ """Handle the Right-Click Context Menu defined in schema"""
180
+ if text == "Reset Adult Options":
181
+ # Access radio button directly by ID
182
+ self.radio_adult_whole.setChecked(True)
183
+ print("Options reset.")
184
+
185
+
186
+ # --- THE PLUGIN WRAPPER ---
187
+ class ChangeCoordPlugin(MelagePlugin):
188
+ @property
189
+ def name(self) -> str: return "Change Coord Sys."
190
+
191
+ @property
192
+ def category(self) -> str: return "Basic"
193
+
194
+
195
+ def get_widget(self, data_context =None,parent=None):
196
+ logic = ChangeCoordLogic(data_context, parent)
197
+ return logic
@@ -0,0 +1,31 @@
1
+
2
+ from ..ui_helpers import Label, Combo, Check, Radio, Group, Button, Progress, HBox, FilePicker, SpinBox, Reference
3
+
4
+ # The simplified schema using helper functions.
5
+ # The main layout defaults to 'vbox', so items stack automatically.
6
+ def get_schema():
7
+ UI_SCHEMA = {
8
+ "title": "Enhanced spatial Fuzzy C-Means algorithm ...",
9
+ "min_width": 500,
10
+ "layout": "vbox",
11
+ "items": [
12
+ #Label(id="lbl_model_info", text="Model Info: Ready for Ifant brain segmentation"),
13
+ Reference(
14
+ "<b>Jafrasteh et al. (2024)</b>. <i>'Enhanced Spatial Fuzzy C-Means...'</i>. "
15
+ '<a href="https://link.springer.com/article/10.1007/s12021-024-09661-x">(paper)</a>'
16
+
17
+ ),
18
+ Group(id="group_mode", layout="hbox", title="Destination",children=[
19
+ Combo(id="combo_1st", label="", options=["R", "L", "P", "A", "I", "S"], default="R", function_name="update_2nd_combo"),
20
+ Combo(id="combo_2nd", label="", options=["R", "L", "P", "A", "I", "S"], default="A", function_name="update_3rd_combo"),
21
+ Combo(id="combo_3rd", label="", options=["R", "L", "P", "A", "I", "S"], default="S"),
22
+ ]),
23
+
24
+ HBox([
25
+ Progress(id="progress_bar"),
26
+ Button(id="btn_apply", text="Apply", default=True)
27
+ ])
28
+
29
+ ]
30
+ }
31
+ return UI_SCHEMA
@@ -0,0 +1,15 @@
1
+ from melage.utils.utils import convert_to_ras
2
+ import nibabel as nib
3
+ def changeCoordSystem(im, target):
4
+ """
5
+ Changing coordinate system of image
6
+ :param target:
7
+ :return:
8
+ """
9
+ previous_affine = im.affine
10
+ previous_header = im.header
11
+ transform, source_system = convert_to_ras(im.affine, target=target)
12
+ if source_system == target:
13
+ return im
14
+ im = im.as_reoriented(transform)
15
+ return nib.Nifti1Image(im.get_fdata(),affine=previous_affine, header=previous_header)
@@ -1,8 +1,6 @@
1
1
  import numpy as np
2
2
 
3
- from melage.widgets.Segmentation.utils import BiasCorrection
4
- from melage.widgets.Segmentation.utils import create_window_3D, ssim3D
5
- from melage.widgets.Segmentation.utils import LargestCC, \
3
+ from .utils import BiasCorrection, create_window_3D, ssim3D, LargestCC, \
6
4
  update_according_to_neighbours_conv, neighborhood_conv, axis_based_convolution, adjust_common_structures, \
7
5
  compute_sdf, rescale_between_a_b
8
6
  from sklearn.preprocessing import PolynomialFeatures
@@ -311,11 +309,11 @@ class esFCM(FCM):
311
309
  if fast_method:
312
310
  if self._is2D:
313
311
  cost_ssim, ssim_map = ssim(s1.squeeze() / s1.max(), s2.squeeze() / s2.max(), full=True,
314
- win_size=11)
312
+ win_size=11, data_range=1)
315
313
  ssim_map = np.expand_dims(ssim_map, np.where(self._imdim)[0][0])
316
314
  else:
317
315
  cost_ssim, ssim_map = ssim(s1 / s1.max(), s2 / s2.max(), full=True,
318
- win_size=11)
316
+ win_size=11, data_range=1)
319
317
  else: # faster
320
318
  ssim_map = ssim3D(s1 / s1.max(), s2 / s2.max(), self.window,
321
319
  self.window.shape[-1], 1, contrast=False)
@@ -0,0 +1,57 @@
1
+ from .FCM import esFCM, FCM, FCM_pure
2
+ from .utils import remove_zero
3
+ import numpy as np
4
+ def get_inference(model_name, progressBar, im, affine, num_tissues, post_correction, max_iter):
5
+ if affine is None:
6
+ affine = np.eye(4) # put identity if affine is None
7
+ use_ssim = True
8
+ padding = 0
9
+ image_range = 1000
10
+ tissue_labels = None
11
+ fuzziness = 3
12
+ constraint = False
13
+ InitMethod = 'otsu'
14
+ if num_tissues > 3 and not constraint:
15
+ post_correction = False
16
+ InitMethod = "kmeans"
17
+
18
+ epsilon = 5e-3
19
+ shape_init = im.shape
20
+ image_used, pad_zero = remove_zero(im, 0)
21
+ if model_name.lower() == 'esfcm':
22
+
23
+ model = esFCM(image_used, affine,
24
+ image_range, num_tissues, fuzziness,
25
+ epsilon=epsilon, max_iter=max_iter,
26
+ padding=padding,
27
+ tissuelabels=tissue_labels,
28
+ mask=image_used > 0, use_ssim=use_ssim)
29
+ try:
30
+ model.initialize_fcm(initialization_method=InitMethod)
31
+ except:
32
+ model.initialize_fcm(initialization_method='kmeans')
33
+
34
+ model.fit(progressBar)
35
+ seg1 = model.predict(use_softmax=True).astype('int')
36
+ seg_init2 = np.zeros(shape_init)
37
+ seg_init2[pad_zero[0][0]:pad_zero[0][1] + 1, pad_zero[1][0]:pad_zero[1][1] + 1,
38
+ pad_zero[2][0]:pad_zero[2][1] + 1] = seg1
39
+ return seg_init2
40
+
41
+ elif model_name.lower() == 'fcm':
42
+ from melage.core.Segmentation.FCM import FCM_pure as FCM
43
+
44
+ model = FCM(image_used, affine, None,
45
+ image_range, num_tissues, fuzziness,
46
+ epsilon=epsilon, max_iter=max_iter,
47
+ padding=padding, constraint=False, post_correction=post_correction, mask=image_used > 0)
48
+ try:
49
+ model.initialize_fcm(initialization_method=InitMethod)
50
+ except:
51
+ model.initialize_fcm(initialization_method='kmeans')
52
+ model.fit(progressBar)
53
+ seg1 = model.predict(use_softmax=True).astype('int')
54
+ seg_init2 = np.zeros(shape_init)
55
+ seg_init2[pad_zero[0][0]:pad_zero[0][1] + 1, pad_zero[1][0]:pad_zero[1][1] + 1,
56
+ pad_zero[2][0]:pad_zero[2][1] + 1] = seg1
57
+ return seg_init2
@@ -12,6 +12,26 @@ from scipy.ndimage import binary_fill_holes
12
12
  from scipy.ndimage import distance_transform_edt as edistance
13
13
  from scipy.ndimage import distance_transform_cdt as chdistance
14
14
 
15
+ def remove_zero(f_data, value=0):
16
+ """
17
+ Remove non segmented areas from image
18
+ :param f_data:
19
+ :param value:
20
+ :return:
21
+ """
22
+
23
+ xs, ys, zs = np.where(f_data > value) # find zero values
24
+ tol = 4
25
+
26
+ min_max = []
27
+ for x in [xs, ys, zs]:
28
+ minx = min(x) - tol if min(x) - tol > 1 else min(x)
29
+ maxx = max(x) + tol if max(x) + tol < f_data.shape[0] - 1 else max(x)
30
+ min_max.append([minx, maxx])
31
+ f_data = f_data[min_max[0][0]:min_max[0][1] + 1, min_max[1][0]:min_max[1][1] + 1, min_max[2][0]:min_max[2][1] + 1]
32
+
33
+ return f_data, min_max
34
+
15
35
  def compute_sdf(segmentation, distance_use='edt', bounded=True):
16
36
  """BY B
17
37
  compute the signed distance map of binary mask
@@ -0,0 +1,124 @@
1
+ from PyQt5.QtWidgets import QMessageBox
2
+ from melage.widgets import MelagePlugin
3
+ from melage.dialogs.dynamic_gui import DynamicDialog
4
+ from .tissue_segmentation_schema import get_schema
5
+ from PyQt5 import QtWidgets
6
+ from .main.test import get_inference
7
+ import torch
8
+ from PyQt5.QtCore import Qt
9
+ from melage.config import settings
10
+ import os
11
+ from PyQt5.QtCore import pyqtSignal
12
+ # --- THE LOGIC CLASS ---
13
+ class esFCMLogic(DynamicDialog):
14
+ """
15
+ This class handles the BRAIN of the WarpSeg tool.
16
+ The LOOKS are handled automatically by DynamicDialog + Schema.
17
+ """
18
+ completed = pyqtSignal(object)
19
+ def __init__(self, data_context,parent=None):
20
+ # 1. Initialize DynamicDialog with the Schema
21
+ # This single line builds the entire window!
22
+
23
+ super().__init__(parent)
24
+ self.create_main_ui(schema=get_schema(), default_items=False)
25
+ self.setAttribute(Qt.WA_DeleteOnClose)
26
+ self.data_context = data_context
27
+
28
+ # 2. AUTOMATICALLY WIDGET BINDING
29
+ # Iterate over all widgets created by the schema and bind them to 'self'.
30
+ for widget_id, widget_obj in self.widgets.items():
31
+ setattr(self, widget_id, widget_obj)
32
+
33
+ # 3. GENERAL PURPOSE SIGNAL CONNECTION (Auto-Connect)
34
+ # Instead of a hardcoded dictionary, we iterate through every widget from the schema
35
+ # and look for a matching method in this class named: on_<ID>_<Signal>
36
+ # This works for ANY schema changes automatically.
37
+ supported_signals = [
38
+ "clicked", "toggled", "currentIndexChanged",
39
+ "textChanged", "valueChanged"
40
+ ]
41
+
42
+ for widget_id, widget_obj in self.widgets.items():
43
+ for signal_name in supported_signals:
44
+ # 1. Check if the widget has this signal (e.g., Button has 'clicked')
45
+ if hasattr(widget_obj, signal_name):
46
+ # 2. Check if WE have a handler method (e.g., 'on_btn_apply_clicked')
47
+ handler_name = f"on_{widget_id}_{signal_name}"
48
+ if hasattr(self, handler_name):
49
+ # 3. Connect them!
50
+ signal = getattr(widget_obj, signal_name)
51
+ handler = getattr(self, handler_name)
52
+ # Disconnect first to be safe (idempotent), then connect
53
+ try:
54
+ signal.disconnect(handler)
55
+ except TypeError:
56
+ pass
57
+ signal.connect(handler)
58
+ # print(f"Auto-connected: {widget_id}.{signal_name} -> {handler_name}")
59
+
60
+
61
+ @property
62
+ def ui_schema(self):
63
+ # We call the function to get the dictionary
64
+ return get_schema()
65
+
66
+
67
+
68
+
69
+ # Renamed from 'run_process' to match the schema ID 'btn_apply'
70
+ def on_btn_apply_clicked(self):
71
+ view = self.combo_view.currentText()
72
+ data_view = self.data_context[view]
73
+ if data_view is None:
74
+ QMessageBox.information(self, "Error", "No image data available for the selected view.")
75
+ return
76
+
77
+ try:
78
+ """The main execution function."""
79
+ self.progress_bar.setValue(10)
80
+
81
+ data = data_view.get_fdata().copy()
82
+ if len(data.shape)<=1:
83
+ raise ValueError("Input image must be at least 2D NIfTI.")
84
+
85
+ model_name = self.combo_method.currentText()
86
+ num_tissues = int(self.spin_num_classes.value())
87
+ max_iter = int(self.spin_max_iter.value())
88
+ seg = get_inference(model_name, self.progress_bar, data, affine=None, num_tissues=num_tissues,
89
+ post_correction=True, max_iter=max_iter)
90
+ seg = seg.astype('int')
91
+ result_package = {
92
+ "image": None,
93
+ "label": seg,
94
+ "view": view
95
+ }
96
+ self.completed.emit(result_package)
97
+ self.progress_bar.setValue(100)
98
+ #QMessageBox.information(self, "Done", "Segmentation Complete")
99
+
100
+ except Exception as e:
101
+ QMessageBox.information(self, "Error", f"{e}")
102
+ self.progress_bar.setValue(0)
103
+
104
+ def on_context_action(self, text, widget):
105
+ """Handle the Right-Click Context Menu defined in schema"""
106
+ if text == "Reset Adult Options":
107
+ # Access radio button directly by ID
108
+ self.radio_adult_whole.setChecked(True)
109
+ print("Options reset.")
110
+
111
+
112
+ # --- THE PLUGIN WRAPPER ---
113
+ class WarpSegPlugin(MelagePlugin):
114
+ @property
115
+ def name(self) -> str: return "FCM"
116
+
117
+ @property
118
+ def category(self) -> str: return "UnSupervised Segmentation"
119
+
120
+
121
+ def get_widget(self, data_context =None,parent=None):
122
+ logic = esFCMLogic(data_context, parent)
123
+
124
+ return logic
@@ -0,0 +1,33 @@
1
+
2
+ from ..ui_helpers import Label, Combo, Check, Radio, Group, Button, Progress, HBox, FilePicker, SpinBox, Reference
3
+
4
+ # The simplified schema using helper functions.
5
+ # The main layout defaults to 'vbox', so items stack automatically.
6
+ def get_schema():
7
+ UI_SCHEMA = {
8
+ "title": "Enhanced spatial Fuzzy C-Means algorithm ...",
9
+ "min_width": 500,
10
+ "layout": "vbox",
11
+ "items": [
12
+ #Label(id="lbl_model_info", text="Model Info: Ready for Ifant brain segmentation"),
13
+ Reference(
14
+ "<b>Jafrasteh et al. (2024)</b>. <i>'Enhanced Spatial Fuzzy C-Means...'</i>. "
15
+ '<a href="https://link.springer.com/article/10.1007/s12021-024-09661-x">(paper)</a>'
16
+
17
+ ),
18
+ Combo(id="combo_method", label="Select Method:", options=["esFCM", "FCM"]),
19
+ Group(id="group_mode", layout="hbox", children=[
20
+ SpinBox(id="spin_num_classes", label="Number of classes:", value=3, min_val=2, max_val=50,
21
+ step=1, decimals=0),
22
+ SpinBox(id="spin_max_iter", label="Max No of Iter:", value=50, min_val=2, max_val=500,
23
+ step=1, decimals=0),
24
+ ]),
25
+
26
+ HBox([
27
+ Progress(id="progress_bar"),
28
+ Button(id="btn_apply", text="Apply", default=True)
29
+ ])
30
+
31
+ ]
32
+ }
33
+ return UI_SCHEMA
@@ -0,0 +1,115 @@
1
+ import numpy as np
2
+ from PyQt5.QtWidgets import QMessageBox
3
+ from melage.widgets import MelagePlugin
4
+ from melage.dialogs.dynamic_gui import DynamicDialog
5
+ from .mo_schema import get_schema
6
+ from PyQt5.QtCore import Qt
7
+ from PyQt5.QtCore import pyqtSignal
8
+ import SimpleITK as sitk
9
+
10
+
11
+
12
+ #from .main.utils import changeCoordSystem
13
+ # --- THE LOGIC CLASS ---
14
+ class MainLogic(DynamicDialog):
15
+ """
16
+ This class handles the BRAIN of the WarpSeg tool.
17
+ The LOOKS are handled automatically by DynamicDialog + Schema.
18
+ """
19
+ completed = pyqtSignal(object)
20
+
21
+
22
+ def __init__(self, data_context,parent=None):
23
+ # 1. Initialize DynamicDialog with the Schema
24
+ # This single line builds the entire window!
25
+
26
+ super().__init__(parent)
27
+ self.create_main_ui(schema=get_schema(), default_items=False)
28
+ self.setAttribute(Qt.WA_DeleteOnClose)
29
+ self.data_context = data_context
30
+
31
+ # 2. AUTOMATICALLY WIDGET BINDING
32
+ # Iterate over all widgets created by the schema and bind them to 'self'.
33
+ for widget_id, widget_obj in self.widgets.items():
34
+ setattr(self, widget_id, widget_obj)
35
+
36
+ # 3. GENERAL PURPOSE SIGNAL CONNECTION (Auto-Connect)
37
+ # Instead of a hardcoded dictionary, we iterate through every widget from the schema
38
+ # and look for a matching method in this class named: on_<ID>_<Signal>
39
+ # This works for ANY schema changes automatically.
40
+ supported_signals = [
41
+ "clicked", "toggled", "currentIndexChanged",
42
+ "textChanged", "valueChanged"
43
+ ]
44
+
45
+ for widget_id, widget_obj in self.widgets.items():
46
+ for signal_name in supported_signals:
47
+ # 1. Check if the widget has this signal (e.g., Button has 'clicked')
48
+ if hasattr(widget_obj, signal_name):
49
+ # 2. Check if WE have a handler method (e.g., 'on_btn_apply_clicked')
50
+ handler_name = f"on_{widget_id}_{signal_name}"
51
+ if hasattr(self, handler_name):
52
+ # 3. Connect them!
53
+ signal = getattr(widget_obj, signal_name)
54
+ handler = getattr(self, handler_name)
55
+ # Disconnect first to be safe (idempotent), then connect
56
+ try:
57
+ signal.disconnect(handler)
58
+ except TypeError:
59
+ pass
60
+ signal.connect(handler)
61
+ # print(f"Auto-connected: {widget_id}.{signal_name} -> {handler_name}")
62
+
63
+
64
+ @property
65
+ def ui_schema(self):
66
+ # We call the function to get the dictionary
67
+ return get_schema()
68
+
69
+
70
+ # Renamed from 'run_process' to match the schema ID 'btn_apply'
71
+ def on_btn_apply_clicked(self):
72
+ view = self.combo_view.currentText()
73
+ data_view = self.data_context[view]
74
+ if data_view is None:
75
+ QMessageBox.information(self, "Error", "No image data available for the selected view.")
76
+ return
77
+
78
+ try:
79
+ """The main execution function."""
80
+ self.progress_bar.setValue(0)
81
+ max_iters = int(self.iteration.value())
82
+ numberFittingLevels = int((self.fit_lvl.value()))
83
+ shrinkFactor = int((self.shrink_fct.value()))
84
+ status_otsu = self.check_otsu.isChecked()
85
+ im = N4_bias_correction(data_view, use_otsu=status_otsu, shrinkFactor=shrinkFactor,
86
+ numberFittingLevels=numberFittingLevels, max_iter=max_iters)
87
+ result_package = {
88
+ "image": im.get_fdata(),
89
+ "affine": im.affine,
90
+ "label": np.zeros_like(im.get_fdata()),
91
+ "view": view
92
+ }
93
+ self.completed.emit(result_package)
94
+ self.progress_bar.setValue(100)
95
+ #QMessageBox.information(self, "Done", "Segmentation Complete")
96
+
97
+ except Exception as e:
98
+ QMessageBox.information(self, "Error", f"{e}")
99
+ self.progress_bar.setValue(0)
100
+
101
+
102
+
103
+
104
+ # --- THE PLUGIN WRAPPER ---
105
+ class AuxPlugin(MelagePlugin):
106
+ @property
107
+ def name(self) -> str: return "Masking Operation"
108
+
109
+ @property
110
+ def category(self) -> str: return "Basic"
111
+
112
+
113
+ def get_widget(self, data_context =None,parent=None):
114
+ logic = MainLogic(data_context, parent)
115
+ return logic
@@ -0,0 +1,33 @@
1
+
2
+ from ..ui_helpers import Label, Combo, Check, Radio, Group, Button, Progress, HBox, FilePicker, SpinBox, Reference
3
+
4
+ # The simplified schema using helper functions.
5
+ # The main layout defaults to 'vbox', so items stack automatically.
6
+ def get_schema():
7
+
8
+
9
+ UI_SCHEMA = {
10
+ "title": "N4 Bias Field Correction",
11
+ "min_width": 310,
12
+ "layout": "vbox",
13
+ "items": [
14
+
15
+
16
+
17
+ Group(id="group_mode", layout="hbox", title="Operation",children=[
18
+ Combo(id="combo_1", label="Label 1", options=[],),
19
+ Combo(id="combo_operation", label="", options=["/", "*", "-", "+"], default="+"),
20
+ Combo(id="combo_2", label="Label 2", options=[]),
21
+ ]),
22
+
23
+
24
+
25
+
26
+ # --- Bottom Row: Progress + Apply ---
27
+ HBox(children=[
28
+ Progress(id="progress_bar"),
29
+ Button(id="btn_apply", text="Apply", default=True)
30
+ ])
31
+ ]
32
+ }
33
+ return UI_SCHEMA