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,267 @@
1
+ import numpy as np
2
+ from skimage.measure import label as label_connector
3
+ import nibabel as nib
4
+ import SimpleITK as sitk
5
+
6
+ def createPathData_IXI():
7
+ return
8
+ def creaePathData_LDM_fullhead():
9
+ return
10
+
11
+ code_direction = (('L', 'R'), ('P', 'A'), ('I', 'S'))
12
+
13
+ def read_atlas_file(atlas_file, printing=False, save_again=False):
14
+ im = nib.load(atlas_file)
15
+ if im.ndim == 4 and im.shape[-1]==1:
16
+ im = nib.funcs.four_to_three(im)[0]
17
+ orig_orient = nib.io_orientation(im.affine)
18
+ code_direction = (('L', 'R'), ('P', 'A'), ('I', 'S'))
19
+ source_system = ''.join(list(aff2axcodes(im.affine, code_direction)))
20
+ if source_system != 'RAS':
21
+ print(f'converted to RAS {atlas_file}')
22
+ target_orient = axcodes2ornt('RAS', code_direction)
23
+ transform = ornt_transform(orig_orient, target_orient)
24
+ im = im.as_reoriented(transform)
25
+ if save_again:
26
+ im.to_filename(atlas_file)
27
+
28
+ if printing:
29
+ print('{} with range {:.2f}, {:.2f}'.format(atlas_file, im.get_fdata().min(), im.get_fdata().max()))
30
+ #atlas_ims[..., r] = im.get_fdata().copy()
31
+ return im
32
+
33
+
34
+ def read_sitk_as_nib(sitk_im):
35
+ return nib.Nifti1Image(sitk.GetArrayFromImage(sitk_im).transpose(),
36
+ make_affine(sitk_im), None)
37
+
38
+
39
+ def make_affine(simpleITKImage):
40
+ # https://niftynet.readthedocs.io/en/v0.2.1/_modules/niftynet/io/simple_itk_as_nibabel.html
41
+ # get affine transform in LPS
42
+ if simpleITKImage.GetDimension() == 4:
43
+ c = [simpleITKImage.TransformContinuousIndexToPhysicalPoint(p)
44
+ for p in ((1, 0, 0, 0),
45
+ (0, 1, 0, 0),
46
+ (0, 0, 1, 0),
47
+ (0, 0, 0, 0))]
48
+ c = np.array(c)
49
+ c = c[:, :-1]
50
+ elif simpleITKImage.GetDimension() == 3:
51
+ c = [simpleITKImage.TransformContinuousIndexToPhysicalPoint(p)
52
+ for p in ((1, 0, 0),
53
+ (0, 1, 0),
54
+ (0, 0, 1),
55
+ (0, 0, 0))]
56
+ c = np.array(c)
57
+ affine = np.concatenate([
58
+ np.concatenate([c[0:3] - c[3:], c[3:]], axis=0),
59
+ [[0.], [0.], [0.], [1.]]
60
+ ], axis=1)
61
+ affine = np.transpose(affine)
62
+ # convert to RAS to match nibabel
63
+ affine = np.matmul(np.diag([-1., -1., 1., 1.]), affine)
64
+ return affine
65
+
66
+ def resample_to_size(im, new_size=None, method='linear',scale_factor=None):
67
+ original_image = read_nib_as_sitk(im)
68
+ # Get the current size of the image
69
+ size = original_image.GetSize()
70
+ spacing = original_image.GetSpacing()
71
+ # Calculate the scale factor for resizing
72
+ if scale_factor is not None:
73
+ # Compute new size if scale_factor is provided
74
+ new_size = [int(round(orig_sz * sf)) for orig_sz, sf in zip(size, scale_factor)]
75
+ scale_factor = [orig_sp / sf for orig_sp, sf in zip(spacing, scale_factor)]
76
+ else:
77
+ scale_factor = [(float(sz)/new_sz)*spc for sz, new_sz, spc in zip(size, new_size, original_image.GetSpacing())]
78
+
79
+ # Resample the image using the scale factor
80
+ resampler = sitk.ResampleImageFilter()
81
+ resampler.SetReferenceImage(original_image)
82
+ resampler.SetOutputSpacing(scale_factor)
83
+ resampler.SetSize([int(el) for el in new_size])
84
+
85
+ resampler.SetOutputOrigin(original_image.GetOrigin())
86
+ resampler.SetOutputDirection(original_image.GetDirection())
87
+
88
+ if method.lower() == 'linear':
89
+ resampler.SetInterpolator(sitk.sitkLinear) # You can choose different interpolators
90
+ elif method.lower() == 'nearest':
91
+ resampler.SetInterpolator(sitk.sitkNearestNeighbor)
92
+ else:
93
+ resampler.SetInterpolator(sitk.sitkBSpline) # You can choose different interpolators
94
+
95
+ # Perform resampling
96
+ resized_image = resampler.Execute(original_image)
97
+ #inverse_scale_factor = [s1/float(sz) for sz, s1 in zip(*[resized_image.GetSize(), size])]
98
+ return read_sitk_as_nib(resized_image)#, inverse_scale_factor, list(size)
99
+
100
+ def remove_zero(f_data, value=0, min_max=None):
101
+ """
102
+ Remove non segmented areas from image
103
+ :param f_data:
104
+ :param value:
105
+ :return:
106
+ """
107
+
108
+
109
+ shape_original = f_data.shape
110
+ if min_max is None:
111
+ min_max = []
112
+ xs, ys, zs = np.where(f_data > value) # find zero values
113
+ tol = 4
114
+ for x in [xs, ys, zs]:
115
+ minx = min(x)-tol if min(x)-tol>1 else min(x)
116
+ maxx = max(x) + tol if max(x) + tol < f_data.shape[0]-1 else max(x)
117
+ min_max.append([minx, maxx])
118
+ 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]
119
+
120
+ return f_data, min_max, shape_original
121
+
122
+
123
+ def restore_zero(cropped_data, original_shape, min_max, value=0):
124
+ """
125
+ Restore the cropped data back to the original shape with padding (default = 0).
126
+ :param cropped_data: The cropped array from remove_zero
127
+ :param original_shape: The shape of the original full image
128
+ :param min_max: The min/max indices used for cropping
129
+ :param value: The padding value to fill
130
+ :return: Restored full-size array
131
+ """
132
+ restored = np.full(original_shape, value, dtype=cropped_data.dtype)
133
+
134
+ restored[
135
+ min_max[0][0]:min_max[0][1] + 1,
136
+ min_max[1][0]:min_max[1][1] + 1,
137
+ min_max[2][0]:min_max[2][1] + 1
138
+ ] = cropped_data
139
+
140
+ return restored
141
+
142
+ def pad_to_multiple_of_32(img, target_size = [224, 256, 192], val_const=0):
143
+ #target_size = [224, 256, 192] # Nearest multiples of 32
144
+ # Nearest multiples of 32
145
+ diff = [t - s for t, s in zip(target_size, img.shape)]
146
+
147
+ # Distribute padding symmetrically
148
+ pad_width = [(diff[0] // 2, diff[0] - diff[0] // 2), # Depth
149
+ (diff[1] // 2, diff[1] - diff[1] // 2), # Height
150
+ (diff[2] // 2, diff[2] - diff[2] // 2)] # Width
151
+
152
+ return np.pad(img, pad_width, mode='constant', constant_values=val_const), pad_width
153
+
154
+
155
+ def scalecrop(data, dst_min, dst_max, src_min, scale):
156
+ """
157
+ Function to crop the intensity ranges to specific min and max values
158
+ :param np.ndarray data: Image data (intensity values)
159
+ :param float dst_min: future minimal intensity value
160
+ :param float dst_max: future maximal intensity value
161
+ :param float src_min: minimal value to consider from source (crops below)
162
+ :param float scale: scale value by which source will be shifted
163
+ :return: np.ndarray data_new: scaled image data
164
+ """
165
+ data_new = dst_min + scale * (data - src_min)
166
+
167
+ # clip
168
+ data_new = np.clip(data_new, dst_min, dst_max)
169
+ #print("Output: min: " + format(data_new.min()) + " max: " + format(data_new.max()))
170
+
171
+ return data_new
172
+
173
+ def getscale(data, dst_min, dst_max, f_low=0.0, f_high=0.999):
174
+ """
175
+ Function to get offset and scale of image intensities to robustly rescale to range dst_min..dst_max.
176
+ Equivalent to how mri_convert conforms images.
177
+ :param np.ndarray data: image data (intensity values)
178
+ :param float dst_min: future minimal intensity value
179
+ :param float dst_max: future maximal intensity value
180
+ :param f_low: robust cropping at low end (0.0 no cropping)
181
+ :param f_high: robust cropping at higher end (0.999 crop one thousandths of high intensity voxels)
182
+ :return: float src_min: (adjusted) offset
183
+ :return: float scale: scale factor
184
+ """
185
+ # get min and max from source
186
+ src_min = np.min(data)
187
+ src_max = np.max(data)
188
+
189
+ #print("Input: min: " + format(src_min) + " max: " + format(src_max))
190
+
191
+ if f_low == 0.0 and f_high == 1.0:
192
+ return src_min, 1.0
193
+
194
+ # compute non-zeros and total vox num
195
+ nz = (np.abs(data) >= 1e-15).sum()
196
+ voxnum = data.shape[0] * data.shape[1] * data.shape[2]
197
+
198
+ # compute histogram
199
+ histosize = 1000
200
+ bin_size = (src_max - src_min) / histosize
201
+ hist, bin_edges = np.histogram(data, histosize)
202
+
203
+ # compute cummulative sum
204
+ cs = np.concatenate(([0], np.cumsum(hist)))
205
+
206
+ # get lower limit
207
+ nth = int(f_low * voxnum)
208
+ idx = np.where(cs < nth)
209
+
210
+ if len(idx[0]) > 0:
211
+ idx = idx[0][-1] + 1
212
+
213
+ else:
214
+ idx = 0
215
+
216
+ src_min = idx * bin_size + src_min
217
+
218
+ # print("bin min: "+format(idx)+" nth: "+format(nth)+" passed: "+format(cs[idx])+"\n")
219
+ # get upper limit
220
+ nth = voxnum - int((1.0 - f_high) * nz)
221
+ idx = np.where(cs >= nth)
222
+
223
+ if len(idx[0]) > 0:
224
+ idx = idx[0][0] - 2
225
+
226
+ else:
227
+ idx = 0
228
+ print('ERROR: rescale upper bound not found')
229
+
230
+ src_max = idx * bin_size + src_min
231
+ # print("bin max: "+format(idx)+" nth: "+format(nth)+" passed: "+format(voxnum-cs[idx])+"\n")
232
+
233
+ # scale
234
+ if src_min == src_max:
235
+ scale = 1.0
236
+
237
+ else:
238
+ scale = (dst_max - dst_min) / (src_max - src_min)
239
+
240
+ #print("rescale: min: " + format(src_min) + " max: " + format(src_max) + " scale: " + format(scale))
241
+
242
+ return src_min, scale
243
+
244
+ def normalize(img, mask=None):
245
+ if mask is None:
246
+ src_min, scale = getscale(img, 0, 255)
247
+ new_data = scalecrop(img, 0, 255, src_min, scale)
248
+
249
+ else:
250
+ src_min, scale = getscale(img*mask, 0, 255)
251
+ new_data = np.zeros_like(img)
252
+ new_data[mask] = scalecrop(img[mask], 0, 255, src_min, scale)
253
+ new_data[~mask] = scalecrop(img[~mask], 0, 255, src_min, scale)
254
+ new_data = new_data / 255
255
+
256
+
257
+ return new_data
258
+
259
+ def LargestCC(segmentation, connectivity=3):
260
+ """
261
+ Get largest connected components
262
+ """
263
+ if segmentation.ndim == 4:
264
+ segmentation = segmentation.squeeze(-1)
265
+ labels = label_connector(segmentation, connectivity=connectivity)
266
+ frequency = np.bincount(labels.flat)
267
+ return labels, frequency
@@ -0,0 +1,18 @@
1
+ import os
2
+ import torch.distributed as dist
3
+ import torch
4
+ def setup_dist(rank, world_size):
5
+ os.environ['MASTER_ADDR'] = 'localhost' # Set this to the address of the master node
6
+ os.environ['MASTER_PORT'] = '12353' # Set this to an available port
7
+ #dist.init_process_group(backend='gloo', rank=rank, world_size=world_size)
8
+ dist.init_process_group(
9
+ backend="nccl", # Use 'nccl' for GPUs, 'gloo' for CPU
10
+ init_method="env://", # URL specifying how to initialize (e.g., environment variables)
11
+ world_size=world_size, # Total number of processes
12
+ rank=rank # Rank of the current process
13
+ )
14
+ torch.cuda.set_device(rank) # Set the current GPU device
15
+
16
+
17
+ def cleanup():
18
+ dist.destroy_process_group()
@@ -0,0 +1,10 @@
1
+ torch
2
+ numpy
3
+ scikit-image
4
+ monai
5
+ matplotlib
6
+ scikit-learn
7
+ scipy
8
+ nibabel
9
+ voxelmorph
10
+ pkbar
@@ -0,0 +1,272 @@
1
+ import os
2
+ import sys
3
+
4
+ # Add project root to Python path to resolve module imports
5
+ #project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
6
+ #if project_root not in sys.path:
7
+ # sys.path.insert(0, project_root)
8
+
9
+ import argparse
10
+ import numpy as np
11
+ import torch
12
+ import torch.nn as nn
13
+ import torch.nn.functional as F
14
+ import nibabel as nib
15
+ from .voxelmorph.torch.networks import Multi_Segmentor
16
+ from .data_reader.utils import normalize as normalize_image, read_atlas_file
17
+
18
+ # Set environment variables
19
+ os.environ['VXM_BACKEND'] = 'pytorch'
20
+
21
+
22
+ from scipy.spatial import cKDTree
23
+ import scipy.ndimage as ndi
24
+ from .data_reader.utils import LargestCC
25
+
26
+ def post_process(seg_whole, ind_whole):
27
+ """
28
+ Post-process segmentation to remove small disconnected components
29
+ and fill holes using nearest neighbor interpolation.
30
+ """
31
+ whole_segs = []
32
+ initial_segs = []
33
+ label = seg_whole.copy()
34
+
35
+ # 1. Filter connected components
36
+ for c, el in enumerate(ind_whole):
37
+ cur_im = (seg_whole.squeeze() == el)
38
+ initial_segs.append(cur_im)
39
+
40
+ im_l, cc = LargestCC(cur_im, 1)
41
+ sorted_indices = [idx for idx in np.argsort(cc)[::-1] if idx != 0]
42
+
43
+ class_mask = np.zeros_like(cur_im, dtype=bool)
44
+
45
+ if len(sorted_indices) > 0:
46
+ threshold = cc[sorted_indices[0]] * 0.05
47
+ selected_sorted = [idx for idx in sorted_indices if cc[idx] > threshold]
48
+
49
+ temp_mask = np.zeros_like(im_l, dtype=int)
50
+ for sl in selected_sorted:
51
+ temp_mask += (im_l == sl).astype(int)
52
+
53
+ class_mask = temp_mask > 0
54
+
55
+ class_mask = ndi.binary_fill_holes(class_mask)
56
+ else:
57
+ class_mask = cur_im
58
+
59
+ whole_segs.append(class_mask)
60
+
61
+ initial_segs = np.stack(initial_segs).astype(int)
62
+ whole_segs = np.stack(whole_segs).astype(int)
63
+
64
+ # 2. Identify changed pixels (removed regions)
65
+ ind_change_whole = (initial_segs - whole_segs) > 0
66
+
67
+ # 3. Fill removed regions with nearest valid labels
68
+ # Get all valid pixels (those not in the regions being processed or kept regions)
69
+ # Actually, we want to fill using labels from the *final* valid segmentation.
70
+ # But `label` currently has the original values.
71
+ # We should zero out the removed regions in `label` first?
72
+ # The original code used `label` (original) and found nearest from `valid_indices`.
73
+ # `valid_indices` were defined as pixels in `label` NOT in `ind_whole`.
74
+ # This means it fills using ONLY labels that were NOT part of the post-processed set.
75
+ # This seems to be the intent: fill "holes" (removed bad components) with surrounding "background" or other tissues.
76
+
77
+ label_indices = np.argwhere(label > 0)
78
+ label_values = label[tuple(label_indices.T)]
79
+ mask_valid = ~np.isin(label_values, ind_whole)
80
+ valid_indices = label_indices[mask_valid]
81
+ valid_values = label_values[mask_valid]
82
+
83
+ if len(valid_indices) > 0:
84
+ tree = cKDTree(valid_indices)
85
+
86
+ for ind in range(len(ind_whole)):
87
+ # Pixels that were removed for this class
88
+ indices = np.argwhere(ind_change_whole[ind])
89
+ if len(indices) > 0:
90
+ dist, nearest_idx = tree.query(indices)
91
+ nearest_labels = valid_values[nearest_idx]
92
+ label[tuple(indices.T)] = nearest_labels
93
+
94
+ return label
95
+
96
+ def load_model(model, optimizer, device, load_filepath):
97
+ """
98
+ Loads model weights from a file.
99
+ """
100
+ try:
101
+ print(f"Loading model from: {load_filepath}")
102
+ data = torch.load(load_filepath, map_location=device)
103
+ except FileNotFoundError:
104
+ print(f"Error: Model file not found at {load_filepath}")
105
+ return 0
106
+
107
+ # Determine the key for the state dictionary
108
+
109
+ pretrained_state = data["model"]
110
+
111
+
112
+
113
+ # Using strict=False is flexible for mismatched keys
114
+ incompatible_keys = model.load_state_dict(pretrained_state, strict=False)
115
+ if incompatible_keys.missing_keys:
116
+ print(f"Warning: Missing keys in state_dict: {incompatible_keys.missing_keys}")
117
+ if incompatible_keys.unexpected_keys:
118
+ print(f"Warning: Unexpected keys in state_dict: {incompatible_keys.unexpected_keys}")
119
+ #except Exception as e:
120
+ # print(f"Error while loading state dict: {e}")
121
+ #return 0
122
+
123
+ current_step = 0
124
+ try:
125
+ if optimizer is not None:
126
+ optimizer.load_state_dict(data['opt'])
127
+ current_step = data['step']
128
+ except KeyError:
129
+ print("Optimizer state or step not found in checkpoint. Starting from step 0.")
130
+ return 1
131
+
132
+ def save_segmentation(segmentation, affine, base_name, out_folder, suffix='_seg_ours.nii.gz'):
133
+ """
134
+ Saves the segmentation result as a NIfTI file.
135
+ """
136
+ if '.nii.gz' in base_name:
137
+ new_filename = base_name.replace('.nii.gz', suffix)
138
+ elif '.nii' in base_name:
139
+ new_filename = base_name.replace('.nii', suffix)
140
+ else:
141
+ new_filename = base_name + suffix
142
+
143
+ out_file_path = os.path.join(out_folder, new_filename)
144
+ nifti_image = nib.Nifti1Image(segmentation, affine, header=None)
145
+ nifti_image.to_filename(out_file_path)
146
+ print(f"Saved: {out_file_path}")
147
+
148
+ def get_inference(model, input_data, device, inshape=[224, 256, 192],
149
+ post_processing=True):
150
+ input_data = normalize_image(input_data)
151
+
152
+ # Prepare tensor
153
+ input_tensor = torch.from_numpy(input_data).float().to(device)
154
+ # Add batch and channel dimensions: (D, H, W) -> (1, 1, D, H, W)
155
+ # Assuming input is 3D volume
156
+ if input_tensor.ndim == 3:
157
+ input_tensor = input_tensor.unsqueeze(0).unsqueeze(0)
158
+ elif input_tensor.ndim == 4: # Maybe already has channel?
159
+ input_tensor = input_tensor.unsqueeze(0)
160
+
161
+ source_shape = input_tensor.shape[2:]
162
+
163
+ # Resize to model input shape
164
+ input_tensor_resized = F.interpolate(input_tensor, size=inshape, mode='trilinear', align_corners=False)
165
+
166
+ print(f"Running inference...")
167
+ with torch.inference_mode():
168
+ # Inference
169
+ pred_logits, pred_logits_tissue = model(input_tensor_resized)
170
+
171
+ # Resize back to original shape
172
+ pred_logits = F.interpolate(pred_logits, size=source_shape, mode='trilinear', align_corners=False)
173
+ pred_logits_tissue = F.interpolate(pred_logits_tissue, size=source_shape, mode='trilinear', align_corners=False)
174
+
175
+ # Get probabilities and segmentations
176
+ prob_value = F.softmax(pred_logits, dim=1)
177
+ prob_value_tissue = F.softmax(pred_logits_tissue, dim=1)
178
+
179
+ segmentation = prob_value.argmax(1).squeeze().numpy().astype(np.int16)
180
+ if post_processing:
181
+ segmentation = post_process(segmentation, ind_whole=[3, 19])
182
+ segmentation_tissue = prob_value_tissue.argmax(1).squeeze().numpy().astype(np.int16)
183
+ if post_processing:
184
+ segmentation_tissue = post_process(segmentation_tissue, ind_whole=[3])
185
+
186
+ # Convert to numpy
187
+ #out_segmentation = segmentation.detach().squeeze().cpu().numpy().astype(np.int16)
188
+ #out_segmentation_tissue = segmentation_tissue.detach().squeeze().cpu().numpy().astype(np.int16)
189
+ return segmentation_tissue, segmentation
190
+
191
+
192
+ def build_model(model_path, device):
193
+ inshape = [224, 256, 192]
194
+ model = Multi_Segmentor(tissue_roi=6, nrois=30).to(device)
195
+
196
+ # Load model
197
+ if model_path is not None:
198
+ step = load_model(model, None, device, load_filepath=model_path)
199
+ if step == 0:
200
+ raise RuntimeError(f"Failed to load model weights from {model_path}")
201
+ model.to(device)
202
+ model.eval()
203
+ return model
204
+
205
+ def get_options():
206
+ parser = argparse.ArgumentParser()
207
+
208
+ # Input/Output parameters
209
+ parser.add_argument('--input-image', required=True, help='Path to the input image for inference')
210
+ parser.add_argument('--output-dir', default='test_results', help='Directory to save results')
211
+ parser.add_argument('--model-path', required=True, help='Path to the trained model checkpoint')
212
+
213
+ # Model parameters (must match training config)
214
+ parser.add_argument('--enc', type=int, nargs='+', help='list of unet encoder filters (default: 16 32 32 32)')
215
+ parser.add_argument('--dec', type=int, nargs='+',
216
+ help='list of unet decorder filters (default: 32 32 32 32 32 16 16)')
217
+ parser.add_argument('--int-steps', type=int, default=7, help='number of integration steps (default: 7)')
218
+ parser.add_argument('--int-downsize', type=int, default=2,
219
+ help='flow downsample factor for integration (default: 2)')
220
+ parser.add_argument('--bidir', action='store_true', help='enable bidirectional cost function')
221
+
222
+ # Other parameters
223
+ parser.add_argument('--gpu', default='0', help='GPU ID number(s), comma-separated (default: 0)')
224
+ parser.add_argument('--modelName', type=str, default='t1_fuzzy',
225
+ help='Automatic') # Kept for compatibility if needed
226
+
227
+ opt = parser.parse_args()
228
+ return opt
229
+
230
+ def main():
231
+ import voxelmorph as vxm
232
+ opt = get_options()
233
+
234
+ # Device configuration
235
+ if torch.cuda.is_available():
236
+ device = 'cuda:0'
237
+ else:
238
+ device = 'cpu'
239
+
240
+ # Model configuration
241
+ inshape = [224, 256, 192]
242
+ model = build_model(opt.model_path, device)
243
+
244
+ # Prepare output directory
245
+ os.makedirs(opt.output_dir, exist_ok=True)
246
+
247
+ # Load and process input image
248
+ if not os.path.exists(opt.input_image):
249
+ print(f"Error: Input image not found at {opt.input_image}")
250
+ return
251
+
252
+ try:
253
+ # Load image
254
+ nifti_img = read_atlas_file(opt.input_image)
255
+ input_data = nifti_img.get_fdata()
256
+ affine = nifti_img.affine
257
+
258
+ # Normalize
259
+ out_segmentation_tissue, out_segmentation = get_inference(model, input_data, device, inshape)
260
+
261
+ # Save results
262
+ base_name = os.path.basename(opt.input_image)
263
+ save_segmentation(out_segmentation, affine, base_name, opt.output_dir, suffix='_seg_ours.nii.gz')
264
+ save_segmentation(out_segmentation_tissue, affine, base_name, opt.output_dir, suffix='_tissue_seg_ours.nii.gz')
265
+
266
+ except Exception as e:
267
+ print(f"Error processing image: {e}")
268
+ import traceback
269
+ traceback.print_exc()
270
+
271
+ if __name__ == "__main__":
272
+ main()