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,146 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ __AUTHOR__ = 'Bahram Jafrasteh'
4
+ Refactored Code: This script has been improved to offer a clearer user
5
+ interface, cleaner code, and more robust logic for mask operations.
6
+ """
7
+ import sys
8
+ from typing import List
9
+
10
+ from PyQt5 import QtCore, QtGui, QtWidgets
11
+ from PyQt5.QtCore import pyqtSignal, Qt
12
+
13
+
14
+ class MaskOperationsDialog(QtWidgets.QDialog):
15
+ """
16
+ A dialog for performing simple arithmetic operations (+, -) between two masks.
17
+ """
18
+ # Emits [view_index, mask1_index, mask2_index, operation_str]
19
+ apply_pressed = pyqtSignal(list)
20
+ closeSig = pyqtSignal()
21
+
22
+ def __init__(self, parent=None):
23
+ super().__init__(parent)
24
+ self.setupUi()
25
+ self.connect_signals()
26
+
27
+ # Ensure the dialog is properly deleted when closed to free memory
28
+ #self.setAttribute(Qt.WA_DeleteOnClose)
29
+
30
+ def setupUi(self):
31
+ """Creates and arranges all the UI widgets."""
32
+ self.setWindowTitle("Mask Operations")
33
+ self.setMinimumSize(450, 150)
34
+
35
+ # --- Main Layout ---
36
+ main_layout = QtWidgets.QVBoxLayout(self)
37
+
38
+ # --- Options Widgets ---
39
+ options_group = QtWidgets.QGroupBox("Operation")
40
+ options_layout = QtWidgets.QHBoxLayout(options_group)
41
+
42
+ self.mask1_combo = QtWidgets.QComboBox()
43
+ self.mask2_combo = QtWidgets.QComboBox()
44
+ self.operation_combo = QtWidgets.QComboBox()
45
+ self.operation_combo.addItems(["+", "-"])
46
+ self.operation_combo.setFixedWidth(50) # Keep the operation box small
47
+
48
+ # Add widgets to the horizontal layout to create the "Mask1 + Mask2" look
49
+ options_layout.addWidget(self.mask1_combo)
50
+ options_layout.addWidget(self.operation_combo)
51
+ options_layout.addWidget(self.mask2_combo)
52
+
53
+ # --- View Selector ---
54
+ view_layout = QtWidgets.QFormLayout()
55
+ self.view_combo = QtWidgets.QComboBox()
56
+ self.view_combo.addItems(["View 1", "View 2"])
57
+ view_layout.addRow("Apply to View:", self.view_combo)
58
+
59
+ # --- Buttons ---
60
+ self.apply_button = QtWidgets.QPushButton("Apply")
61
+ self.apply_button.setDefault(True)
62
+
63
+ # Use a standard button box for consistent button placement (Apply/Cancel)
64
+ button_box = QtWidgets.QDialogButtonBox(
65
+ QtWidgets.QDialogButtonBox.Apply
66
+ )
67
+
68
+ # --- Assemble the Main Layout ---
69
+ main_layout.addLayout(view_layout)
70
+ main_layout.addWidget(options_group)
71
+ main_layout.addStretch() # Add space
72
+ main_layout.addWidget(button_box)
73
+
74
+ def connect_signals(self):
75
+ """Connects widget signals to their corresponding slots."""
76
+ button_box = self.findChild(QtWidgets.QDialogButtonBox)
77
+ button_box.accepted.connect(self.on_apply)
78
+ button_box.rejected.connect(self.reject)
79
+
80
+ def set_color_options(self, mask_names: List[str]):
81
+ """
82
+ Populates both mask selection comboboxes with a list of names.
83
+
84
+ Args:
85
+ mask_names (List[str]): A list of strings representing mask names.
86
+ """
87
+ self.mask1_combo.clear()
88
+ self.mask2_combo.clear()
89
+
90
+ self.mask1_combo.addItems(mask_names)
91
+ self.mask2_combo.addItems(mask_names)
92
+
93
+ @QtCore.pyqtSlot()
94
+ def on_apply(self):
95
+ """
96
+ Gathers user selections, validates them, and emits the result.
97
+ """
98
+ view_index = self.view_combo.currentIndex()
99
+ mask1_index = self.mask1_combo.currentIndex()
100
+ mask2_index = self.mask2_combo.currentIndex()
101
+ operation = self.operation_combo.currentText()
102
+
103
+ # --- Validation ---
104
+ if mask1_index == mask2_index:
105
+ self.show_warning_message(
106
+ "Cannot perform an operation on the same mask. Please select two different masks.")
107
+ return # Stop the process
108
+
109
+ # --- Emit Signal ---
110
+ self.apply_pressed.emit([view_index, mask1_index, mask2_index, operation])
111
+ self.accept() # Close the dialog with an "OK" status
112
+
113
+ def show_warning_message(self, message: str):
114
+ """Displays a non-critical warning message to the user."""
115
+ QtWidgets.QMessageBox.warning(self, "Validation Error", message)
116
+
117
+ def closeEvent(self, event: QtGui.QCloseEvent):
118
+ """Emits a signal when the dialog is closed by the user."""
119
+ self.closeSig.emit()
120
+ super().closeEvent(event)
121
+
122
+
123
+ # --- Example of how to use the dialog ---
124
+ def run_example():
125
+ app = QtWidgets.QApplication(sys.argv)
126
+
127
+ window = MaskOperationsDialog()
128
+
129
+ # Populate the mask options
130
+ available_masks = ["Brain Mask", "Tumor Segmentation", "Ventricles"]
131
+ window.set_mask_options(available_masks)
132
+
133
+ def handle_results(params: list):
134
+ view, idx1, idx2, op = params
135
+ print("Applying operation with the following settings:")
136
+ print(f" - View: {view + 1}")
137
+ print(f" - Formula: {available_masks[idx1]} {op} {available_masks[idx2]}")
138
+
139
+ window.apply_pressed.connect(handle_results)
140
+
141
+ window.show()
142
+ sys.exit(app.exec_())
143
+
144
+
145
+ if __name__ == '__main__':
146
+ run_example()
@@ -0,0 +1,139 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ __AUTHOR__ = 'Bahram Jafrasteh'
4
+ Refactored Code: This script has been cleaned up for better readability,
5
+ simpler UI management, and adherence to modern PyQt practices.
6
+ """
7
+ import sys
8
+ from typing import List
9
+
10
+ from PyQt5 import QtCore, QtGui, QtWidgets
11
+ from PyQt5.QtCore import pyqtSignal
12
+
13
+
14
+ class Masking(QtWidgets.QDialog):
15
+ """
16
+ A dialog to get user choices for applying a segmentation mask.
17
+
18
+ It emits the selected view, color index, and whether to keep or remove
19
+ the masked area.
20
+ """
21
+ # Emits [view_index, color_index, keep_flag]
22
+ apply_pressed = pyqtSignal(list)
23
+ closeSig = pyqtSignal()
24
+
25
+ def __init__(self, parent=None):
26
+ super().__init__(parent)
27
+ self.setupUi()
28
+ self.connect_signals()
29
+
30
+ # Ensure the dialog is properly deleted when closed to free memory
31
+ #self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
32
+
33
+ def setupUi(self):
34
+ """Creates and arranges all the UI widgets."""
35
+ self.setWindowTitle("Apply Mask")
36
+ self.setMinimumSize(400, 150)
37
+
38
+ # --- Main Layout ---
39
+ main_layout = QtWidgets.QVBoxLayout(self)
40
+
41
+ # --- Options Form ---
42
+ options_layout = QtWidgets.QFormLayout()
43
+ options_layout.setContentsMargins(10, 10, 10, 10)
44
+
45
+ # Widget for selecting the view
46
+ self.view_combo = QtWidgets.QComboBox()
47
+ self.view_combo.addItems(["View 1", "View 2"])
48
+
49
+ # Widget for choosing to keep or remove the mask
50
+ self.action_combo = QtWidgets.QComboBox()
51
+ self.action_combo.addItems(["Keep", "Remove"])
52
+
53
+ # Widget for selecting the mask color/label
54
+ self.color_combo = QtWidgets.QComboBox()
55
+
56
+ # Add widgets to the form layout for a clean, aligned look
57
+ options_layout.addRow("View:", self.view_combo)
58
+ options_layout.addRow("Action:", self.action_combo)
59
+ options_layout.addRow("Mask Color:", self.color_combo)
60
+
61
+ # --- Buttons ---
62
+ self.apply_button = QtWidgets.QPushButton("Apply")
63
+ self.apply_button.setDefault(True)
64
+
65
+ # Use a standard button box for consistent button placement
66
+ button_box = QtWidgets.QDialogButtonBox()
67
+ button_box.addButton(self.apply_button, QtWidgets.QDialogButtonBox.AcceptRole)
68
+
69
+ # --- Assemble the Main Layout ---
70
+ main_layout.addLayout(options_layout)
71
+ main_layout.addWidget(button_box)
72
+
73
+ def connect_signals(self):
74
+ """Connects widget signals to their corresponding slots."""
75
+ self.apply_button.clicked.connect(self.on_apply)
76
+
77
+ def set_color_options(self, color_names: List[str]):
78
+ """
79
+ Populates the color selection combobox with a list of names.
80
+
81
+ Args:
82
+ color_names (List[str]): A list of strings representing color or label names.
83
+ """
84
+ self.color_combo.clear()
85
+ self.color_combo.addItems(color_names)
86
+
87
+ @QtCore.pyqtSlot()
88
+ def on_apply(self):
89
+ """
90
+ Gathers user selections and emits them in a signal.
91
+ """
92
+ view_index = self.view_combo.currentIndex()
93
+ color_index = self.color_combo.currentIndex()
94
+
95
+ # Determine if the user chose to keep the mask area
96
+ keep_flag = self.action_combo.currentText().lower() == 'keep'
97
+
98
+ # Emit all selections in a single list
99
+ self.apply_pressed.emit([view_index, color_index, keep_flag])
100
+
101
+ # Optionally close the dialog after applying
102
+ self.accept()
103
+
104
+ def closeEvent(self, event: QtGui.QCloseEvent):
105
+ """Emits a signal when the dialog is closed by the user."""
106
+ self.closeSig.emit()
107
+ super().closeEvent(event)
108
+
109
+
110
+ # --- Example of how to use the dialog ---
111
+ def run_example():
112
+ app = QtWidgets.QApplication(sys.argv)
113
+
114
+ # Create the dialog window
115
+ window = Masking()
116
+
117
+ # Populate the color options
118
+ available_colors = ["Region 1 (Red)", "Region 2 (Green)", "Region 3 (Blue)"]
119
+ window.set_color_options(available_colors)
120
+
121
+ # Define a function to receive the results from the dialog
122
+ def handle_results(params: list):
123
+ view, color, keep = params
124
+ action = "Keep" if keep else "Remove"
125
+ print(f"Applying mask with the following settings:")
126
+ print(f" - View Index: {view}")
127
+ print(f" - Color/Label Index: {color} ({available_colors[color]})")
128
+ print(f" - Action: {action}")
129
+
130
+ # Connect the dialog's signal to our handler function
131
+ window.buttonpressed.connect(handle_results)
132
+
133
+ # Show the dialog
134
+ window.show()
135
+ sys.exit(app.exec_())
136
+
137
+
138
+ if __name__ == '__main__':
139
+ run_example()
@@ -0,0 +1,311 @@
1
+ import sys
2
+ import os
3
+ import ants
4
+ from PyQt5 import QtWidgets, QtCore, QtGui
5
+ from typing import Literal, Optional, Tuple
6
+ #from MELAGE.utils.source_folder import *
7
+ from PyQt5.QtCore import pyqtSignal
8
+ from pathlib import Path
9
+
10
+ MNI_FILE = 'mni_icbm152_t1_tal_nlin_sym_09a_masked.nii.gz'
11
+
12
+ class StreamRedirector(QtCore.QObject):
13
+ textWritten = QtCore.pyqtSignal(str)
14
+
15
+ def write(self, text):
16
+ self.textWritten.emit(str(text))
17
+ # Force the GUI to process events to update the text box in real-time
18
+ QtWidgets.QApplication.processEvents()
19
+
20
+ def flush(self):
21
+ # This flush method is needed for stream-like objects
22
+ pass
23
+
24
+ def run_ants_registration(
25
+ fixed_path: str,
26
+ moving_path: str,
27
+ output_prefix: str,
28
+ transform_type: Literal['Rigid', 'Affine', 'SyN'] = 'SyN'
29
+ ) -> dict:
30
+ """
31
+ Performs image registration using ANTsPy with robust default parameters.
32
+ """
33
+ print("--- Starting ANTs Registration ---")
34
+ print(f"Fixed Image: {fixed_path}")
35
+ print(f"Moving Image: {moving_path}")
36
+ print(f"Transform Type: {transform_type}")
37
+
38
+ fixed_image = ants.image_read(fixed_path, pixeltype='float')
39
+ moving_image = ants.image_read(moving_path, pixeltype='float')
40
+
41
+
42
+ registration = ants.registration(
43
+ fixed=fixed_image,
44
+ moving=moving_image,
45
+ type_of_transform=transform_type,
46
+ outprefix=output_prefix,
47
+ verbose=True
48
+ )
49
+ """
50
+
51
+ registration = ants.registration(
52
+ fixed=fixed_image,
53
+ moving=moving_image,
54
+ type_of_transform=transform_type, # Affine includes Rigid + Affine transformations in one step
55
+ reg_iterations=[1000, 500, 250, 100], # Corresponds to your iterations [1000x500x250x100]
56
+ grad_step=0.01, # Corresponds to the gradient step size [Rigid[0.01], Affine[0.01]]
57
+ aff_sampling=32, # Corresponds to the MI sampling points [1,32,Regular,0.25]
58
+ metric='MI', # Mutual Information
59
+ metric_params=[1, 32], # Matches MI[${file_in_atlas},${file_in_t1},1,32,Regular,0.25]
60
+ smoothing_sigmas=(3, 2, 1, 0), # Smoothing at different resolutions
61
+ shrink_factors=(8, 4, 2, 1), # Downsampling at different resolutions
62
+ transform_parameters=(0.01,), # Corresponds to transform step size for Rigid and Affine
63
+ output_prefix=output_prefix,
64
+ verbose = True
65
+ )
66
+ """
67
+
68
+
69
+ print(f"--- Registration Complete ---")
70
+ file_out = output_prefix+'warped.nii.gz'
71
+ print(f'Transofrmed file {file_out}')
72
+ print(f"Forward Transforms: {registration['fwdtransforms']}")
73
+ ants.image_write(registration['warpedmovout'], file_out)
74
+ return registration, file_out
75
+
76
+
77
+ # --- PyQt5 Frontend (Updated) ---
78
+
79
+ class RegistrationDialog(QtWidgets.QDialog):
80
+ """
81
+ A PyQt5 dialog for performing image-to-image registration using ANTsPy.
82
+ """
83
+ closeSig = pyqtSignal()
84
+ datachange = pyqtSignal()
85
+ def __init__(self, parent=None, source_dir=os.path.expanduser("~")):
86
+ super().__init__(parent)
87
+ self.source_dir = source_dir
88
+ self.fixed_path = None
89
+ self.moving_path = None
90
+ self.output_prefix = None
91
+ #self.mni_template_path = ants.get_ants_data('mni') # Get MNI path once
92
+ self._curent_weight_dir = os.path.dirname(os.path.join(os.getcwd()))
93
+ self._setup_ui()
94
+
95
+ def _setup_ui(self):
96
+ self.setWindowTitle("ANTs Image Registration")
97
+ self.setMinimumSize(650, 250)
98
+ self._create_widgets()
99
+ self._create_layouts()
100
+ self._connect_signals()
101
+
102
+ # Set initial UI state
103
+ self._toggle_mni_template(False)
104
+ self.combobox_methods.setCurrentIndex(2)
105
+
106
+ def _create_widgets(self):
107
+ # --- Updated MNI Template Widgets ---
108
+ self.toggle_log_button = QtWidgets.QPushButton("Show Verbose Output ▶")
109
+ self.toggle_log_button.setCheckable(True)
110
+ self.toggle_log_button.setChecked(False)
111
+ # Style the button to look like a section header
112
+ self.toggle_log_button.setStyleSheet("""
113
+ QPushButton {
114
+ text-align: left; padding: 5px; background-color: #E0E0E0;
115
+ border: 1px solid #C0C0C0; border-radius: 4px;
116
+ color: green; /* Default text color */
117
+ }
118
+ QPushButton:checked {
119
+ background-color: #D0D0D0;
120
+ color: red; /* Text color when button is checked */
121
+ }
122
+ """)
123
+ self.log_stack = QtWidgets.QStackedWidget()
124
+
125
+ self.log_output = QtWidgets.QPlainTextEdit()
126
+ self.log_output.setReadOnly(True)
127
+ self.log_output.setStyleSheet("background-color: #2b2b2b; color: #f0f0f0; font-family: Monospace;")
128
+ self.log_output.setVisible(True)
129
+
130
+ self.check_use_mni = QtWidgets.QCheckBox("Use standard MNI152 template as Fixed Image")
131
+ self.lineEdit_fixed = QtWidgets.QLineEdit()
132
+ self.lineEdit_fixed.setReadOnly(True)
133
+ self.button_fixed = QtWidgets.QPushButton("Browse...")
134
+
135
+ self.label_moving = QtWidgets.QLabel("<b>Moving Image:</b>")
136
+ self.lineEdit_moving = QtWidgets.QLineEdit("Select subject's image...")
137
+ self.lineEdit_moving.setReadOnly(True)
138
+ self.button_moving = QtWidgets.QPushButton("Browse...")
139
+
140
+ self.label_output = QtWidgets.QLabel("<b>Output Prefix:</b>")
141
+ self.lineEdit_output = QtWidgets.QLineEdit("Select output location and prefix...")
142
+ self.lineEdit_output.setReadOnly(True)
143
+ self.button_output = QtWidgets.QPushButton("Save As...")
144
+
145
+ self.label_method = QtWidgets.QLabel("<b>Method:</b>")
146
+ self.combobox_methods = QtWidgets.QComboBox()
147
+ self.combobox_methods.addItems(['Rigid', 'Affine', 'SyN'])
148
+
149
+
150
+ self.button_run = QtWidgets.QPushButton("Run Registration")
151
+ self.button_run.setStyleSheet("background-color: #4CAF50; color: white; font-weight: bold; padding: 5px;")
152
+
153
+
154
+
155
+ def _create_layouts(self):
156
+ main_layout = QtWidgets.QVBoxLayout(self)
157
+ grid_layout = QtWidgets.QGridLayout()
158
+ grid_layout.setSpacing(10)
159
+
160
+ grid_layout.addWidget(self.check_use_mni, 0, 0, 1, 4)
161
+ grid_layout.addWidget(self.lineEdit_fixed, 1, 0, 1, 3)
162
+ grid_layout.addWidget(self.button_fixed, 1, 3)
163
+
164
+ grid_layout.addWidget(self.label_moving, 2, 0)
165
+ grid_layout.addWidget(self.lineEdit_moving, 2, 1, 1, 2)
166
+ grid_layout.addWidget(self.button_moving, 2, 3)
167
+
168
+ grid_layout.addWidget(self.label_output, 3, 0)
169
+ grid_layout.addWidget(self.lineEdit_output, 3, 1, 1, 2)
170
+ grid_layout.addWidget(self.button_output, 3, 3)
171
+
172
+ method_layout = QtWidgets.QHBoxLayout()
173
+ method_layout.addWidget(self.label_method)
174
+ method_layout.addWidget(self.combobox_methods)
175
+ method_layout.addStretch()
176
+ grid_layout.addLayout(method_layout, 4, 1)
177
+
178
+
179
+
180
+ self.log_stack.addWidget(QtWidgets.QWidget()) # Page 0: Empty widget for "collapsed"
181
+ self.log_stack.addWidget(self.log_output) # Page 1: The log viewer
182
+
183
+ # Add components to the main vertical layout
184
+ main_layout.addLayout(grid_layout)
185
+ main_layout.addWidget(self.button_run)
186
+ main_layout.addWidget(self.toggle_log_button) # Add the toggle button
187
+ main_layout.addWidget(self.log_stack)
188
+ main_layout.addStretch(1)
189
+ self.setLayout(main_layout)
190
+
191
+ # This is the new slot that will receive text from the redirector
192
+ @QtCore.pyqtSlot(str)
193
+ def _append_log_text(self, text):
194
+ """Appends text to the log viewer."""
195
+ self.log_output.insertPlainText(text)
196
+ self.log_output.verticalScrollBar().setValue(self.log_output.verticalScrollBar().maximum())
197
+
198
+
199
+ def _connect_signals(self):
200
+ self.toggle_log_button.toggled.connect(self._animate_log_toggle)
201
+ self.button_fixed.clicked.connect(self._browse_fixed)
202
+ self.button_moving.clicked.connect(self._browse_moving)
203
+ self.button_output.clicked.connect(self._browse_output)
204
+ self.button_run.clicked.connect(self._run_registration)
205
+ self.check_use_mni.toggled.connect(self._toggle_mni_template)
206
+
207
+ def _animate_log_toggle(self, checked):
208
+ """Animates the expansion and collapse of the log container."""
209
+ # The animation now targets the container, not the text box itself
210
+ #animation = QtCore.QPropertyAnimation(self.log_container, b"maximumHeight")
211
+ #animation.setDuration(300)
212
+
213
+ if checked:
214
+ self.log_stack.setCurrentIndex(1) # Show log viewer page
215
+ self.toggle_log_button.setText("Hide Progress ▼")
216
+ else:
217
+ self.log_stack.setCurrentIndex(0) # Show empty page
218
+ self.toggle_log_button.setText("Show Progress ▶")
219
+
220
+
221
+ def set_source(self, source_dir):
222
+ self.source_dir = source_dir
223
+
224
+ def _toggle_mni_template(self, checked: bool):
225
+ """Handles using the built-in MNI template."""
226
+ if checked:
227
+ try:
228
+ current_dir = Path(__file__).parent
229
+ project_root = (current_dir / "../").resolve()
230
+ mni_file_path = project_root / "MNI" / MNI_FILE
231
+ self.fixed_path = str(mni_file_path)
232
+ except Exception:
233
+ self.fixed_path = []
234
+ print("Warning: Could not determine model file paths automatically.")
235
+ return
236
+ self.lineEdit_fixed.setText(self.fixed_path)
237
+ self.button_fixed.setEnabled(False)
238
+ else:
239
+ self.fixed_path = None
240
+ self.lineEdit_fixed.setText("Select custom fixed image...")
241
+ self.button_fixed.setEnabled(True)
242
+
243
+
244
+
245
+ def _browse_fixed(self):
246
+ file_path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select Custom Fixed Image", self.source_dir, "NIfTI Files (*.nii *.nii.gz)")
247
+ if file_path:
248
+ self.fixed_path = file_path
249
+ self.lineEdit_fixed.setText(file_path)
250
+ self.source_dir = os.path.dirname(file_path)
251
+
252
+ def _browse_moving(self):
253
+ file_path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select Moving Image", self.source_dir, "NIfTI Files (*.nii *.nii.gz)")
254
+ if file_path:
255
+ self.moving_path = file_path
256
+ self.lineEdit_moving.setText(file_path)
257
+
258
+ def _browse_output(self):
259
+ if self.moving_path:
260
+ moving_name = os.path.basename(self.moving_path).split('.')[0]
261
+ fixed_name = "MNI152" if self.check_use_mni.isChecked() else "CustomFixed"
262
+ default_name = os.path.join(self.source_dir, f"{moving_name}_to_{fixed_name}_")
263
+ else:
264
+ default_name = self.source_dir
265
+ file_path, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Set Output Prefix", default_name, "All Files (*)")
266
+ if file_path:
267
+ self.output_prefix = file_path
268
+ self.lineEdit_output.setText(file_path)
269
+
270
+ def _run_registration(self):
271
+ if not all([self.fixed_path, self.moving_path, self.output_prefix]):
272
+ QtWidgets.QMessageBox.warning(self, "Missing Information", "Please specify fixed, moving, and output files.")
273
+ return
274
+ self.toggle_log_button.setChecked(True)
275
+ # Clear the log viewer before starting
276
+ self.log_output.clear()
277
+
278
+ transform_type = self.combobox_methods.currentText()
279
+
280
+ redirector = StreamRedirector()
281
+ redirector.textWritten.connect(self._append_log_text)
282
+ original_stdout = sys.stdout
283
+ sys.stdout = redirector
284
+
285
+ try:
286
+ self.button_run.setEnabled(False)
287
+ self.button_run.setText("Registration in progress...")
288
+ QtWidgets.QApplication.processEvents()
289
+
290
+ reg_results, file_out = run_ants_registration(
291
+ fixed_path=self.fixed_path, moving_path=self.moving_path,
292
+ output_prefix=self.output_prefix, transform_type=transform_type,
293
+ )
294
+
295
+ QtWidgets.QMessageBox.information(
296
+ self, "Success", f"Registration complete! Warped image saved to:\n{file_out}"
297
+ )
298
+ except Exception as e:
299
+ # Also print the error to the log viewer
300
+ print(f"\n--- CRITICAL ERROR ---\n{str(e)}")
301
+ QtWidgets.QMessageBox.critical(self, "Error", f"An error occurred:\n{str(e)}")
302
+ finally:
303
+ sys.stdout = original_stdout
304
+ self.button_run.setEnabled(True)
305
+ self.button_run.setText("Run Registration")
306
+
307
+ if __name__ == '__main__':
308
+ app = QtWidgets.QApplication(sys.argv)
309
+ dialog = RegistrationDialog()
310
+ dialog.show()
311
+ sys.exit(app.exec_())
@@ -7,7 +7,7 @@ from PyQt5.QtCore import Qt
7
7
  from PyQt5.QtCore import pyqtSignal
8
8
  import random
9
9
  import matplotlib
10
- from melage.widgets.HistImage import FigureCanvas
10
+ from melage.dialogs import FigureCanvas
11
11
  matplotlib.use('Agg')
12
12
 
13
13
 
@@ -130,7 +130,7 @@ class ThresholdingImage(QDialog):
130
130
 
131
131
  self._a = a
132
132
  numc = self._number_class.currentIndex()+2
133
- from utils.utils import Threshold_MultiOtsu
133
+ from melage.utils.utils import Threshold_MultiOtsu
134
134
  thresholds = Threshold_MultiOtsu(a, numc)
135
135
  return thresholds
136
136