melage 0.0.65__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 (501) hide show
  1. melage/__init__.py +16 -0
  2. melage/cli.py +4 -0
  3. melage/graphics/GLGraphicsItem.py +286 -0
  4. melage/graphics/GLViewWidget.py +595 -0
  5. melage/graphics/Transform3D.py +55 -0
  6. melage/graphics/__init__.py +8 -0
  7. melage/graphics/functions.py +101 -0
  8. melage/graphics/items/GLAxisItem.py +149 -0
  9. melage/graphics/items/GLGridItem.py +178 -0
  10. melage/graphics/items/GLPolygonItem.py +77 -0
  11. melage/graphics/items/GLScatterPlotItem.py +135 -0
  12. melage/graphics/items/GLVolumeItem.py +280 -0
  13. melage/graphics/items/GLVolumeItem_b.py +237 -0
  14. melage/graphics/items/__init__.py +0 -0
  15. melage/graphics/shaders.py +202 -0
  16. melage/main.py +270 -0
  17. melage/requirements22.txt +25 -0
  18. melage/requirements_old.txt +28 -0
  19. melage/resource/0circle.png +0 -0
  20. melage/resource/0circle_faded.png +0 -0
  21. melage/resource/3d.png +0 -0
  22. melage/resource/3d.psd +0 -0
  23. melage/resource/3dFaded.png +0 -0
  24. melage/resource/Eraser.png +0 -0
  25. melage/resource/EraserFaded.png +0 -0
  26. melage/resource/EraserX.png +0 -0
  27. melage/resource/EraserXFaded.png +0 -0
  28. melage/resource/Eraser_icon.svg +79 -0
  29. melage/resource/Hand.png +0 -0
  30. melage/resource/HandIcons_0.png +0 -0
  31. melage/resource/Hand_IX.png +0 -0
  32. melage/resource/Hand_IXFaded.png +0 -0
  33. melage/resource/Handsqueezed.png +0 -0
  34. melage/resource/Handwriting (copy).png +0 -0
  35. melage/resource/Handwriting.png +0 -0
  36. melage/resource/HandwritingMinus.png +0 -0
  37. melage/resource/HandwritingMinusX.png +0 -0
  38. melage/resource/HandwritingPlus.png +0 -0
  39. melage/resource/HandwritingPlusX.png +0 -0
  40. melage/resource/Move_icon.svg +8 -0
  41. melage/resource/PngItem_2422924.png +0 -0
  42. melage/resource/about.png +0 -0
  43. melage/resource/about_logo.png +0 -0
  44. melage/resource/about_logo0.png +0 -0
  45. melage/resource/action_check.png +0 -0
  46. melage/resource/action_check_OFF.png +0 -0
  47. melage/resource/arrow).png +0 -0
  48. melage/resource/arrow.png +0 -0
  49. melage/resource/arrowFaded.png +0 -0
  50. melage/resource/arrow_org.png +0 -0
  51. melage/resource/arrow_org.png.png +0 -0
  52. melage/resource/arrows.png +0 -0
  53. melage/resource/authors.mp4 +0 -0
  54. melage/resource/box.png +0 -0
  55. melage/resource/check-image-icon-0.jpg +0 -0
  56. melage/resource/circle.png +0 -0
  57. melage/resource/circle_faded.png +0 -0
  58. melage/resource/circle_or.png +0 -0
  59. melage/resource/close.png +0 -0
  60. melage/resource/close_bg.png +0 -0
  61. melage/resource/color/Simple.txt +18 -0
  62. melage/resource/color/Tissue.txt +24 -0
  63. melage/resource/color/Tissue12.txt +27 -0
  64. melage/resource/color/albert_LUT.txt +102 -0
  65. melage/resource/color/mcrib_LUT.txt +102 -0
  66. melage/resource/color/pediatric1.txt +29 -0
  67. melage/resource/color/pediatric1_old.txt +27 -0
  68. melage/resource/color/pediatric2.txt +87 -0
  69. melage/resource/color/pediatric3.txt +29 -0
  70. melage/resource/color/pediatrics (copy).csv +103 -0
  71. melage/resource/color/tissue_seg.txt +4 -0
  72. melage/resource/contour.png +0 -0
  73. melage/resource/contour.svg +2 -0
  74. melage/resource/contourFaded.png +0 -0
  75. melage/resource/contourX.png +0 -0
  76. melage/resource/contourXFaded.png +0 -0
  77. melage/resource/dti.png +0 -0
  78. melage/resource/dti0.png +0 -0
  79. melage/resource/dti222.png +0 -0
  80. melage/resource/dti_or.png +0 -0
  81. melage/resource/eco.png +0 -0
  82. melage/resource/eco22.png +0 -0
  83. melage/resource/eco_old.png +0 -0
  84. melage/resource/eco_or.png +0 -0
  85. melage/resource/eco_or2.png +0 -0
  86. melage/resource/eco_seg.png +0 -0
  87. melage/resource/eco_seg_old.png +0 -0
  88. melage/resource/export.png +0 -0
  89. melage/resource/hand-grab-icon-10.jpg +0 -0
  90. melage/resource/hand-grab-icon-25.jpg +0 -0
  91. melage/resource/info.png +0 -0
  92. melage/resource/line.png +0 -0
  93. melage/resource/linefaded.png +0 -0
  94. melage/resource/load.png +0 -0
  95. melage/resource/main.ico +0 -0
  96. melage/resource/manual_images/3D_rightc.png +0 -0
  97. melage/resource/manual_images/3D_rightc_goto.png +0 -0
  98. melage/resource/manual_images/3D_rightc_paint.png +0 -0
  99. melage/resource/manual_images/3D_rightc_paint_draw1.png +0 -0
  100. melage/resource/manual_images/3D_rightc_paint_draw2.png +0 -0
  101. melage/resource/manual_images/3D_rightc_paint_render.png +0 -0
  102. melage/resource/manual_images/3D_rightc_paint_render2.png +0 -0
  103. melage/resource/manual_images/3D_rightc_paint_render3.png +0 -0
  104. melage/resource/manual_images/3D_rightc_paint_render4.png +0 -0
  105. melage/resource/manual_images/3D_rightc_paint_render5.png +0 -0
  106. melage/resource/manual_images/3D_rightc_paint_render6.png +0 -0
  107. melage/resource/manual_images/3D_rightc_seg.png +0 -0
  108. melage/resource/manual_images/exit_toolbar.png +0 -0
  109. melage/resource/manual_images/load_image_file.png +0 -0
  110. melage/resource/manual_images/load_image_file_openp.png +0 -0
  111. melage/resource/manual_images/main_page.png +0 -0
  112. melage/resource/manual_images/menu_file.png +0 -0
  113. melage/resource/manual_images/menu_file_export.png +0 -0
  114. melage/resource/manual_images/menu_file_import.png +0 -0
  115. melage/resource/manual_images/menu_file_settings.png +0 -0
  116. melage/resource/manual_images/menu_file_ss.png +0 -0
  117. melage/resource/manual_images/open_save_load.png +0 -0
  118. melage/resource/manual_images/panning_toolbar.png +0 -0
  119. melage/resource/manual_images/segmentation_toolbar.png +0 -0
  120. melage/resource/manual_images/tab_mri.png +0 -0
  121. melage/resource/manual_images/tab_us.png +0 -0
  122. melage/resource/manual_images/tabs.png +0 -0
  123. melage/resource/manual_images/toolbar_tools.png +0 -0
  124. melage/resource/manual_images/tools_basic.png +0 -0
  125. melage/resource/manual_images/tools_bet.png +0 -0
  126. melage/resource/manual_images/tools_cs.png +0 -0
  127. melage/resource/manual_images/tools_deepbet.png +0 -0
  128. melage/resource/manual_images/tools_imageinfo.png +0 -0
  129. melage/resource/manual_images/tools_maskO.png +0 -0
  130. melage/resource/manual_images/tools_masking.png +0 -0
  131. melage/resource/manual_images/tools_n4b.png +0 -0
  132. melage/resource/manual_images/tools_resize.png +0 -0
  133. melage/resource/manual_images/tools_ruler.png +0 -0
  134. melage/resource/manual_images/tools_seg.png +0 -0
  135. melage/resource/manual_images/tools_threshold.png +0 -0
  136. melage/resource/manual_images/tools_tools.png +0 -0
  137. melage/resource/manual_images/widget_color.png +0 -0
  138. melage/resource/manual_images/widget_color_add.png +0 -0
  139. melage/resource/manual_images/widget_color_add2.png +0 -0
  140. melage/resource/manual_images/widget_color_additional.png +0 -0
  141. melage/resource/manual_images/widget_images.png +0 -0
  142. melage/resource/manual_images/widget_images2.png +0 -0
  143. melage/resource/manual_images/widget_images3.png +0 -0
  144. melage/resource/manual_images/widget_marker.png +0 -0
  145. melage/resource/manual_images/widget_mri.png +0 -0
  146. melage/resource/manual_images/widget_mri2.png +0 -0
  147. melage/resource/manual_images/widget_segintensity.png +0 -0
  148. melage/resource/manual_images/widget_tab_mutualview.png +0 -0
  149. melage/resource/manual_images/widget_tab_mutualview2.png +0 -0
  150. melage/resource/manual_images/widget_table.png +0 -0
  151. melage/resource/manual_images/widget_table2.png +0 -0
  152. melage/resource/manual_images/widget_us.png +0 -0
  153. melage/resource/melage_top.ico +0 -0
  154. melage/resource/melage_top.png +0 -0
  155. melage/resource/melage_top0.png +0 -0
  156. melage/resource/melage_top1.png +0 -0
  157. melage/resource/melage_top4.png +0 -0
  158. melage/resource/mri (copy).png +0 -0
  159. melage/resource/mri.png +0 -0
  160. melage/resource/mri0.png +0 -0
  161. melage/resource/mri000.png +0 -0
  162. melage/resource/mri22.png +0 -0
  163. melage/resource/mri_big.png +0 -0
  164. melage/resource/mri_old.png +0 -0
  165. melage/resource/mri_seg.png +0 -0
  166. melage/resource/mri_seg_old.png +0 -0
  167. melage/resource/new.png +0 -0
  168. melage/resource/open.png +0 -0
  169. melage/resource/open2.png +0 -0
  170. melage/resource/pan.png +0 -0
  171. melage/resource/pencil.png +0 -0
  172. melage/resource/pencilFaded.png +0 -0
  173. melage/resource/points.png +0 -0
  174. melage/resource/pointsFaded.png +0 -0
  175. melage/resource/rotate.png +0 -0
  176. melage/resource/ruler.png +0 -0
  177. melage/resource/rulerFaded.png +0 -0
  178. melage/resource/s.png +0 -0
  179. melage/resource/s.psd +0 -0
  180. melage/resource/save.png +0 -0
  181. melage/resource/saveas.png +0 -0
  182. melage/resource/seg_mri.png +0 -0
  183. melage/resource/seg_mri2.png +0 -0
  184. melage/resource/settings.png +0 -0
  185. melage/resource/synch.png +0 -0
  186. melage/resource/synchFaded.png +0 -0
  187. melage/resource/theme/rc/.keep +1 -0
  188. melage/resource/theme/rc/arrow_down.png +0 -0
  189. melage/resource/theme/rc/arrow_down@2x.png +0 -0
  190. melage/resource/theme/rc/arrow_down_disabled.png +0 -0
  191. melage/resource/theme/rc/arrow_down_disabled@2x.png +0 -0
  192. melage/resource/theme/rc/arrow_down_focus.png +0 -0
  193. melage/resource/theme/rc/arrow_down_focus@2x.png +0 -0
  194. melage/resource/theme/rc/arrow_down_pressed.png +0 -0
  195. melage/resource/theme/rc/arrow_down_pressed@2x.png +0 -0
  196. melage/resource/theme/rc/arrow_left.png +0 -0
  197. melage/resource/theme/rc/arrow_left@2x.png +0 -0
  198. melage/resource/theme/rc/arrow_left_disabled.png +0 -0
  199. melage/resource/theme/rc/arrow_left_disabled@2x.png +0 -0
  200. melage/resource/theme/rc/arrow_left_focus.png +0 -0
  201. melage/resource/theme/rc/arrow_left_focus@2x.png +0 -0
  202. melage/resource/theme/rc/arrow_left_pressed.png +0 -0
  203. melage/resource/theme/rc/arrow_left_pressed@2x.png +0 -0
  204. melage/resource/theme/rc/arrow_right.png +0 -0
  205. melage/resource/theme/rc/arrow_right@2x.png +0 -0
  206. melage/resource/theme/rc/arrow_right_disabled.png +0 -0
  207. melage/resource/theme/rc/arrow_right_disabled@2x.png +0 -0
  208. melage/resource/theme/rc/arrow_right_focus.png +0 -0
  209. melage/resource/theme/rc/arrow_right_focus@2x.png +0 -0
  210. melage/resource/theme/rc/arrow_right_pressed.png +0 -0
  211. melage/resource/theme/rc/arrow_right_pressed@2x.png +0 -0
  212. melage/resource/theme/rc/arrow_up.png +0 -0
  213. melage/resource/theme/rc/arrow_up@2x.png +0 -0
  214. melage/resource/theme/rc/arrow_up_disabled.png +0 -0
  215. melage/resource/theme/rc/arrow_up_disabled@2x.png +0 -0
  216. melage/resource/theme/rc/arrow_up_focus.png +0 -0
  217. melage/resource/theme/rc/arrow_up_focus@2x.png +0 -0
  218. melage/resource/theme/rc/arrow_up_pressed.png +0 -0
  219. melage/resource/theme/rc/arrow_up_pressed@2x.png +0 -0
  220. melage/resource/theme/rc/base_icon.png +0 -0
  221. melage/resource/theme/rc/base_icon@2x.png +0 -0
  222. melage/resource/theme/rc/base_icon_disabled.png +0 -0
  223. melage/resource/theme/rc/base_icon_disabled@2x.png +0 -0
  224. melage/resource/theme/rc/base_icon_focus.png +0 -0
  225. melage/resource/theme/rc/base_icon_focus@2x.png +0 -0
  226. melage/resource/theme/rc/base_icon_pressed.png +0 -0
  227. melage/resource/theme/rc/base_icon_pressed@2x.png +0 -0
  228. melage/resource/theme/rc/branch_closed.png +0 -0
  229. melage/resource/theme/rc/branch_closed@2x.png +0 -0
  230. melage/resource/theme/rc/branch_closed_disabled.png +0 -0
  231. melage/resource/theme/rc/branch_closed_disabled@2x.png +0 -0
  232. melage/resource/theme/rc/branch_closed_focus.png +0 -0
  233. melage/resource/theme/rc/branch_closed_focus@2x.png +0 -0
  234. melage/resource/theme/rc/branch_closed_pressed.png +0 -0
  235. melage/resource/theme/rc/branch_closed_pressed@2x.png +0 -0
  236. melage/resource/theme/rc/branch_end.png +0 -0
  237. melage/resource/theme/rc/branch_end@2x.png +0 -0
  238. melage/resource/theme/rc/branch_end_disabled.png +0 -0
  239. melage/resource/theme/rc/branch_end_disabled@2x.png +0 -0
  240. melage/resource/theme/rc/branch_end_focus.png +0 -0
  241. melage/resource/theme/rc/branch_end_focus@2x.png +0 -0
  242. melage/resource/theme/rc/branch_end_pressed.png +0 -0
  243. melage/resource/theme/rc/branch_end_pressed@2x.png +0 -0
  244. melage/resource/theme/rc/branch_line.png +0 -0
  245. melage/resource/theme/rc/branch_line@2x.png +0 -0
  246. melage/resource/theme/rc/branch_line_disabled.png +0 -0
  247. melage/resource/theme/rc/branch_line_disabled@2x.png +0 -0
  248. melage/resource/theme/rc/branch_line_focus.png +0 -0
  249. melage/resource/theme/rc/branch_line_focus@2x.png +0 -0
  250. melage/resource/theme/rc/branch_line_pressed.png +0 -0
  251. melage/resource/theme/rc/branch_line_pressed@2x.png +0 -0
  252. melage/resource/theme/rc/branch_more.png +0 -0
  253. melage/resource/theme/rc/branch_more@2x.png +0 -0
  254. melage/resource/theme/rc/branch_more_disabled.png +0 -0
  255. melage/resource/theme/rc/branch_more_disabled@2x.png +0 -0
  256. melage/resource/theme/rc/branch_more_focus.png +0 -0
  257. melage/resource/theme/rc/branch_more_focus@2x.png +0 -0
  258. melage/resource/theme/rc/branch_more_pressed.png +0 -0
  259. melage/resource/theme/rc/branch_more_pressed@2x.png +0 -0
  260. melage/resource/theme/rc/branch_open.png +0 -0
  261. melage/resource/theme/rc/branch_open@2x.png +0 -0
  262. melage/resource/theme/rc/branch_open_disabled.png +0 -0
  263. melage/resource/theme/rc/branch_open_disabled@2x.png +0 -0
  264. melage/resource/theme/rc/branch_open_focus.png +0 -0
  265. melage/resource/theme/rc/branch_open_focus@2x.png +0 -0
  266. melage/resource/theme/rc/branch_open_pressed.png +0 -0
  267. melage/resource/theme/rc/branch_open_pressed@2x.png +0 -0
  268. melage/resource/theme/rc/checkbox_checked.png +0 -0
  269. melage/resource/theme/rc/checkbox_checked0.png +0 -0
  270. melage/resource/theme/rc/checkbox_checked@2x.png +0 -0
  271. melage/resource/theme/rc/checkbox_checked@2x0.png +0 -0
  272. melage/resource/theme/rc/checkbox_checked@2x000.png.png +0 -0
  273. melage/resource/theme/rc/checkbox_checked_disabled.png +0 -0
  274. melage/resource/theme/rc/checkbox_checked_disabled0.png +0 -0
  275. melage/resource/theme/rc/checkbox_checked_disabled@2x.png +0 -0
  276. melage/resource/theme/rc/checkbox_checked_disabled@2x0.png +0 -0
  277. melage/resource/theme/rc/checkbox_checked_focus.png +0 -0
  278. melage/resource/theme/rc/checkbox_checked_focus0.png +0 -0
  279. melage/resource/theme/rc/checkbox_checked_focus@2x.png +0 -0
  280. melage/resource/theme/rc/checkbox_checked_focus@2x0.png +0 -0
  281. melage/resource/theme/rc/checkbox_checked_pressed.png +0 -0
  282. melage/resource/theme/rc/checkbox_checked_pressed0.png +0 -0
  283. melage/resource/theme/rc/checkbox_checked_pressed@2x.png +0 -0
  284. melage/resource/theme/rc/checkbox_checked_pressed@2x0.png +0 -0
  285. melage/resource/theme/rc/checkbox_indeterminate.png +0 -0
  286. melage/resource/theme/rc/checkbox_indeterminate@2x.png +0 -0
  287. melage/resource/theme/rc/checkbox_indeterminate_disabled.png +0 -0
  288. melage/resource/theme/rc/checkbox_indeterminate_disabled@2x.png +0 -0
  289. melage/resource/theme/rc/checkbox_indeterminate_focus.png +0 -0
  290. melage/resource/theme/rc/checkbox_indeterminate_focus@2x.png +0 -0
  291. melage/resource/theme/rc/checkbox_indeterminate_pressed.png +0 -0
  292. melage/resource/theme/rc/checkbox_indeterminate_pressed@2x.png +0 -0
  293. melage/resource/theme/rc/checkbox_unchecked.png +0 -0
  294. melage/resource/theme/rc/checkbox_unchecked0.png +0 -0
  295. melage/resource/theme/rc/checkbox_unchecked00.png +0 -0
  296. melage/resource/theme/rc/checkbox_unchecked@2x.png +0 -0
  297. melage/resource/theme/rc/checkbox_unchecked@2x0.png +0 -0
  298. melage/resource/theme/rc/checkbox_unchecked@2x00.png +0 -0
  299. melage/resource/theme/rc/checkbox_unchecked_disabled.png +0 -0
  300. melage/resource/theme/rc/checkbox_unchecked_disabled0.png +0 -0
  301. melage/resource/theme/rc/checkbox_unchecked_disabled00.png +0 -0
  302. melage/resource/theme/rc/checkbox_unchecked_disabled@2x.png +0 -0
  303. melage/resource/theme/rc/checkbox_unchecked_disabled@2x0.png +0 -0
  304. melage/resource/theme/rc/checkbox_unchecked_disabled@2x00.png +0 -0
  305. melage/resource/theme/rc/checkbox_unchecked_focus.png +0 -0
  306. melage/resource/theme/rc/checkbox_unchecked_focus0.png +0 -0
  307. melage/resource/theme/rc/checkbox_unchecked_focus00.png +0 -0
  308. melage/resource/theme/rc/checkbox_unchecked_focus@2x.png +0 -0
  309. melage/resource/theme/rc/checkbox_unchecked_focus@2x0.png +0 -0
  310. melage/resource/theme/rc/checkbox_unchecked_focus@2x00.png +0 -0
  311. melage/resource/theme/rc/checkbox_unchecked_pressed.png +0 -0
  312. melage/resource/theme/rc/checkbox_unchecked_pressed0.png +0 -0
  313. melage/resource/theme/rc/checkbox_unchecked_pressed00.png +0 -0
  314. melage/resource/theme/rc/checkbox_unchecked_pressed@2x.png +0 -0
  315. melage/resource/theme/rc/checkbox_unchecked_pressed@2x0.png +0 -0
  316. melage/resource/theme/rc/checkbox_unchecked_pressed@2x00.png +0 -0
  317. melage/resource/theme/rc/line_horizontal.png +0 -0
  318. melage/resource/theme/rc/line_horizontal@2x.png +0 -0
  319. melage/resource/theme/rc/line_horizontal_disabled.png +0 -0
  320. melage/resource/theme/rc/line_horizontal_disabled@2x.png +0 -0
  321. melage/resource/theme/rc/line_horizontal_focus.png +0 -0
  322. melage/resource/theme/rc/line_horizontal_focus@2x.png +0 -0
  323. melage/resource/theme/rc/line_horizontal_pressed.png +0 -0
  324. melage/resource/theme/rc/line_horizontal_pressed@2x.png +0 -0
  325. melage/resource/theme/rc/line_vertical.png +0 -0
  326. melage/resource/theme/rc/line_vertical@2x.png +0 -0
  327. melage/resource/theme/rc/line_vertical_disabled.png +0 -0
  328. melage/resource/theme/rc/line_vertical_disabled@2x.png +0 -0
  329. melage/resource/theme/rc/line_vertical_focus.png +0 -0
  330. melage/resource/theme/rc/line_vertical_focus@2x.png +0 -0
  331. melage/resource/theme/rc/line_vertical_pressed.png +0 -0
  332. melage/resource/theme/rc/line_vertical_pressed@2x.png +0 -0
  333. melage/resource/theme/rc/radio_checked.png +0 -0
  334. melage/resource/theme/rc/radio_checked@2x.png +0 -0
  335. melage/resource/theme/rc/radio_checked_disabled.png +0 -0
  336. melage/resource/theme/rc/radio_checked_disabled@2x.png +0 -0
  337. melage/resource/theme/rc/radio_checked_focus.png +0 -0
  338. melage/resource/theme/rc/radio_checked_focus@2x.png +0 -0
  339. melage/resource/theme/rc/radio_checked_pressed.png +0 -0
  340. melage/resource/theme/rc/radio_checked_pressed@2x.png +0 -0
  341. melage/resource/theme/rc/radio_unchecked.png +0 -0
  342. melage/resource/theme/rc/radio_unchecked@2x.png +0 -0
  343. melage/resource/theme/rc/radio_unchecked_disabled.png +0 -0
  344. melage/resource/theme/rc/radio_unchecked_disabled@2x.png +0 -0
  345. melage/resource/theme/rc/radio_unchecked_focus.png +0 -0
  346. melage/resource/theme/rc/radio_unchecked_focus@2x.png +0 -0
  347. melage/resource/theme/rc/radio_unchecked_pressed.png +0 -0
  348. melage/resource/theme/rc/radio_unchecked_pressed@2x.png +0 -0
  349. melage/resource/theme/rc/toolbar_move_horizontal.png +0 -0
  350. melage/resource/theme/rc/toolbar_move_horizontal@2x.png +0 -0
  351. melage/resource/theme/rc/toolbar_move_horizontal_disabled.png +0 -0
  352. melage/resource/theme/rc/toolbar_move_horizontal_disabled@2x.png +0 -0
  353. melage/resource/theme/rc/toolbar_move_horizontal_focus.png +0 -0
  354. melage/resource/theme/rc/toolbar_move_horizontal_focus@2x.png +0 -0
  355. melage/resource/theme/rc/toolbar_move_horizontal_pressed.png +0 -0
  356. melage/resource/theme/rc/toolbar_move_horizontal_pressed@2x.png +0 -0
  357. melage/resource/theme/rc/toolbar_move_vertical.png +0 -0
  358. melage/resource/theme/rc/toolbar_move_vertical@2x.png +0 -0
  359. melage/resource/theme/rc/toolbar_move_vertical_disabled.png +0 -0
  360. melage/resource/theme/rc/toolbar_move_vertical_disabled@2x.png +0 -0
  361. melage/resource/theme/rc/toolbar_move_vertical_focus.png +0 -0
  362. melage/resource/theme/rc/toolbar_move_vertical_focus@2x.png +0 -0
  363. melage/resource/theme/rc/toolbar_move_vertical_pressed.png +0 -0
  364. melage/resource/theme/rc/toolbar_move_vertical_pressed@2x.png +0 -0
  365. melage/resource/theme/rc/toolbar_separator_horizontal.png +0 -0
  366. melage/resource/theme/rc/toolbar_separator_horizontal@2x.png +0 -0
  367. melage/resource/theme/rc/toolbar_separator_horizontal_disabled.png +0 -0
  368. melage/resource/theme/rc/toolbar_separator_horizontal_disabled@2x.png +0 -0
  369. melage/resource/theme/rc/toolbar_separator_horizontal_focus.png +0 -0
  370. melage/resource/theme/rc/toolbar_separator_horizontal_focus@2x.png +0 -0
  371. melage/resource/theme/rc/toolbar_separator_horizontal_pressed.png +0 -0
  372. melage/resource/theme/rc/toolbar_separator_horizontal_pressed@2x.png +0 -0
  373. melage/resource/theme/rc/toolbar_separator_vertical.png +0 -0
  374. melage/resource/theme/rc/toolbar_separator_vertical@2x.png +0 -0
  375. melage/resource/theme/rc/toolbar_separator_vertical_disabled.png +0 -0
  376. melage/resource/theme/rc/toolbar_separator_vertical_disabled@2x.png +0 -0
  377. melage/resource/theme/rc/toolbar_separator_vertical_focus.png +0 -0
  378. melage/resource/theme/rc/toolbar_separator_vertical_focus@2x.png +0 -0
  379. melage/resource/theme/rc/toolbar_separator_vertical_pressed.png +0 -0
  380. melage/resource/theme/rc/toolbar_separator_vertical_pressed@2x.png +0 -0
  381. melage/resource/theme/rc/transparent.png +0 -0
  382. melage/resource/theme/rc/transparent@2x.png +0 -0
  383. melage/resource/theme/rc/transparent_disabled.png +0 -0
  384. melage/resource/theme/rc/transparent_disabled@2x.png +0 -0
  385. melage/resource/theme/rc/transparent_focus.png +0 -0
  386. melage/resource/theme/rc/transparent_focus@2x.png +0 -0
  387. melage/resource/theme/rc/transparent_pressed.png +0 -0
  388. melage/resource/theme/rc/transparent_pressed@2x.png +0 -0
  389. melage/resource/theme/rc/window_close.png +0 -0
  390. melage/resource/theme/rc/window_close@2x.png +0 -0
  391. melage/resource/theme/rc/window_close_disabled.png +0 -0
  392. melage/resource/theme/rc/window_close_disabled@2x.png +0 -0
  393. melage/resource/theme/rc/window_close_focus.png +0 -0
  394. melage/resource/theme/rc/window_close_focus@2x.png +0 -0
  395. melage/resource/theme/rc/window_close_pressed.png +0 -0
  396. melage/resource/theme/rc/window_close_pressed@2x.png +0 -0
  397. melage/resource/theme/rc/window_grip.png +0 -0
  398. melage/resource/theme/rc/window_grip@2x.png +0 -0
  399. melage/resource/theme/rc/window_grip_disabled.png +0 -0
  400. melage/resource/theme/rc/window_grip_disabled@2x.png +0 -0
  401. melage/resource/theme/rc/window_grip_focus.png +0 -0
  402. melage/resource/theme/rc/window_grip_focus@2x.png +0 -0
  403. melage/resource/theme/rc/window_grip_pressed.png +0 -0
  404. melage/resource/theme/rc/window_grip_pressed@2x.png +0 -0
  405. melage/resource/theme/rc/window_minimize.png +0 -0
  406. melage/resource/theme/rc/window_minimize@2x.png +0 -0
  407. melage/resource/theme/rc/window_minimize_disabled.png +0 -0
  408. melage/resource/theme/rc/window_minimize_disabled@2x.png +0 -0
  409. melage/resource/theme/rc/window_minimize_focus.png +0 -0
  410. melage/resource/theme/rc/window_minimize_focus@2x.png +0 -0
  411. melage/resource/theme/rc/window_minimize_pressed.png +0 -0
  412. melage/resource/theme/rc/window_minimize_pressed@2x.png +0 -0
  413. melage/resource/theme/rc/window_undock.png +0 -0
  414. melage/resource/theme/rc/window_undock@2x.png +0 -0
  415. melage/resource/theme/rc/window_undock_disabled.png +0 -0
  416. melage/resource/theme/rc/window_undock_disabled@2x.png +0 -0
  417. melage/resource/theme/rc/window_undock_focus.png +0 -0
  418. melage/resource/theme/rc/window_undock_focus@2x.png +0 -0
  419. melage/resource/theme/rc/window_undock_pressed.png +0 -0
  420. melage/resource/theme/rc/window_undock_pressed@2x.png +0 -0
  421. melage/resource/theme/style.qss +2223 -0
  422. melage/resource/tract.png +0 -0
  423. melage/resource/view1.png +0 -0
  424. melage/resource/view1_eco.png +0 -0
  425. melage/resource/view1_mri.png +0 -0
  426. melage/resource/view1_seg.png +0 -0
  427. melage/resource/view2.png +0 -0
  428. melage/resource/view2_seg.png +0 -0
  429. melage/resource/w.png +0 -0
  430. melage/resource/zoom_in.png +0 -0
  431. melage/resource/zoom_inFaded.png +0 -0
  432. melage/resource/zoom_out.png +0 -0
  433. melage/resource/zoom_outFaded.png +0 -0
  434. melage/some_notes.txt +3 -0
  435. melage/utils/DispalyIm.py +2788 -0
  436. melage/utils/GMM.py +720 -0
  437. melage/utils/Shaders_120.py +257 -0
  438. melage/utils/Shaders_330.py +314 -0
  439. melage/utils/Shaders_bu.py +314 -0
  440. melage/utils/__init__0.py +7 -0
  441. melage/utils/brain_extraction_helper.py +234 -0
  442. melage/utils/custom_QScrollBar.py +61 -0
  443. melage/utils/glScientific.py +1554 -0
  444. melage/utils/glScientific_bc.py +1585 -0
  445. melage/utils/readData.py +1061 -0
  446. melage/utils/registration.py +512 -0
  447. melage/utils/source_folder.py +18 -0
  448. melage/utils/utils.py +3808 -0
  449. melage/version.txt +1 -0
  450. melage/widgets/ApplyMask.py +212 -0
  451. melage/widgets/ChangeSystem.py +152 -0
  452. melage/widgets/DeepLModels/InfantSegment/Unet.py +464 -0
  453. melage/widgets/DeepLModels/NPP/dataset/mri_dataset_affine.py +149 -0
  454. melage/widgets/DeepLModels/NPP/models/checkpoints/npp_v1.pth.py +0 -0
  455. melage/widgets/DeepLModels/NPP/models/losses.py +146 -0
  456. melage/widgets/DeepLModels/NPP/models/model.py +272 -0
  457. melage/widgets/DeepLModels/NPP/models/utils.py +303 -0
  458. melage/widgets/DeepLModels/NPP/npp.py +116 -0
  459. melage/widgets/DeepLModels/NPP/requirements.txt +8 -0
  460. melage/widgets/DeepLModels/NPP/train/train.py +116 -0
  461. melage/widgets/DeepLModels/Unet3DAtt.py +657 -0
  462. melage/widgets/DeepLModels/Unet3D_basic.py +648 -0
  463. melage/widgets/DeepLModels/new_unet.py +652 -0
  464. melage/widgets/DeepLModels/new_unet_old.py +639 -0
  465. melage/widgets/DeepLModels/new_unet_old2.py +658 -0
  466. melage/widgets/HistImage.py +153 -0
  467. melage/widgets/ImageThresholding.py +222 -0
  468. melage/widgets/MaskOperations.py +147 -0
  469. melage/widgets/N4Dialog.py +241 -0
  470. melage/widgets/Segmentation/FCM.py +1553 -0
  471. melage/widgets/Segmentation/__init__.py +588 -0
  472. melage/widgets/Segmentation/utils.py +417 -0
  473. melage/widgets/SemiAutoSeg.py +666 -0
  474. melage/widgets/Synthstrip.py +141 -0
  475. melage/widgets/__init__0.py +5 -0
  476. melage/widgets/about.py +246 -0
  477. melage/widgets/activation.py +437 -0
  478. melage/widgets/activator.py +147 -0
  479. melage/widgets/be_dl.py +409 -0
  480. melage/widgets/be_dl_unet3d.py +441 -0
  481. melage/widgets/brain_extraction.py +855 -0
  482. melage/widgets/brain_extraction_dl.py +887 -0
  483. melage/widgets/brain_extraction_dl_bu.py +869 -0
  484. melage/widgets/colorwidget.py +100 -0
  485. melage/widgets/dockWidgets.py +2005 -0
  486. melage/widgets/enhanceImWidget.py +109 -0
  487. melage/widgets/fileDialog_widget.py +275 -0
  488. melage/widgets/iminfo.py +346 -0
  489. melage/widgets/mainwindow_widget.py +6775 -0
  490. melage/widgets/melageAbout.py +123 -0
  491. melage/widgets/openglWidgets.py +556 -0
  492. melage/widgets/registrationWidget.py +342 -0
  493. melage/widgets/repeat_widget.py +74 -0
  494. melage/widgets/screenshot_widget.py +138 -0
  495. melage/widgets/settings_widget.py +77 -0
  496. melage/widgets/tranformationWidget.py +275 -0
  497. melage-0.0.65.dist-info/METADATA +742 -0
  498. melage-0.0.65.dist-info/RECORD +501 -0
  499. melage-0.0.65.dist-info/WHEEL +5 -0
  500. melage-0.0.65.dist-info/entry_points.txt +2 -0
  501. melage-0.0.65.dist-info/top_level.txt +1 -0
@@ -0,0 +1,666 @@
1
+ __AUTHOR__ = 'Bahram Jafrasteh'
2
+
3
+ """
4
+ Main Automatic Segmentation class
5
+ """
6
+ import sys
7
+ sys.path.append('../..')
8
+
9
+ import os
10
+ import numpy as np
11
+ import nibabel as nib
12
+ from PyQt5 import QtCore, QtGui, QtWidgets
13
+ from functools import partial
14
+ from melage.utils.utils import get_back_data, normalize_mri
15
+ import torch.nn.functional as F
16
+ from PyQt5.QtCore import pyqtSignal
17
+ import sys
18
+ from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout
19
+ from PyQt5.QtCore import Qt
20
+ from melage.utils.utils import convert_to_ras, LargestCC, resample_to_size, extract_patches, adapt_to_size
21
+ def to_str(val):
22
+ return '{:.2f}'.format(val)
23
+
24
+ def remove_zero(f_data, value=0):
25
+ """
26
+ Remove non segmented areas from image
27
+ :param f_data:
28
+ :param value:
29
+ :return:
30
+ """
31
+
32
+ xs, ys, zs = np.where(f_data > value) #find zero values
33
+ tol = 4
34
+
35
+ min_max = []
36
+ for x in [xs, ys, zs]:
37
+ minx = min(x)-tol if min(x)-tol>1 else min(x)
38
+ maxx = max(x) + tol if max(x) + tol < f_data.shape[0]-1 else max(x)
39
+ min_max.append([minx, maxx])
40
+ 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]
41
+
42
+ return f_data, min_max
43
+
44
+ def centralize_image(img, maxas=128, border=None):
45
+ """
46
+ Put image in the center
47
+ :param img:
48
+ :param maxas:
49
+ :param border:
50
+ :return:
51
+ """
52
+
53
+ n = img.shape
54
+ if type(maxas) != list:
55
+ maxas= [maxas, maxas, maxas]
56
+ pads = np.array([maxas[i] - a for i, a in enumerate(n)])
57
+ pads_r = pads // 2
58
+ pads_l = pads - pads_r
59
+ npads_l = pads_l * -1
60
+ npads_r = pads_r * -1
61
+ if border is None:
62
+ border = img[0,0,0]
63
+ new_img = np.ones((maxas[0], maxas[1], maxas[2]))*border
64
+
65
+ pads_r[pads_r < 0] = 0
66
+ pads_l[pads_l < 0] = 0
67
+ npads_l[npads_l < 0] = 0
68
+ npads_r[npads_r < 0] = 0
69
+ # print(pads_l, pads_r)
70
+ new_img[pads_r[0]:maxas[0] - pads_l[0], pads_r[1]:maxas[1] - pads_l[1], pads_r[2]:maxas[2] - pads_l[2]] = img[
71
+ npads_r[0]:n[0] -npads_l[0],
72
+ npads_r[1]:n[1] -npads_l[1],
73
+ npads_r[2]:n[2] -npads_l[2]]
74
+ return new_img, [pads, pads_l, pads_r, npads_l, npads_r, n]
75
+
76
+ class SA_DL(QDialog):
77
+ """
78
+ This class has been implemented to use deep learning algorithms for brain extraction
79
+ """
80
+ closeSig = pyqtSignal()
81
+ betcomp = pyqtSignal(int)
82
+ datachange = pyqtSignal()
83
+ back_orig = pyqtSignal(int)
84
+
85
+ backbutton = pyqtSignal()
86
+ """
87
+
88
+ """
89
+ def __init__(self, parent=None
90
+ ):
91
+ super(SA_DL, self).__init__(parent)
92
+ #self.load_filepath = 'widgets/Hybrid_latest.pth'
93
+ self._curent_weight_dir = os.path.dirname(os.path.join(os.getcwd()))
94
+ """
95
+ Initialization of SemiAutomatic Segmentor
96
+
97
+ Computes image range/thresholds and
98
+ estimates the brain radius
99
+ """
100
+ def set_pars(self, threshold=-0.5, remove_extra_bone=True):
101
+ #print("Initializing...")
102
+
103
+ # get image resolution
104
+
105
+ self.threshold = threshold
106
+ self.borderp = 0.0
107
+
108
+ # store brain extraction parameters
109
+ self.setupUi()
110
+ def setData(self, img, res):
111
+ # store the image
112
+ img = nib.Nifti1Image(img.get_fdata()[::-1, ::-1, ::-1].transpose(2, 1, 0), img.affine, img.header)
113
+ self.img = img
114
+ self.initial_mask = None
115
+ self.shape = img.shape # 3D shape
116
+
117
+
118
+
119
+
120
+ def activate_advanced(self, value):
121
+ self.widget.setEnabled(value)
122
+
123
+ def setupUi(self):
124
+ Dialog = self.window()
125
+ Dialog.setObjectName("N4")
126
+ Dialog.resize(500, 220)
127
+ self.grid_main = QtWidgets.QGridLayout(self)
128
+ self.grid_main.setContentsMargins(0, 0, 0, 0)
129
+ self.grid_main.setObjectName("gridLayout")
130
+
131
+ self.hbox = QtWidgets.QHBoxLayout()
132
+ self.hbox.setContentsMargins(0, 0, 0, 0)
133
+ self.hbox.setObjectName("gridLayout")
134
+ self.grid_main.addLayout(self.hbox, 0, 0)
135
+
136
+ self.checkBox = QtWidgets.QCheckBox()
137
+ self.hbox.addWidget(self.checkBox, 0)
138
+ self.checkBox.setObjectName("checkBox")
139
+ self.checkBox.stateChanged.connect(self.activate_advanced)
140
+ self.comboBox_image = QtWidgets.QComboBox()
141
+ self.comboBox_image.setGeometry(QtCore.QRect(20, 10, 321, 25))
142
+ self.comboBox_image.setObjectName("comboBox")
143
+ for i in range(2):
144
+ self.comboBox_image.addItem("")
145
+ self.comboBox_image.currentIndexChanged.connect(self.datachange)
146
+
147
+ self.comboBox_models = QtWidgets.QComboBox()
148
+ self.comboBox_models.setGeometry(QtCore.QRect(20, 10, 321, 25))
149
+ self.comboBox_models.setObjectName("comboBox")
150
+ for i in range(4):
151
+ self.comboBox_models.addItem("")
152
+ self.comboBox_models.currentIndexChanged.connect(partial(self.parChanged, True))
153
+
154
+
155
+ self.hbox.addWidget(self.comboBox_image, 1)
156
+ self.hbox.addWidget(self.comboBox_models, 2)
157
+
158
+
159
+ self.progressBar = QtWidgets.QProgressBar()
160
+ self.progressBar.setEnabled(False)
161
+ self.progressBar.setProperty("value", 0)
162
+ self.progressBar.setAlignment(QtCore.Qt.AlignCenter)
163
+ self.progressBar.setObjectName("progressBar")
164
+ self.progressBar.setMaximum(100)
165
+
166
+
167
+
168
+ self.hbox2 = QtWidgets.QHBoxLayout()
169
+ self.hbox2.setContentsMargins(0, 0, 0, 0)
170
+ self.hbox2.setObjectName("gridLayout")
171
+ self.hbox2.addWidget(self.progressBar, 1)
172
+
173
+
174
+
175
+ self.widget = QtWidgets.QWidget()
176
+ self.widget.setObjectName("widget")
177
+ self.gridLayout = QtWidgets.QGridLayout(self.widget)
178
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
179
+ self.gridLayout.setObjectName("gridLayout")
180
+ self.splitter_3 = QtWidgets.QSplitter(self.widget)
181
+ self.splitter_3.setOrientation(QtCore.Qt.Horizontal)
182
+ self.splitter_3.setObjectName("splitter_3")
183
+
184
+
185
+ self.gridLayout.addWidget(self.splitter_3, 0, 0, 1, 1)
186
+ self.splitter = QtWidgets.QSplitter(self.widget)
187
+ self.splitter.setOrientation(QtCore.Qt.Horizontal)
188
+ self.splitter.setObjectName("splitter")
189
+ self.checkbox_cuda = QtWidgets.QCheckBox(self.splitter)
190
+ #self.checkbox_cuda.setAlignment(QtCore.Qt.AlignCenter)
191
+ self.checkbox_cuda.setObjectName("checkbox_cuda")
192
+ self.checkbox_cuda.setChecked(False)
193
+
194
+
195
+
196
+ #self.checkbox_bone = QtWidgets.QCheckBox(self.splitter)
197
+ #self.checkbox_bone.setObjectName("histogram_bone")
198
+ #self.checkbox_bone.setChecked(False)
199
+ self.label_type = QtWidgets.QLabel(self.splitter)
200
+ self.label_type.setAlignment(QtCore.Qt.AlignCenter)
201
+ self.label_type.setObjectName("label")
202
+
203
+
204
+
205
+
206
+ self.gridLayout.addWidget(self.splitter, 1, 0, 1, 1)
207
+
208
+
209
+
210
+ self.splitter_2 = QtWidgets.QSplitter(self.widget)
211
+ self.splitter_2.setOrientation(QtCore.Qt.Horizontal)
212
+ self.splitter_2.setObjectName("splitter_2")
213
+
214
+
215
+
216
+
217
+
218
+ self.pushButton_original = QtWidgets.QPushButton(self.widget)
219
+ self.pushButton_original.setObjectName("pushButton_2")
220
+ self.pushButton_original.clicked.connect(self.back_original)
221
+ self.pushButton_original.setVisible(False)
222
+
223
+ #self.label_pma = QtWidgets.QLabel(self.splitter_2)
224
+ #self.label_pma.setAlignment(QtCore.Qt.AlignCenter)
225
+ #self.label_pma.setObjectName("label")
226
+ #self.border_pix = QtWidgets.QDoubleSpinBox(self.splitter_2)
227
+ #self.border_pix.setObjectName("PMA")
228
+ #self.border_pix.setValue((self.borderp))
229
+ #self.border_pix.setMaximum(150)
230
+ #self.border_pix.setMinimum(0)
231
+ #self.border_pix.setSingleStep(5)
232
+ #self.border_pix.valueChanged.connect(partial(self.parChanged, False))
233
+ self.gridLayout.addWidget(self.splitter_2, 2, 0, 1, 1)
234
+
235
+
236
+ self.splitter_3 = QtWidgets.QSplitter(self.widget)
237
+ self.splitter_3.setOrientation(QtCore.Qt.Horizontal)
238
+ self.splitter_3.setObjectName("splitter_3")
239
+
240
+ self.label_fl = QtWidgets.QLabel(self.splitter_3)
241
+ self.label_fl.setAlignment(QtCore.Qt.AlignCenter)
242
+ self.label_fl.setObjectName("label_5")
243
+ self.load_filepath = os.path.join(self._curent_weight_dir)
244
+ self.bt_load_weight = QtWidgets.QPushButton(self.splitter_3)
245
+ self.bt_load_weight.setObjectName("pushButton")
246
+ self.bt_load_weight.pressed.connect(self.load_weight_dialog)
247
+ self.bt_load_weight.setDefault(False)
248
+ self.pushButton = QtWidgets.QPushButton()
249
+
250
+ self.pushButton.setObjectName("pushButton")
251
+ self.pushButton.pressed.connect(self.accepted_emit)
252
+ self.hbox2.addWidget(self.pushButton, 0)
253
+ self.pushButton.setDefault(True)
254
+ self.gridLayout.addWidget(self.splitter_3, 3, 0, 1, 1)
255
+
256
+ self.widget.setEnabled(False)
257
+
258
+
259
+ self.grid_main.addWidget(self.widget)
260
+ self.grid_main.addLayout(self.hbox2, 20, 0)
261
+
262
+ self.label_pr = QtWidgets.QLabel()
263
+ self.label_pr.setAlignment(QtCore.Qt.AlignCenter)
264
+ self.label_pr.setObjectName("label_2")
265
+ self.label_pr.setText('fdfdf')
266
+ self.label_pr.setVisible(False)
267
+
268
+ self.grid_main.addWidget(self.label_pr)
269
+ self.retranslateUi(Dialog)
270
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
271
+
272
+
273
+ def resetParams(self, state):
274
+
275
+ self.init_im_rec = None
276
+ self.initial_mask = None
277
+
278
+ def back_original(self):
279
+ self.back_orig.emit(0)
280
+ self.pushButton_original.setVisible(False)
281
+
282
+ def parChanged(self, model_changed=True):
283
+ """
284
+ if model parameter changed the user needs to run the algorithm again
285
+ :param model_changed:
286
+ :return:
287
+ """
288
+ self.initial_mask = None
289
+ if model_changed:
290
+ ci = self.comboBox_models.currentIndex()
291
+ self.load_filepath = os.path.join(self._curent_weight_dir,'models','NMPNet_v1.pth')
292
+ self.label_fl.setText(self.load_filepath)
293
+ def load_weight_dialog(self):
294
+ opts = QtWidgets.QFileDialog.DontUseNativeDialog
295
+ pwd = os.path.abspath(__file__)
296
+ source_dir = os.path.dirname(os.path.dirname(pwd))
297
+ fileObj = QtWidgets.QFileDialog.getOpenFileName(self, "Open File", source_dir, "pth (*.pth *.pt)", options=opts)
298
+ if fileObj[0] == '':
299
+ return
300
+ self.load_filepath = fileObj[0]
301
+ self.label_fl.setText(self.load_filepath)
302
+ self.initial_mask = None
303
+ self.init_im_rec = None
304
+ def clear(self):
305
+ # store the image
306
+ self.img = None
307
+ self.shape = None # 3D shape
308
+ self.mask = None
309
+ self.im_rec = None
310
+ self.initial_mask = None
311
+ self.init_im_rec = None
312
+
313
+ def retranslateUi(self, Dialog):
314
+ _translate = QtCore.QCoreApplication.translate
315
+ Dialog.setWindowTitle(_translate("Dialog", "DEEPL BET"))
316
+ self.checkBox.setText(_translate("Dialog", "Advanced"))
317
+ self.comboBox_image.setItemText(0, _translate("Dialog", "View 1"))
318
+ self.comboBox_image.setItemText(1, _translate("Dialog", "View 2"))
319
+
320
+ self.comboBox_models.setItemText(0, _translate("Dialog", "Segmentor NET"))
321
+
322
+
323
+ self.pushButton.setText(_translate("Dialog", "Apply"))
324
+ self.pushButton_original.setText(_translate("Dialog", "Back"))
325
+ self.checkbox_cuda.setText(_translate("Dialog", "CUDA"))
326
+
327
+
328
+ self.bt_load_weight.setText(_translate("Dialog", "Load Network Weights"))
329
+
330
+
331
+
332
+
333
+ self.label_fl.setText(_translate("Dialog", self.load_filepath))
334
+
335
+
336
+ def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
337
+ self.closeSig.emit()
338
+ super(SA_DL, self).closeEvent(a0)
339
+
340
+ def accepted_emit(self):
341
+ if not hasattr(self,'initial_mask'):
342
+ return
343
+ try:
344
+ self.label_pr.setVisible(True)
345
+ self.label_pr.setText('Initialization...')
346
+ self.pushButton_original.setVisible(False)
347
+
348
+ self.progressBar.setValue(5)
349
+ self._progress = 5
350
+
351
+ if self.initial_mask is None:
352
+ self.initial_mask, self.init_im_rec = self.initialization()
353
+
354
+ self.label_pr.setText('prediction...')
355
+ self.mask = self.compute_mask(self.initial_mask)
356
+
357
+ """
358
+ a = self.initial_mask.get_fdata().copy()
359
+ a *= self.mask
360
+ from melage.utils.utils import standardize
361
+ a = standardize(-a, 20)
362
+ a[self.mask==0] = -1
363
+ a = nib.Nifti1Image(a, self.initial_mask.affine, self.initial_mask.header)
364
+ a.to_filename('/home/binibica/eco/172_X_20210325_seg0.nii.gz')
365
+ """
366
+ if self.init_im_rec is not None:
367
+ #from melage.utils.utils import standardize
368
+ a1 = normalize_mri(self.img.get_fdata() * self.mask)
369
+ rec = normalize_mri(self.init_im_rec.get_fdata() * self.mask)
370
+
371
+ mse = np.mean((a1 - rec) ** 2)
372
+ max_pixel_value = np.max(a1)
373
+ psnr = 10 * np.log10((max_pixel_value ** 2) / mse)
374
+ print("PSNR: {:.2f}".format(psnr))
375
+
376
+ from skimage.metrics import structural_similarity
377
+ print("Structural similarity : {:.2f}".format(structural_similarity(a1, rec)))
378
+
379
+
380
+
381
+ imB = self.init_im_rec.get_fdata().copy()
382
+ #bmin, bmax = imB[self.mask>0].min(), imB[self.mask>0].max()
383
+ #imB = (imB - bmin) / (bmax-bmin) # range
384
+ imB[~(self.mask > 0)] = 0
385
+ imB = normalize_mri(imB)
386
+ #from scipy.ndimage import gaussian_filter
387
+ #alpha, sigma = 1.5, 5
388
+ #blurred = gaussian_filter(imB, 5)
389
+ #sharpened_mask = (imB - blurred)
390
+
391
+ #sharpened_mask = (
392
+ # (sharpened_mask - sharpened_mask.min()) / (sharpened_mask.max() - sharpened_mask.min()))
393
+ #sharpened_mask[~(self.mask > 0)] = 0
394
+ self.im_rec = nib.Nifti1Image(imB, self.init_im_rec.affine, self.init_im_rec.header)
395
+ else:
396
+ imB = self.img.get_fdata().copy()
397
+ imB[~(self.mask > 0)] = 0
398
+ imB = (normalize_mri(imB))
399
+ self.im_rec = nib.Nifti1Image(imB, self.img.affine, self.img.header)
400
+ #self.mask = self.mask.transpose(2, 1, 0)[::-1, ::-1, ::-1]
401
+ self.progressBar.setValue(98)
402
+ self.label_pr.setVisible(False)
403
+ self._progress = 100
404
+ self.progressBar.setValue(self._progress)
405
+ self._progress =0
406
+ self.betcomp.emit(True)
407
+ self.pushButton_original.setVisible(True)
408
+ except Exception as e:
409
+ print(e)
410
+ self.screen_error_msgbox(e.args[0])
411
+ def screen_error_msgbox(self, text= None):
412
+ if text is None:
413
+ text = 'There is an error. Screen is not captured. Please check the content.'
414
+ MessageBox = QtWidgets.QMessageBox(self)
415
+ MessageBox.setText(str(text))
416
+ MessageBox.setWindowTitle('Warning')
417
+ MessageBox.show()
418
+ self.progressBar.setValue(0)
419
+
420
+ def initialization(self):
421
+ def rescaleint8(x):
422
+ """
423
+ y = a+(b-a)*(x-min(x))/(max(x)-min(x))
424
+ Parameters
425
+ ----------
426
+ x
427
+
428
+ Returns
429
+ -------
430
+
431
+ """
432
+ oldMin, oldMax = int(x.min()), x.max()
433
+ NewMin, NewMax = 0, 1000
434
+ OldRange = (oldMax - oldMin)
435
+ NewRange = (NewMax - NewMin)
436
+ y = NewMin + (NewRange) * ((x - oldMin) / (OldRange))
437
+ return y
438
+ def signdf(df):
439
+ if df<=0:
440
+ return -1
441
+ else:
442
+ return 1
443
+ pv = self._progress
444
+ self.progressBar.setValue(pv+1)
445
+ #from melage.widgets.SA_DL import MRI_bet
446
+ from melage.widgets.DeepLModels.InfantSegment.Unet import Segmentor
447
+
448
+
449
+ # find the center of mass of image
450
+ from nibabel.processing import resample_to_output, resample_from_to
451
+ import torch
452
+ #imA = self.img
453
+ imA = self.img.__class__(self.img.dataobj[:], self.img.affine, self.img.header)
454
+
455
+
456
+ if self.checkbox_cuda.isChecked():
457
+ if torch.cuda.is_available() :
458
+ # device = torch.device("cuda")
459
+ device = torch.device("cuda:0")
460
+ torch.cuda.set_device(0)
461
+ torch.backends.cudnn.benchmark = True
462
+ else:
463
+ device = torch.device("cpu")
464
+ else:
465
+ device = torch.device("cpu")
466
+ ci = self.comboBox_models.currentIndex()
467
+ nrois=25
468
+ model = Segmentor(channels=nrois)
469
+
470
+ model.eval()
471
+
472
+ self.borderp = 0
473
+
474
+ resize_need = True
475
+ transform, source = convert_to_ras(imA.affine, target='RAS')
476
+ if source != 'RAS':
477
+ imA = imA.as_reoriented(transform)
478
+
479
+ pixdim = imA.header['pixdim'][1:4]
480
+ affine = imA.affine
481
+ header = imA.header
482
+
483
+ imA = imA.get_fdata()
484
+
485
+
486
+ model.to(device)
487
+ self.progressBar.setValue(40)
488
+ self.label_pr.setText('loading model...')
489
+
490
+ try:
491
+ state_dict = torch.load(self.load_filepath, map_location=device)
492
+ #d = OrderedDict((k.replace('norm', 'norm2') if 'norm' in k else k, v) for k, v in state_dict['model'].items())
493
+ if hasattr(state_dict, 'forward'):
494
+ model = state_dict
495
+ else:
496
+ try:
497
+ model.load_state_dict(state_dict['state_dict'], strict=True)
498
+ except:
499
+ model.load_state_dict(state_dict['model'], strict=True)
500
+ except:
501
+ model = torch.load(self.load_filepath, map_location=device)
502
+
503
+
504
+ self.progressBar.setValue(50)
505
+ self.label_pr.setText('computing mask...')
506
+ #rescaleint8(imA)
507
+ #imA -= imA.min()
508
+ #if np.percentile(imA, 99)!=0:
509
+ # imA = (imA / np.percentile(imA, 99)).clip(0, 1)
510
+ #else:
511
+ # imA = (imA / imA.max()).clip(0, 1)
512
+
513
+ shape_initial = imA.shape
514
+ #border_value = imA[0, 0, 0]
515
+ #image_used, pad_zero = remove_zero(imA, border_value)
516
+
517
+ image_used = imA
518
+
519
+ image_used = normalize_mri(imA)/255.0
520
+ #image_used = image_used/image_used.max()
521
+
522
+ #Spacing = imAzero.header['pixdim'][1:4]
523
+ source_size = image_used.shape
524
+ self.target_size = [[224, 256, 192]]
525
+ selcted_size = self.target_size[-1]
526
+ imA = torch.from_numpy(image_used).to(torch.float).unsqueeze(0).unsqueeze(0)
527
+ imA = F.interpolate(imA.unsqueeze(0), size=selcted_size, mode='trilinear', align_corners=False).squeeze(0)
528
+ imA = imA.to(device)
529
+
530
+ pred_logits, pred_logits_tissue = model.forward(imA)
531
+ pred_logits = F.interpolate(pred_logits, size=source_size, mode='trilinear', align_corners=False)
532
+ prob_value_predicted = F.softmax(pred_logits, dim=1)
533
+ prob_value_predicted = prob_value_predicted.detach().cpu().numpy()
534
+ im_mask = prob_value_predicted.argmax(1)
535
+
536
+
537
+ im_rec = None
538
+
539
+
540
+ self.progressBar.setValue(80)
541
+ header = self.img.header.copy()
542
+
543
+ header['pixdim'][1:4] = pixdim
544
+
545
+ mask = nib.Nifti1Image(im_mask, affine, header)
546
+ _, source = convert_to_ras(self.img.affine)
547
+ transform, _ = convert_to_ras(mask.affine, target=source)
548
+ mask = mask.as_reoriented(transform)
549
+
550
+ return mask, im_rec
551
+
552
+
553
+ def compute_mask(self, mask):
554
+ """
555
+ Convert surface mesh to volume
556
+ """
557
+
558
+ try:
559
+ import surfa as sf
560
+ if type(mask)==sf.image.framed.Volume:
561
+ label = mask.copy()
562
+ label = (label < threshold).connected_component_mask(k=1, fill=True)
563
+ return label.data.astype('int')
564
+ except:
565
+ pass
566
+
567
+ #from nibabel.processing import resample_from_to
568
+ from skimage.measure import label as label_connector
569
+ from scipy.ndimage import binary_fill_holes
570
+
571
+
572
+ im_mask = mask.get_fdata().copy()
573
+
574
+
575
+
576
+ ind = im_mask >= threshold
577
+ im_mask[ind] = 0
578
+ im_mask[~ind] = 1
579
+
580
+ #label correction
581
+ label_correction = False
582
+
583
+ labels = im_mask
584
+ labels = binary_fill_holes(labels)
585
+ labels, labels_freq = LargestCC(labels, connectivity=1)
586
+ argmax = np.argmax(
587
+ [self.img.get_fdata()[labels == el].sum() for el in range(len(labels_freq)) if el != 0]) + 1
588
+ #connectivity = 1
589
+ #labels = label_connector(labels, connectivity=connectivity)
590
+ # labels[labels>1]=1
591
+ #frequency = np.bincount(labels.flat)
592
+ # argmax = [el for el in np.argsort(-frequency) if el != 0][0]
593
+ #argmax = np.argmax([self.img.get_fdata()[labels == el].sum() for el in range(len(frequency)) if el != 0]) + 1
594
+ ind = labels != argmax
595
+ labels[ind] = 0
596
+ labels[~ind]=1
597
+
598
+ if label_correction:
599
+ connectivity = 1
600
+ labels = label_connector(im_mask, connectivity=connectivity)
601
+ # labels[labels>1]=1
602
+ frequency = np.bincount(labels.flat)
603
+ #argmax = [el for el in np.argsort(-frequency) if el != 0][0]
604
+ argmax = np.argmax([self.img.get_fdata()[labels==el].sum() for el in range(len(frequency)) if el != 0])+1
605
+ ind = labels != argmax
606
+ labels[ind] = 0
607
+ # labels[~ind]=0
608
+ labels = binary_fill_holes(labels)
609
+ for slc in range(labels.shape[0]):
610
+ im = labels[slc, :, :]
611
+ if im.max() == 0:
612
+ continue
613
+ labels[slc, :, :] = binary_fill_holes(im)
614
+ for slc in range(labels.shape[1]):
615
+ im = labels[:, slc, :]
616
+ if im.max() == 0:
617
+ continue
618
+ labels[:, slc, :] = binary_fill_holes(im)
619
+
620
+ for slc in range(labels.shape[2]):
621
+ im = labels[:, :, slc]
622
+ if im.max() == 0:
623
+ continue
624
+
625
+ lbl = label_connector(im, connectivity=connectivity)
626
+ frequency = np.bincount(lbl.flat)
627
+ argmax = [el for el in np.argsort(-frequency) if el != 0][0]
628
+ ind_remove = frequency < 0.1 * frequency[argmax]
629
+ if ind_remove.any():
630
+ index_remove = np.argwhere(ind_remove)
631
+ for el in index_remove:
632
+ ind = lbl == el
633
+ lbl[ind] = 0
634
+ lbl[lbl > 0] = 1
635
+ else:
636
+ continue
637
+ labels[:, :, slc] = lbl.copy()
638
+
639
+ for slc in range(labels.shape[2]):
640
+ im = labels[:, :, slc]
641
+ if im.max() == 0:
642
+ continue
643
+ labels[:, :, slc] = binary_fill_holes(im)
644
+
645
+ return labels.astype('int')
646
+
647
+
648
+ def run():
649
+ import sys
650
+ app = QtWidgets.QApplication(sys.argv)
651
+ file = '2_X_20180202_X_t1_withoutmask.nii.gz'
652
+ import nibabel as nib
653
+ m = nib.load(file)
654
+ #res = m.header["pixdim"][1]
655
+ #nibf = m.get_fdata()
656
+ from melage.utils.utils import standardize
657
+ #nibf = standardize(nibf)
658
+ window = SA_DL()
659
+ window.setData(m, None)
660
+ window.set_pars()
661
+ window.show()
662
+ sys.exit(app.exec_())
663
+
664
+ if __name__ == '__main__':
665
+ run()
666
+