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
melage/utils/utils.py CHANGED
@@ -4,6 +4,7 @@ __AUTHOR__ = 'Bahram Jafrasteh'
4
4
 
5
5
  import sys
6
6
  from operator import index
7
+ from pathlib import Path
7
8
 
8
9
  sys.path.append("../../")
9
10
  import numpy as np
@@ -28,7 +29,7 @@ try:
28
29
  except:
29
30
  None
30
31
  try:
31
- from melage.utils.source_folder import source_folder
32
+ from melage.config import settings
32
33
  except:
33
34
  pass
34
35
  # Direction of medical image Left, Right, Posterior Anterior, Inferior, Superior
@@ -43,6 +44,50 @@ class Item:
43
44
  size: bytes
44
45
 
45
46
 
47
+
48
+
49
+
50
+ def get_filter_for_file(filename, all_filters):
51
+ """
52
+ Returns the specific filter string (e.g., 'Nifti (*.nii)') that matches
53
+ the given filename.
54
+ """
55
+ # 1. Split the massive filter string into individual categories
56
+ # "Nifti(...);;Vol(...)" -> ["Nifti(...)", "Vol(...)"]
57
+ categories = all_filters.split(';;')
58
+
59
+ # We compare in lowercase to handle extensions robustly (e.g., .NII vs .nii)
60
+ filename_lower = filename.lower()
61
+
62
+ for category in categories:
63
+ # 2. Extract the part inside parentheses: "*.nii *.nii.gz"
64
+ start = category.find('(')
65
+ end = category.find(')')
66
+
67
+ if start != -1 and end != -1:
68
+ # Get the content inside ()
69
+ pattern_str = category[start + 1:end]
70
+
71
+ # Split into individual extensions: ["*.nii", "*.nii.gz"]
72
+ patterns = pattern_str.split()
73
+
74
+ for pattern in patterns:
75
+ # Clean the pattern to get the suffix
76
+ # "*.nii.gz" -> ".nii.gz"
77
+ # "**" -> skip
78
+ clean_ext = pattern.replace('*', '').lower()
79
+
80
+ if not clean_ext:
81
+ continue # Skip empty or pure wildcards
82
+
83
+ # 3. Check if the filename ends with this extension
84
+ # "mri.nii.gz" ends with ".nii.gz" -> Match!
85
+ if filename_lower.endswith(clean_ext):
86
+ return category
87
+
88
+ # Fallback: If no specific match found, return "All Files" or the first one
89
+ return "All Files (*)"
90
+
46
91
  def guess_num_image_index(nifti_input):
47
92
  """
48
93
  Guess which axis of the image shape represents the 'num_images' (volume/time/channel) dimension.
@@ -56,7 +101,7 @@ def guess_num_image_index(nifti_input):
56
101
  if isinstance(nifti_input, nib.Nifti1Image):
57
102
  hdr = nifti_input.header
58
103
  else:
59
- return None, 1
104
+ return np.argmin(nifti_input.shape), 1
60
105
 
61
106
  ndim = hdr['dim'][0]
62
107
  shape = hdr['dim'][1:4]
@@ -380,7 +425,10 @@ def resample_to_spacing(im, newSpacing, method='spline'):
380
425
 
381
426
 
382
427
  # Define the new spacing (voxel size) for resampling
383
- new_spacing = (newSpacing, newSpacing, newSpacing)
428
+ if type(newSpacing)==list or type(newSpacing)==tuple:
429
+ new_spacing = newSpacing
430
+ else:
431
+ new_spacing = (newSpacing, newSpacing, newSpacing)
384
432
 
385
433
  # Calculate the new size based on the original size and spacing
386
434
  new_size = [int(sz * spc / new_spc + 0.5) for sz, spc, new_spc in
@@ -403,7 +451,7 @@ def resample_to_spacing(im, newSpacing, method='spline'):
403
451
  return read_sitk_as_nib(resampled_image)
404
452
  except:
405
453
  from nibabel.processing import resample_to_output
406
- return resample_to_output(im, [newSpacing, newSpacing, newSpacing])
454
+ return resample_to_output(im, new_spacing)
407
455
 
408
456
 
409
457
  ###################### Help dialogue to open new image ######################
@@ -468,174 +516,6 @@ def calculate_snr(image_array):
468
516
 
469
517
  ###################### A class to resize image######################
470
518
 
471
- class resize_window(QtWidgets.QDialog):
472
- from PyQt5.QtCore import pyqtSignal
473
- closeSig = pyqtSignal()
474
- resizeim = pyqtSignal(object)
475
- comboboxCh = pyqtSignal(object, object)
476
- """
477
- A dialog for combo box created for reading 4d images
478
- """
479
- def __init__(self, parent=None, use_combobox=False):
480
- QtWidgets.QDialog.__init__(self, parent)
481
- self.setWindowTitle("Child Window!")
482
- Dialog = self.window()
483
- self.use_combobox = use_combobox
484
- self.setupUi(Dialog)
485
- self.check_box.setCheckState(Qt.Checked)
486
- self._status = False
487
-
488
- def setupUi(self, Dialog):
489
-
490
- Dialog.setObjectName("Dialog")
491
- Dialog.resize(500, 112)
492
- self.grid_main = QtWidgets.QGridLayout(self)
493
- self.grid_main.setContentsMargins(10,10,10,10)
494
- self.grid_main.setObjectName("gridLayout")
495
-
496
- self.hbox_0 = QtWidgets.QHBoxLayout()
497
- self.label_warning = QtWidgets.QLabel()
498
- self.label_warning.setText('The pixels are not isotropic. Do you want to resize image (isotropic)?')
499
-
500
-
501
- self.hbox_0.addWidget(self.label_warning)
502
-
503
- _translate = QtCore.QCoreApplication.translate
504
- self.pushbutton = QtWidgets.QDialogButtonBox()
505
- self.pushbutton_cancel = QtWidgets.QPushButton()
506
- self.pushbutton.setStandardButtons(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
507
- self.pushbutton.accepted.connect(self.accept_it)
508
- self.pushbutton.rejected.connect(self.reject_it)
509
-
510
- #self.hbox_0.addWidget(self.pushbutton)
511
-
512
- if self.use_combobox:
513
- self.comboBox_image = QtWidgets.QComboBox()
514
- self.comboBox_image.setObjectName("comboBox_image")
515
- self.comboBox_image.addItem("")
516
- self.comboBox_image.addItem("")
517
- self.comboBox_image.currentIndexChanged.connect(self.comboBOX_changed)
518
- #
519
- self.hbox_0.addWidget(self.comboBox_image)
520
- self.grid_main.addLayout(self.hbox_0, 0, 0, 1, 1)
521
- else:
522
- self.grid_main.addLayout(self.hbox_0, 0, 0, 1, 1)
523
-
524
- self.grid_main.addWidget(self.pushbutton, 3, 0, 1, 1)
525
- self.check_box = QtWidgets.QCheckBox()
526
-
527
- self.check_box.stateChanged.connect(self.changeAllSpacing)
528
-
529
-
530
- self.label_current_spc0 = QtWidgets.QLabel()
531
- self.label_current_spc0.setText('Current Spacing')
532
-
533
- self.label_current_spc = QtWidgets.QLabel()
534
- #self.label_current_spc.setReadOnly(True)
535
- self.label_current_spc.setText('0,0,0')
536
-
537
-
538
- self.radioButton_1 = QtWidgets.QCheckBox()
539
-
540
- self.radioButton_1.setObjectName("radioButton_1")
541
- self.radioButton_1.setChecked(False)
542
-
543
- self.hbox = QtWidgets.QHBoxLayout()
544
- self.hbox.addWidget(self.check_box)
545
- self.hbox.addWidget(self.radioButton_1)
546
- self.hbox.addWidget(self.label_current_spc0)
547
- self.hbox.addWidget(self.label_current_spc)
548
-
549
-
550
- self.hbox2 = QtWidgets.QHBoxLayout()
551
- self.label_new_spc0 = QtWidgets.QLabel()
552
- self.label_new_spc0.setText('New Spacing')
553
- self.label_new_spc0.setStyleSheet('color: Red')
554
-
555
- self.label_new_spc = QtWidgets.QDoubleSpinBox(self)
556
- self.label_new_spc_y = QtWidgets.QDoubleSpinBox(self)
557
- self.label_new_spc_z = QtWidgets.QDoubleSpinBox(self)
558
-
559
- for spin_box in (self.label_new_spc, self.label_new_spc_y, self.label_new_spc_z):
560
- spin_box.setMinimum(0.01)
561
- spin_box.setMaximum(20)
562
- spin_box.setSingleStep(0.1)
563
- spin_box.setValue(1.0)
564
- spin_box.setDecimals(2)
565
-
566
- self.hbox2.addWidget(self.label_new_spc0)
567
- self.hbox2.addWidget(self.label_new_spc)
568
- self.hbox2.addWidget(self.label_new_spc_y)
569
- self.hbox2.addWidget(self.label_new_spc_z)
570
-
571
-
572
- #self.pushbutton.setText(_translate("Dialog", "OK"))
573
- #self.grid_main.addWidget(self.label_warning, 0,0,1,1)
574
- self.grid_main.addLayout(self.hbox, 1,0,1,1)
575
- self.grid_main.addLayout(self.hbox2,2,0,1,1)
576
-
577
- #self.hbox3 = QtWidgets.QHBoxLayout()
578
-
579
-
580
- #self.grid_main.addLayout(self.hbox_0, 3, 0, 1, 1)
581
-
582
-
583
- self.retranslateUi(Dialog)
584
-
585
- QtCore.QMetaObject.connectSlotsByName(Dialog)
586
-
587
- def changeAllSpacing(self, state):
588
- if state == QtCore.Qt.Checked:
589
- # Connect the change signal to synchronize function
590
- self.label_new_spc.valueChanged.connect(self.synchronizeSpacings)
591
- self.label_new_spc_y.valueChanged.connect(self.synchronizeSpacings)
592
- self.label_new_spc_z.valueChanged.connect(self.synchronizeSpacings)
593
- else:
594
- # Disconnect the synchronize function to allow independent changes
595
- self.label_new_spc.valueChanged.disconnect(self.synchronizeSpacings)
596
- self.label_new_spc_y.valueChanged.disconnect(self.synchronizeSpacings)
597
- self.label_new_spc_z.valueChanged.disconnect(self.synchronizeSpacings)
598
-
599
- def synchronizeSpacings(self, value):
600
- # Set the value of all spin boxes to the changed value
601
- self.label_new_spc.blockSignals(True)
602
- self.label_new_spc_y.blockSignals(True)
603
- self.label_new_spc_z.blockSignals(True)
604
- self.label_new_spc.setValue(value)
605
- self.label_new_spc_y.setValue(value)
606
- self.label_new_spc_z.setValue(value)
607
- self.label_new_spc.blockSignals(False)
608
- self.label_new_spc_y.blockSignals(False)
609
- self.label_new_spc_z.blockSignals(False)
610
-
611
- def comboBOX_changed(self):
612
- ind = self.comboBox_image.currentIndex()
613
- self.comboboxCh.emit(None, ind)
614
-
615
- def retranslateUi(self, Dialog):
616
- _translate = QtCore.QCoreApplication.translate
617
- Dialog.setWindowTitle(_translate("Dialog", "Resize..."))
618
-
619
- _translate = QtCore.QCoreApplication.translate
620
- self.radioButton_1.setText(_translate("Main", "Linear"))
621
- self.check_box.setText(_translate("Main", "Isotropic"))
622
- if self.use_combobox:
623
- self.comboBox_image.setItemText(0, _translate("Form", " Top Image "))
624
- self.comboBox_image.setItemText(1, _translate("Form", " Bottom Image "))
625
- def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
626
- self.closeSig.emit()
627
- super(resize_window, self).closeEvent(a0)
628
- def accept_it(self):
629
- self._status = True
630
- if self.use_combobox:
631
- index = self.comboBox_image.currentIndex()
632
- self.resizeim.emit(index)
633
- self.accept()
634
-
635
- def reject_it(self):
636
- self._status = False
637
- self.reject()
638
-
639
519
  ########### COMBO BOX To read 4D images #####################
640
520
  class ComboBox_Dialog(QtWidgets.QDialog):
641
521
  """
@@ -920,9 +800,199 @@ def manually_check_tree_item(self, txt='9876'):
920
800
  for l in ls:
921
801
  root.child(l).setCheckState(Qt.Checked)
922
802
  return ls
803
+ ####################### Discover all scheme files #####################
804
+ def discover_color_files(base_folder):
805
+ """
806
+ Dynamically finds all .txt files in the 'color' subdirectory.
807
+
808
+ Args:
809
+ base_folder (str): The root folder containing the 'color' directory.
923
810
 
811
+ Returns:
812
+ dict: A dictionary where keys are filenames (without extension)
813
+ and values are the relative paths to the .txt files.
814
+ Returns an empty dictionary if the folder doesn't exist.
815
+ """
816
+ color_dir = Path(base_folder) / 'color'
817
+ if not color_dir.is_dir():
818
+ print(f"Warning: Color directory not found at '{color_dir}'")
819
+ return {}
820
+
821
+ # Create a dictionary mapping the filename (e.g., 'Simple')
822
+ # to its relative path (e.g., 'color/Simple.txt')
823
+ # The .lower() makes the key consistent for lookups.
824
+ return {
825
+ path.stem: f"/color/{path.name}"
826
+ for path in color_dir.glob('*.txt')
827
+ }
924
828
  ###################### Updating current color scheme ##################
925
- def update_color_scheme(self, data, data_add=None, dialog=True, update_widget=True):
829
+
830
+ MAX_COLORS = 255
831
+ COMBINED_COLOR_ID = 9876
832
+ DEFAULT_COLOR_FILES = {
833
+ 'simple': '/color/Simple.txt',
834
+ 'tissue': '/color/Tissue.txt',
835
+ 'albert': '/color/albert_LUT.txt',
836
+ 'mcrib': '/color/mcrib_LUT.txt',
837
+ }
838
+ from PyQt5.QtWidgets import QFileDialog
839
+
840
+ # --- Helper Functions (These perform the specific, isolated tasks) ---
841
+
842
+ def _get_required_indices(data, data_add=None):
843
+ """Extracts unique positive integer indices from data arrays."""
844
+
845
+ indices = set([l for l in np.unique(data).astype('int') if l > 0])
846
+ if data_add is not None:
847
+ indices.update([l for l in np.unique(data_add).astype('int') if l > 0])
848
+ return {idx for idx in indices if idx > 0}
849
+
850
+
851
+ def _get_color_filepath(app_instance, show_dialog, unique_count):
852
+
853
+ """Gets color file path via dialog or automatic selection."""
854
+ if show_dialog:
855
+ filters = "Text files (*.txt)"
856
+ opts = QFileDialog.DontUseNativeDialog
857
+ file_path, _ = QFileDialog.getOpenFileName(app_instance, "Open Color File", settings.DEFAULT_USE_DIR, filters,
858
+ options=opts)
859
+ if file_path!='':
860
+ return file_path
861
+ available_files = discover_color_files(settings.RESOURCE_DIR)
862
+ if not available_files:
863
+ print("Error: No color files found.")
864
+ return None # No files to choose from
865
+ # Automatic selection logic
866
+ # This example selects a file based on name, similar to before.
867
+ if unique_count <= 2 and 'Simple' in available_files:
868
+ filepath = available_files['Simple']
869
+ elif unique_count <= 9 and 'Tissue' in available_files:
870
+ filepath = available_files['Tissue']
871
+ elif unique_count < 90 and 'albert_LUT' in available_files:
872
+ filepath = available_files['albert_LUT']
873
+ elif 'mcrib_LUT' in available_files: # Fallback for larger counts
874
+ filepath = available_files['mcrib_LUT']
875
+ else:
876
+ # If no specific logic matches, just pick the first available file
877
+ filepath = next(iter(available_files.values()))
878
+ filepath = available_files["FreeSurferColorLUT"]
879
+ return settings.RESOURCE_DIR + filepath
880
+
881
+
882
+ def _load_color_definitions(file_path):
883
+ """Loads color definitions from a text file, trying multiple formats."""
884
+ try:
885
+ names, rgb_data, _ = read_txt_color(file_path, from_one=False, mode='albert')
886
+ return {'names': names, 'rgb': rgb_data}
887
+ except Exception as e1:
888
+ print(f"Could not read '{file_path}' in primary format. Trying fallback. Error: {e1}")
889
+ try:
890
+ names, rgb_data, _ = read_txt_color(file_path, from_one=False)
891
+ return {'names': names, 'rgb': rgb_data}
892
+ except Exception as e2:
893
+ print(f"Error: Failed to read color file '{file_path}'. Error: {e2}")
894
+ return None
895
+
896
+
897
+ def _update_ui_widgets(app_instance):
898
+ """Safely disconnects, updates, and reconnects UI signals and widgets."""
899
+ try:
900
+ #self.dw2_cb.currentTextChanged.disconnect(self.changeColorPen)
901
+ app_instance.tree_colors.itemChanged.disconnect(app_instance.changeColorPen)
902
+ except:
903
+ pass
904
+
905
+ set_new_color_scheme(app_instance)
906
+ try:
907
+ #self.dw2_cb.currentTextChanged.connect(self.changeColorPen)
908
+ app_instance.tree_colors.itemChanged.connect(app_instance.changeColorPen)
909
+ except:
910
+ pass
911
+
912
+
913
+ # --- Main Function ---
914
+
915
+ def update_color_scheme(app_instance, data, data_add=None, dialog=True, update_widget=True):
916
+ """
917
+ Updates the application's color scheme based on indices present in the data.
918
+
919
+ Args:
920
+ app_instance: The instance of the application class (what was 'self').
921
+ data (np.ndarray): The primary data array with color indices.
922
+ data_add (np.ndarray, optional): Additional data array with color indices.
923
+ dialog (bool): If True, shows a file dialog to select a color file.
924
+ update_widget (bool): If True, updates the UI widgets after the scheme is changed.
925
+
926
+ Returns:
927
+ tuple[np.ndarray, bool]: The original data array and a success flag.
928
+ """
929
+ if data is None:
930
+ data = np.array([0, 1])
931
+
932
+ # 1. Determine which color indices are required
933
+ required_indices = _get_required_indices(data, data_add)
934
+ if len(required_indices) > MAX_COLORS:
935
+ print(f"Error: Number of unique colors exceeds the limit of {MAX_COLORS}.")
936
+ return data, False
937
+
938
+ current_indices = set(app_instance.color_index_rgb[:, 0].astype(int))
939
+ new_indices_needed = required_indices - current_indices
940
+
941
+ if not new_indices_needed:
942
+ return data, True # Success, no update was needed
943
+
944
+ # 2. Get the color file and load the color definitions
945
+ color_file_path = _get_color_filepath(app_instance, dialog, len(required_indices))
946
+ #if not color_file_path:
947
+ # return data, False # User cancelled or no file found
948
+
949
+ loaded_colors = _load_color_definitions(color_file_path)
950
+ #if loaded_colors is None:
951
+ # return data, False # Failed to load file
952
+
953
+ # 3. Merge new colors with the existing scheme and update the app's state
954
+ loaded_rgb_map = {int(row[0]): row for row in loaded_colors['rgb']}
955
+ loaded_name_map = {int(name.split('_')[0]): name for name in loaded_colors['names']}
956
+
957
+ final_rgb = list(app_instance.color_index_rgb)
958
+ final_names = list(app_instance.color_name)
959
+
960
+ for ii, index in enumerate(new_indices_needed):
961
+ if index in loaded_rgb_map:
962
+ final_rgb.append(loaded_rgb_map[index])
963
+ final_names.append(loaded_name_map.get(index, f"{index}_unknown"))
964
+ else:
965
+ new_rgb_row = [index, np.random.rand(), np.random.rand(), np.random.rand(), 1]
966
+ final_rgb.append(new_rgb_row)
967
+ final_names.append(f"{index}_structure_unknown")
968
+
969
+ # Ensure the special "Combined" color exists
970
+ if COMBINED_COLOR_ID not in {int(row[0]) for row in final_rgb}:
971
+ final_rgb.append([COMBINED_COLOR_ID, 1, 0, 0, 1])
972
+ final_names.append(f"{COMBINED_COLOR_ID}_Combined")
973
+
974
+
975
+ # Update the application state directly on the passed instance
976
+ app_instance.color_index_rgb, app_instance.color_name, app_instance.colorsCombinations = \
977
+ generate_color_scheme_info(app_instance,np.array(final_rgb), final_names)
978
+
979
+ widgets_num = [0, 1, 2, 3, 4, 5, 10, 11, 13, 23]
980
+ for num in widgets_num:
981
+ name = 'openGLWidget_' + str(num + 1)
982
+ widget = getattr(app_instance, name)
983
+ if hasattr(widget, 'colorsCombinations'):
984
+ widget.colorsCombinations = app_instance.colorsCombinations
985
+ if hasattr(widget, 'color_name'):
986
+ widget.color_name = app_instance.color_name
987
+
988
+ # 4. Update the UI components
989
+ if update_widget:
990
+ _update_ui_widgets(app_instance)
991
+
992
+ return data, True
993
+
994
+
995
+ def update_color_scheme0(self, data, data_add=None, dialog=True, update_widget=True):
926
996
  """
927
997
  Updating current color scheme
928
998
  Args:
@@ -935,7 +1005,7 @@ def update_color_scheme(self, data, data_add=None, dialog=True, update_widget=Tr
935
1005
 
936
1006
  """
937
1007
  if data_add is not None:
938
- uq1 = [l for l in np.unique(data_add) if l > 0]
1008
+ uq1 = [l for l in np.unique(data_add).astype('int') if l > 0]
939
1009
  else:
940
1010
  uq1 = []
941
1011
  if data is None:
@@ -963,13 +1033,13 @@ def update_color_scheme(self, data, data_add=None, dialog=True, update_widget=Tr
963
1033
  print('automatic files')
964
1034
  len_u = len(np.unique(data))
965
1035
  if len_u<=2:
966
- filen = source_folder + '/color/Simple.txt'
1036
+ filen = settings.RESOURCE_DIR + '/color/Simple.txt'
967
1037
  elif len_u<=9:
968
- filen = source_folder + '/color/Tissue.txt'
1038
+ filen = settings.RESOURCE_DIR + '/color/Tissue.txt'
969
1039
  elif len_u <90:
970
- filen = source_folder + '/color/albert_LUT.txt'
1040
+ filen = settings.RESOURCE_DIR + '/color/albert_LUT.txt'
971
1041
  else:
972
- filen = source_folder + '/color/mcrib_LUT.txt'
1042
+ filen = settings.RESOURCE_DIR + '/color/mcrib_LUT.txt'
973
1043
  from_one = False
974
1044
  try:
975
1045
  possible_color_name, possible_color_index_rgb, _ = read_txt_color(filen, from_one=from_one, mode='albert')
@@ -1007,7 +1077,7 @@ def update_color_scheme(self, data, data_add=None, dialog=True, update_widget=Tr
1007
1077
  possible_color_index_rgb = np.vstack((possible_color_index_rgb, np.array(new_color_rgb)))
1008
1078
 
1009
1079
  #self.color_index_rgb, self.color_name, self.colorsCombinations = combinedIndex(self.colorsCombinations, possible_color_index_rgb, possible_color_name, np.unique(data), uq1)
1010
- self.color_index_rgb, self.color_name, self.colorsCombinations = generate_color_scheme_info(possible_color_index_rgb, possible_color_name)
1080
+ self.color_index_rgb, self.color_name, self.colorsCombinations = generate_color_scheme_info(self, possible_color_index_rgb, possible_color_name)
1011
1081
  try:
1012
1082
  #self.dw2_cb.currentTextChanged.disconnect(self.changeColorPen)
1013
1083
  self.tree_colors.itemChanged.disconnect(self.changeColorPen)
@@ -1193,7 +1263,7 @@ def getUnique(mat):
1193
1263
  return np.unique(mat)
1194
1264
 
1195
1265
  ###################### Generate info for color schemes ##################
1196
- def generate_color_scheme_info(color_index_rgb, color_name):
1266
+ def generate_color_scheme_info(reader, color_index_rgb, color_name):
1197
1267
  """
1198
1268
  Generate color scheme information
1199
1269
  Args:
@@ -1258,7 +1328,77 @@ def set_new_color_scheme(self):
1258
1328
  addTreeRoot(parent, '9876', 'Combined', colr)
1259
1329
 
1260
1330
  ################# SET IMAGE SCHEME ###########################
1261
- def update_image_sch(self, info=None, color = [1,1,0],loaded = False):
1331
+ from PyQt5 import QtGui, QtCore
1332
+ import os
1333
+ import numpy as np
1334
+
1335
+ # Place this helper method inside your main class
1336
+ def _is_image_already_added(self, file_path, view_index):
1337
+ """Checks if an image has already been added to a specific view."""
1338
+ for item_data in self.imported_images:
1339
+ existing_file = item_data[0][0][0]
1340
+ existing_view_index = item_data[0][0][2]
1341
+ if file_path == existing_file and view_index == existing_view_index:
1342
+ return True
1343
+ return False
1344
+
1345
+ # Your updated function
1346
+ def update_image_sch(self, info=None, color=[1, 1, 0], loaded=False):
1347
+ """
1348
+ Sets a new color scheme and adds items for multiple images.
1349
+ """
1350
+ # SUGGESTION: Add a guard clause for safety
1351
+ if info is None:
1352
+ return
1353
+
1354
+ if hasattr(self, 'tree_images'):
1355
+ parent = self.tree_images.model().sourceModel().invisibleRootItem()
1356
+ fileObj, index, index_view = info
1357
+
1358
+ # Determine the description string for the view
1359
+ if index >= 3:
1360
+ indc = f'View {index_view + 1} (seg)'
1361
+ else:
1362
+ indc = f'View {index_view + 1}'
1363
+
1364
+ color_255 = [int(c * 255) for c in color]
1365
+
1366
+ for file in fileObj[0]:
1367
+ if '*' in file:
1368
+ continue
1369
+
1370
+ # SUGGESTION: Use the clearer helper function
1371
+ if not _is_image_already_added(self, file, index_view):
1372
+ self.imported_images.append([[[file, fileObj[1], index_view], index], color, loaded, indc])
1373
+ else:
1374
+ # If it already exists, skip adding it to the tree
1375
+ continue
1376
+
1377
+ # --- Create Tree Items ---
1378
+ node1 = QtGui.QStandardItem(indc)
1379
+ node1.setForeground(QtGui.QBrush(QtGui.QColor(*color_255)))
1380
+ node1.setData(index_view)
1381
+
1382
+ # SUGGESTION: Set flags correctly to prevent the double-toggle bug
1383
+ # DO NOT include ItemIsUserCheckable
1384
+ node1.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsTristate)
1385
+ node1.setCheckable(True)
1386
+ node1.setFlags(node1.flags() & QtCore.Qt.ItemIsUserCheckable)
1387
+
1388
+ # Set initial check state
1389
+ node1.setCheckState(QtCore.Qt.Checked if loaded else QtCore.Qt.Unchecked)
1390
+
1391
+ descp = os.path.basename(file)
1392
+ node2 = QtGui.QStandardItem(descp)
1393
+ node2.setForeground(QtGui.QBrush(QtGui.QColor(*color_255)))
1394
+ # SUGGESTION: No need for flags on a non-checkable item
1395
+ # node2.setFlags(...)
1396
+ #node2.setFlags(node2.flags() | QtCore.Qt.ItemIsTristate)
1397
+
1398
+ parent.appendRow([node1, node2])
1399
+
1400
+
1401
+ def update_image_sch_to_remove(self, info=None, color = [1,1,0],loaded = False):
1262
1402
  """
1263
1403
  SET new color scheme to read multiple images
1264
1404
  Args:
@@ -1395,7 +1535,8 @@ def clean_parent_image2(self, filename, indc,index_view):
1395
1535
  if signal.checkState() == Qt.Checked:
1396
1536
  if signal.text() in indc:
1397
1537
  try:
1398
- self.tree_images.model().sourceModel().itemChanged.disconnect(self.changeImage)
1538
+ #self.tree_images.model().sourceModel().itemChanged.disconnect(self.changeImage)
1539
+ self.tree_images.clicked.disconnect(self.on_row_clicked_image)
1399
1540
  except:
1400
1541
  pass
1401
1542
  signal.setCheckState(Qt.Unchecked)
@@ -1403,7 +1544,8 @@ def clean_parent_image2(self, filename, indc,index_view):
1403
1544
  #if indc in info[0][1]:
1404
1545
  indices.append(i)
1405
1546
  try:
1406
- self.tree_images.model().sourceModel().itemChanged.connect(self.changeImage)
1547
+ #self.tree_images.model().sourceModel().itemChanged.connect(self.changeImage)
1548
+ self.tree_images.clicked.connect(self.on_row_clicked_image)
1407
1549
  except:
1408
1550
  pass
1409
1551
  for ind in indices:
@@ -1426,12 +1568,14 @@ def clean_parent_image(self, index_row, indc,index_view):
1426
1568
  if signal.checkState() == Qt.Checked:
1427
1569
  if signal.text() in indc:
1428
1570
  try:
1429
- self.tree_images.model().sourceModel().itemChanged.disconnect(self.changeImage)
1571
+ #self.tree_images.model().sourceModel().itemChanged.disconnect(self.changeImage)
1572
+ self.tree_images.clicked.disconnect(self.on_row_clicked_image)
1430
1573
  except:
1431
1574
  pass
1432
1575
  signal.setCheckState(Qt.Unchecked)
1433
1576
  try:
1434
- self.tree_images.model().sourceModel().itemChanged.connect(self.changeImage)
1577
+ #self.tree_images.model().sourceModel().itemChanged.connect(self.changeImage)
1578
+ self.tree_images.clicked.connect(self.on_row_clicked_image)
1435
1579
  except:
1436
1580
  pass
1437
1581
 
@@ -1533,6 +1677,8 @@ def read_txt_color(file, mode ='lut', from_one= False):
1533
1677
 
1534
1678
  #color_name = [l.split('\t')[0]+"_"+l.split('\t')[-1][1:-2] for l in lines[id:]]
1535
1679
  #color_name = [[r for r in re.sub(r'\s+', ' ', l).split() if r != '' and r!='\n'][0] + "_"+' '.join([r.replace('"', '') for r in re.sub(r'\s+', ' ', l[:-1]).split() if r != '' and r!='\n'][indices_non_numeric]) for l in lines[id:] if l[0]!='#']
1680
+ lines = [l for l in lines if l.strip() and not l.strip().startswith('#')]
1681
+ id = 0
1536
1682
  color_name = [[r for r in re.sub(r'\s+', ' ', l).split() if r != '' and r!='\n'][0] + "_"+"".join([r.replace('"', '') for r in re.sub(r'\s+', ' ', l[:-1]).split() if r != '' and r!='\n'][indices_non_numeric]) for l in lines[id:] if l[0]!='#']
1537
1683
  indices_el = [int([r for r in re.sub(r'\s+', ' ', l).split() if r != '' and r != '\n'][0]) for l in lines[id:] if l[0] != '#']
1538
1684
  color_index_rgb = np.array([[int(float(s)) for s in [r for r in re.sub(r'\s+', ' ', l).split() if r != '' and r != '\n'][index_colr_start:index_colr_end]] for l in
@@ -1675,29 +1821,29 @@ def vox2ref(affine, ref):
1675
1821
  ###################### Cursors ######################
1676
1822
 
1677
1823
  def cursorOpenHand():
1678
- bitmap = QtGui.QPixmap(source_folder+"/Hand.png")
1824
+ bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/Hand.png")
1679
1825
  return QtGui.QCursor(bitmap)
1680
1826
 
1681
1827
  def cursorClosedHand():
1682
- bitmap = QtGui.QPixmap(source_folder+"/Handsqueezed.png")
1828
+ bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/Handsqueezed.png")
1683
1829
  return QtGui.QCursor(bitmap)
1684
1830
  def cursorZoomIn():
1685
- bitmap = QtGui.QPixmap(source_folder+"/zoom_in.png")
1831
+ bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/zoom_in.png")
1686
1832
  return QtGui.QCursor(bitmap)
1687
1833
  def cursorZoomOut():
1688
- bitmap = QtGui.QPixmap(source_folder+"/zoom_out.png")
1834
+ bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/zoom_out.png")
1689
1835
  return QtGui.QCursor(bitmap)
1690
1836
  def cursorRotate():
1691
- bitmap = QtGui.QPixmap(source_folder+"/rotate.png")
1837
+ bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/rotate.png")
1692
1838
  return QtGui.QCursor(bitmap)
1693
1839
  def cursorArrow():
1694
- #bitmap = QtGui.QPixmap(source_folder+"/arrow.png")
1840
+ #bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/arrow.png")
1695
1841
  return QtGui.QCursor(Qt.ArrowCursor)
1696
1842
  def cursorPaint():
1697
- bitmap = QtGui.QPixmap(source_folder+"/HandwritingPlus.png")
1843
+ bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/HandwritingPlus.png")
1698
1844
  return QtGui.QCursor(bitmap)
1699
1845
  def cursorPaintX():
1700
- bitmap = QtGui.QPixmap(source_folder+"/HandwritingPlusX.png")
1846
+ bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/HandwritingPlusX.png")
1701
1847
  return QtGui.QCursor(bitmap)
1702
1848
  def cursorCircle(size = 50):
1703
1849
 
@@ -1731,10 +1877,10 @@ def cursorCircle(size = 50):
1731
1877
  return QtGui.QCursor(pil_image_to_qpixmap(image))
1732
1878
 
1733
1879
  def cursorErase():
1734
- bitmap = QtGui.QPixmap(source_folder+"/HandwritingMinus.png")
1880
+ bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/HandwritingMinus.png")
1735
1881
  return QtGui.QCursor(bitmap)
1736
1882
  def cursorEraseX():
1737
- bitmap = QtGui.QPixmap(source_folder+"/HandwritingMinusX.png")
1883
+ bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/HandwritingMinusX.png")
1738
1884
  return QtGui.QCursor(bitmap)
1739
1885
 
1740
1886
  ###################### locate proper widgets ######################
@@ -3785,8 +3931,9 @@ def histogram_equalization(source):
3785
3931
  import cv2
3786
3932
  # Reshape the 3D image into a 2D array with shape (num_slices, height * width)
3787
3933
  num_slices, height, width = image.shape
3934
+ image = normalize_mri(image)
3788
3935
  flattened_image = image.reshape((num_slices, height * width))
3789
- flattened_image = normalize_mri(flattened_image)
3936
+ #flattened_image = normalize_mri(flattened_image)
3790
3937
  # Apply histogram equalization to the flattened image
3791
3938
  if method=='ehist':
3792
3939
  alg = cv2.equalizeHist