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,869 @@
1
+ __AUTHOR__ = 'Bahram Jafrasteh'
2
+
3
+ """
4
+ Main BrainExtractor class
5
+ """
6
+ import os
7
+ import numpy as np
8
+ import nibabel as nib
9
+ from PyQt5 import QtCore, QtGui, QtWidgets
10
+ from functools import partial
11
+
12
+
13
+ from PyQt5.QtCore import pyqtSignal
14
+ import sys
15
+ from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout
16
+ from PyQt5.QtCore import Qt
17
+ from melage.utils.utils import convert_to_ras, LargestCC
18
+ def to_str(val):
19
+ return '{:.2f}'.format(val)
20
+
21
+ def remove_zero(f_data, value=0):
22
+ """
23
+ Remove non segmented areas from image
24
+ :param f_data:
25
+ :param value:
26
+ :return:
27
+ """
28
+
29
+ xs, ys, zs = np.where(f_data > value) #find zero values
30
+ tol = 4
31
+
32
+ min_max = []
33
+ for x in [xs, ys, zs]:
34
+ minx = min(x)-tol if min(x)-tol>1 else min(x)
35
+ maxx = max(x) + tol if max(x) + tol < f_data.shape[0]-1 else max(x)
36
+ min_max.append([minx, maxx])
37
+ 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]
38
+
39
+ return f_data, min_max
40
+
41
+ def centralize_image(img, maxas=128, border=None):
42
+ """
43
+ Put image in the center
44
+ :param img:
45
+ :param maxas:
46
+ :param border:
47
+ :return:
48
+ """
49
+
50
+ n = img.shape
51
+ if type(maxas) != list:
52
+ maxas= [maxas, maxas, maxas]
53
+ pads = np.array([maxas[i] - a for i, a in enumerate(n)])
54
+ pads_r = pads // 2
55
+ pads_l = pads - pads_r
56
+ npads_l = pads_l * -1
57
+ npads_r = pads_r * -1
58
+ if border is None:
59
+ border = img[0,0,0]
60
+ new_img = np.ones((maxas[0], maxas[1], maxas[2]))*border
61
+
62
+ pads_r[pads_r < 0] = 0
63
+ pads_l[pads_l < 0] = 0
64
+ npads_l[npads_l < 0] = 0
65
+ npads_r[npads_r < 0] = 0
66
+ # print(pads_l, pads_r)
67
+ 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[
68
+ npads_r[0]:n[0] -npads_l[0],
69
+ npads_r[1]:n[1] -npads_l[1],
70
+ npads_r[2]:n[2] -npads_l[2]]
71
+ return new_img, [pads, pads_l, pads_r, npads_l, npads_r, n]
72
+
73
+ class BE_DL(QDialog):
74
+ """
75
+ This class has been implemented to use deep learning algorithms for brain extraction
76
+ """
77
+ closeSig = pyqtSignal()
78
+ betcomp = pyqtSignal(int)
79
+ datachange = pyqtSignal()
80
+ back_orig = pyqtSignal(int)
81
+
82
+ backbutton = pyqtSignal()
83
+ """
84
+
85
+ """
86
+ def __init__(self, parent=None
87
+ ):
88
+ super(BE_DL, self).__init__(parent)
89
+ #self.load_filepath = 'widgets/Hybrid_latest.pth'
90
+ self._curent_weight_dir = os.path.dirname(os.path.join(os.getcwd()))
91
+ """
92
+ Initialization of Brain Extractor
93
+
94
+ Computes image range/thresholds and
95
+ estimates the brain radius
96
+ """
97
+ def set_pars(self, threshold=-0.5, remove_extra_bone=True):
98
+ #print("Initializing...")
99
+
100
+ # get image resolution
101
+
102
+ self.threshold = threshold
103
+ self.borderp = 0.0
104
+
105
+ # store brain extraction parameters
106
+ self.setupUi()
107
+ def setData(self, img, res):
108
+ # store the image
109
+ self.img = img
110
+ self.initial_mask = None
111
+ self.shape = img.shape # 3D shape
112
+
113
+
114
+
115
+
116
+ def activate_advanced(self, value):
117
+ self.widget.setEnabled(value)
118
+
119
+ def setupUi(self):
120
+ Dialog = self.window()
121
+ Dialog.setObjectName("N4")
122
+ Dialog.resize(500, 220)
123
+ self.grid_main = QtWidgets.QGridLayout(self)
124
+ self.grid_main.setContentsMargins(0, 0, 0, 0)
125
+ self.grid_main.setObjectName("gridLayout")
126
+
127
+ self.hbox = QtWidgets.QHBoxLayout()
128
+ self.hbox.setContentsMargins(0, 0, 0, 0)
129
+ self.hbox.setObjectName("gridLayout")
130
+ self.grid_main.addLayout(self.hbox, 0, 0)
131
+
132
+ self.checkBox = QtWidgets.QCheckBox()
133
+ self.hbox.addWidget(self.checkBox, 0)
134
+ self.checkBox.setObjectName("checkBox")
135
+ self.checkBox.stateChanged.connect(self.activate_advanced)
136
+ self.comboBox_image = QtWidgets.QComboBox()
137
+ self.comboBox_image.setGeometry(QtCore.QRect(20, 10, 321, 25))
138
+ self.comboBox_image.setObjectName("comboBox")
139
+ for i in range(2):
140
+ self.comboBox_image.addItem("")
141
+ self.comboBox_image.currentIndexChanged.connect(self.datachange)
142
+
143
+ self.comboBox_models = QtWidgets.QComboBox()
144
+ self.comboBox_models.setGeometry(QtCore.QRect(20, 10, 321, 25))
145
+ self.comboBox_models.setObjectName("comboBox")
146
+ for i in range(2):
147
+ self.comboBox_models.addItem("")
148
+ self.comboBox_models.currentIndexChanged.connect(partial(self.parChanged, True))
149
+
150
+
151
+ self.hbox.addWidget(self.comboBox_image, 1)
152
+ self.hbox.addWidget(self.comboBox_models, 2)
153
+
154
+
155
+ self.progressBar = QtWidgets.QProgressBar()
156
+ self.progressBar.setEnabled(False)
157
+ self.progressBar.setProperty("value", 0)
158
+ self.progressBar.setAlignment(QtCore.Qt.AlignCenter)
159
+ self.progressBar.setObjectName("progressBar")
160
+ self.progressBar.setMaximum(100)
161
+
162
+
163
+
164
+ self.hbox2 = QtWidgets.QHBoxLayout()
165
+ self.hbox2.setContentsMargins(0, 0, 0, 0)
166
+ self.hbox2.setObjectName("gridLayout")
167
+ self.hbox2.addWidget(self.progressBar, 1)
168
+
169
+
170
+
171
+ self.widget = QtWidgets.QWidget()
172
+ self.widget.setObjectName("widget")
173
+ self.gridLayout = QtWidgets.QGridLayout(self.widget)
174
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
175
+ self.gridLayout.setObjectName("gridLayout")
176
+ self.splitter_3 = QtWidgets.QSplitter(self.widget)
177
+ self.splitter_3.setOrientation(QtCore.Qt.Horizontal)
178
+ self.splitter_3.setObjectName("splitter_3")
179
+
180
+
181
+ self.gridLayout.addWidget(self.splitter_3, 0, 0, 1, 1)
182
+ self.splitter = QtWidgets.QSplitter(self.widget)
183
+ self.splitter.setOrientation(QtCore.Qt.Horizontal)
184
+ self.splitter.setObjectName("splitter")
185
+ self.checkbox_thresholding = QtWidgets.QCheckBox(self.splitter)
186
+ #self.checkbox_thresholding.setAlignment(QtCore.Qt.AlignCenter)
187
+ self.checkbox_thresholding.setObjectName("checkbox_thresholding")
188
+ self.checkbox_thresholding.setChecked(False)
189
+
190
+ self.checkbox_otsu = QtWidgets.QCheckBox(self.splitter)
191
+ #self.checkbox_otsu.setAlignment(QtCore.Qt.AlignCenter)
192
+ self.checkbox_otsu.setObjectName("checkbox_thresholding")
193
+ self.checkbox_otsu.setChecked(False)
194
+ self.checkbox_otsu.stateChanged.connect(self.resetParams)
195
+
196
+
197
+ #self.checkbox_bone = QtWidgets.QCheckBox(self.splitter)
198
+ #self.checkbox_bone.setObjectName("histogram_bone")
199
+ #self.checkbox_bone.setChecked(False)
200
+ self.label_type = QtWidgets.QLabel(self.splitter)
201
+ self.label_type.setAlignment(QtCore.Qt.AlignCenter)
202
+ self.label_type.setObjectName("label")
203
+ self.comboBox_image_type = QtWidgets.QComboBox(self.splitter)
204
+ self.comboBox_image_type.setGeometry(QtCore.QRect(20, 10, 321, 25))
205
+ self.comboBox_image_type.setObjectName("comboBox")
206
+ self.comboBox_image_type.setCurrentIndex(0)
207
+ self.comboBox_image_type.currentIndexChanged.connect(partial(self.parChanged, False))
208
+ for i in range(2):
209
+ self.comboBox_image_type.addItem("")
210
+
211
+
212
+ #self.histogram_threshold_min = QtWidgets.QDoubleSpinBox(self.splitter)
213
+ #self.histogram_threshold_min.setObjectName("histogram_threshold_min")
214
+ #self.histogram_threshold_min.setValue(6)#(self.ht_min)*100)
215
+ #self.histogram_threshold_min.setMaximum(10)
216
+ #self.histogram_threshold_min.setMinimum(0)
217
+
218
+ #self.histogram_threshold_max = QtWidgets.QDoubleSpinBox(self.splitter)
219
+ #self.histogram_threshold_max.setObjectName("histogram_threshold_max")
220
+ #self.histogram_threshold_max.setValue((self.ht_max) * 100)
221
+ #self.histogram_threshold_max.setMaximum(100)
222
+ #self.histogram_threshold_max.setMinimum(0)
223
+
224
+ #self.histogram_threshold_min.setEnabled(True)
225
+ #self.histogram_threshold_max.setEnabled(False)
226
+
227
+ self.gridLayout.addWidget(self.splitter, 1, 0, 1, 1)
228
+
229
+
230
+
231
+ self.splitter_2 = QtWidgets.QSplitter(self.widget)
232
+ self.splitter_2.setOrientation(QtCore.Qt.Horizontal)
233
+ self.splitter_2.setObjectName("splitter_2")
234
+
235
+
236
+ self.label = QtWidgets.QLabel(self.splitter_2)
237
+ self.label.setAlignment(QtCore.Qt.AlignCenter)
238
+ self.label.setObjectName("label")
239
+ self.fractional_threshold = QtWidgets.QDoubleSpinBox(self.splitter_2)
240
+ self.fractional_threshold.setObjectName("fractional_threshold")
241
+
242
+ self.fractional_threshold.setMaximum(10)
243
+ self.fractional_threshold.setMinimum(-10)
244
+ self.fractional_threshold.setSingleStep(0.1)
245
+ self.fractional_threshold.setValue(self.threshold)
246
+
247
+ self.pushButton_original = QtWidgets.QPushButton(self.widget)
248
+ self.pushButton_original.setObjectName("pushButton_2")
249
+ self.pushButton_original.clicked.connect(self.back_original)
250
+ self.pushButton_original.setVisible(False)
251
+
252
+ #self.label_pma = QtWidgets.QLabel(self.splitter_2)
253
+ #self.label_pma.setAlignment(QtCore.Qt.AlignCenter)
254
+ #self.label_pma.setObjectName("label")
255
+ #self.border_pix = QtWidgets.QDoubleSpinBox(self.splitter_2)
256
+ #self.border_pix.setObjectName("PMA")
257
+ #self.border_pix.setValue((self.borderp))
258
+ #self.border_pix.setMaximum(150)
259
+ #self.border_pix.setMinimum(0)
260
+ #self.border_pix.setSingleStep(5)
261
+ #self.border_pix.valueChanged.connect(partial(self.parChanged, False))
262
+ self.gridLayout.addWidget(self.splitter_2, 2, 0, 1, 1)
263
+
264
+
265
+ self.splitter_3 = QtWidgets.QSplitter(self.widget)
266
+ self.splitter_3.setOrientation(QtCore.Qt.Horizontal)
267
+ self.splitter_3.setObjectName("splitter_3")
268
+
269
+ self.label_fl = QtWidgets.QLabel(self.splitter_3)
270
+ self.label_fl.setAlignment(QtCore.Qt.AlignCenter)
271
+ self.label_fl.setObjectName("label_5")
272
+ self.load_filepath = os.path.join(self._curent_weight_dir)
273
+ self.bt_load_weight = QtWidgets.QPushButton(self.splitter_3)
274
+ self.bt_load_weight.setObjectName("pushButton")
275
+ self.bt_load_weight.pressed.connect(self.load_weight_dialog)
276
+ self.bt_load_weight.setDefault(False)
277
+ self.pushButton = QtWidgets.QPushButton()
278
+
279
+ self.pushButton.setObjectName("pushButton")
280
+ self.pushButton.pressed.connect(self.accepted_emit)
281
+ self.hbox2.addWidget(self.pushButton, 0)
282
+ self.pushButton.setDefault(True)
283
+ self.gridLayout.addWidget(self.splitter_3, 3, 0, 1, 1)
284
+
285
+ self.widget.setEnabled(False)
286
+
287
+
288
+ self.grid_main.addWidget(self.widget)
289
+ self.grid_main.addLayout(self.hbox2, 20, 0)
290
+
291
+ self.label_pr = QtWidgets.QLabel()
292
+ self.label_pr.setAlignment(QtCore.Qt.AlignCenter)
293
+ self.label_pr.setObjectName("label_2")
294
+ self.label_pr.setText('fdfdf')
295
+ self.label_pr.setVisible(False)
296
+
297
+ self.grid_main.addWidget(self.label_pr)
298
+ self.retranslateUi(Dialog)
299
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
300
+
301
+
302
+ def resetParams(self, state):
303
+
304
+ self.init_im_rec = None
305
+ self.initial_mask = None
306
+
307
+ def back_original(self):
308
+ self.back_orig.emit(0)
309
+ self.pushButton_original.setVisible(False)
310
+
311
+ def parChanged(self, model_changed=True):
312
+ """
313
+ if model parameter changed the user needs to run the algorithm again
314
+ :param model_changed:
315
+ :return:
316
+ """
317
+ self.initial_mask = None
318
+ if model_changed:
319
+ ci = self.comboBox_models.currentIndex()
320
+ #if ci== 0:
321
+ # self.fractional_threshold.setValue(-0.5)
322
+ # self.load_filepath = os.path.join(self._curent_weight_dir,'unet3d_latest.pth')
323
+ if ci==0:
324
+ self.load_filepath = os.path.join(self._curent_weight_dir,'NMPNET.pth')
325
+ self.fractional_threshold.setValue(-0.5)
326
+ elif ci == 1:
327
+ self.load_filepath = os.path.join(self._curent_weight_dir,'synthstrip.1.pt')
328
+ self.fractional_threshold.setValue(1)
329
+ #elif ci==3:
330
+ # self.load_filepath = os.path.join(self._curent_weight_dir,'Hybrid_latest_custom.pth')
331
+ # self.fractional_threshold.setValue(-0.5)
332
+ else:
333
+ return
334
+ self.label_fl.setText(self.load_filepath)
335
+ def load_weight_dialog(self):
336
+ opts = QtWidgets.QFileDialog.DontUseNativeDialog
337
+ pwd = os.path.abspath(__file__)
338
+ source_dir = os.path.dirname(os.path.dirname(pwd))
339
+ fileObj = QtWidgets.QFileDialog.getOpenFileName(self, "Open File", source_dir, "pth (*.pth *.pt)", options=opts)
340
+ if fileObj[0] == '':
341
+ return
342
+ self.load_filepath = fileObj[0]
343
+ self.label_fl.setText(self.load_filepath)
344
+ self.initial_mask = None
345
+ self.init_im_rec = None
346
+ def clear(self):
347
+ # store the image
348
+ self.img = None
349
+ self.shape = None # 3D shape
350
+ self.mask = None
351
+ self.im_rec = None
352
+ self.initial_mask = None
353
+ self.init_im_rec = None
354
+
355
+ def retranslateUi(self, Dialog):
356
+ _translate = QtCore.QCoreApplication.translate
357
+ Dialog.setWindowTitle(_translate("Dialog", "DEEPL BET"))
358
+ self.checkBox.setText(_translate("Dialog", "Advanced"))
359
+ self.comboBox_image.setItemText(0, _translate("Dialog", "Top Image"))
360
+ self.comboBox_image.setItemText(1, _translate("Dialog", "Bottom Image"))
361
+ self.comboBox_image_type.setItemText(0, _translate("Dialog", "Ultrasound"))
362
+ self.comboBox_image_type.setItemText(1, _translate("Dialog", "MRI"))
363
+
364
+ self.comboBox_models.setItemText(0, _translate("Dialog", "NPM NET"))
365
+ self.comboBox_models.setItemText(1, _translate("Dialog", "SynthStrip"))
366
+
367
+
368
+ self.pushButton.setText(_translate("Dialog", "Apply"))
369
+ self.pushButton_original.setText(_translate("Dialog", "Back"))
370
+ self.checkbox_thresholding.setText(_translate("Dialog", "CUDA"))
371
+ self.checkbox_otsu.setText(_translate("Dialog", "Otsu"))
372
+
373
+ self.bt_load_weight.setText(_translate("Dialog", "Load Network Weights"))
374
+ self.label.setText(_translate("Dialog", "Threshold"))
375
+ self.label_type.setText(_translate("Dialog", "Image type"))
376
+
377
+
378
+
379
+ self.label_fl.setText(_translate("Dialog", self.load_filepath))
380
+
381
+
382
+ def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
383
+ self.closeSig.emit()
384
+ super(BE_DL, self).closeEvent(a0)
385
+
386
+ def accepted_emit(self):
387
+ if not hasattr(self,'initial_mask'):
388
+ return
389
+ try:
390
+ self.label_pr.setVisible(True)
391
+ self.label_pr.setText('Initialization...')
392
+ self.pushButton_original.setVisible(False)
393
+
394
+ self.progressBar.setValue(5)
395
+ self._progress = 5
396
+
397
+ if self.initial_mask is None:
398
+ self.initial_mask, self.init_im_rec = self.initialization()
399
+
400
+ self.label_pr.setText('prediction...')
401
+ self.mask = self.compute_mask(self.initial_mask)
402
+
403
+ """
404
+ a = self.initial_mask.get_fdata().copy()
405
+ a *= self.mask
406
+ from melage.utils.utils import standardize
407
+ a = standardize(-a, 20)
408
+ a[self.mask==0] = -1
409
+ a = nib.Nifti1Image(a, self.initial_mask.affine, self.initial_mask.header)
410
+ a.to_filename('/home/binibica/eco/172_X_20210325_seg0.nii.gz')
411
+ """
412
+ if self.init_im_rec is not None:
413
+ from melage.utils.utils import standardize
414
+ a1 = standardize(self.img.get_fdata() * self.mask)
415
+ rec = standardize(self.init_im_rec.get_fdata() * self.mask)
416
+
417
+ mse = np.mean((a1 - rec) ** 2)
418
+ max_pixel_value = np.max(a1)
419
+ psnr = 10 * np.log10((max_pixel_value ** 2) / mse)
420
+ print("PSNR: {:.2f}".format(psnr))
421
+
422
+ from skimage.metrics import structural_similarity
423
+ print("Structural similarity : {:.2f}".format(structural_similarity(a1, rec)))
424
+
425
+
426
+
427
+ imB = self.init_im_rec.get_fdata().copy()
428
+ #bmin, bmax = imB[self.mask>0].min(), imB[self.mask>0].max()
429
+ #imB = (imB - bmin) / (bmax-bmin) # range
430
+ imB[~(self.mask > 0)] = 0
431
+ #from scipy.ndimage import gaussian_filter
432
+ #alpha, sigma = 1.5, 5
433
+ #blurred = gaussian_filter(imB, 5)
434
+ #sharpened_mask = (imB - blurred)
435
+
436
+ #sharpened_mask = (
437
+ # (sharpened_mask - sharpened_mask.min()) / (sharpened_mask.max() - sharpened_mask.min()))
438
+ #sharpened_mask[~(self.mask > 0)] = 0
439
+ self.im_rec = nib.Nifti1Image(imB, self.init_im_rec.affine, self.init_im_rec.header)
440
+ else:
441
+ imB = self.img.get_fdata().copy()
442
+ imB[~(self.mask > 0)] = 0
443
+ self.im_rec = nib.Nifti1Image(imB, self.img.affine, self.img.header)
444
+ self.progressBar.setValue(98)
445
+ self.label_pr.setVisible(False)
446
+ self._progress = 100
447
+ self.progressBar.setValue(self._progress)
448
+ self._progress =0
449
+ self.betcomp.emit(True)
450
+ self.pushButton_original.setVisible(True)
451
+ except Exception as e:
452
+ print(e)
453
+ self.screen_error_msgbox(e.args[0])
454
+ def screen_error_msgbox(self, text= None):
455
+ if text is None:
456
+ text = 'There is an error. Screen is not captured. Please check the content.'
457
+ MessageBox = QtWidgets.QMessageBox(self)
458
+ MessageBox.setText(str(text))
459
+ MessageBox.setWindowTitle('Warning')
460
+ MessageBox.show()
461
+ self.progressBar.setValue(0)
462
+
463
+ def initialization(self):
464
+ def rescaleint8(x):
465
+ """
466
+ y = a+(b-a)*(x-min(x))/(max(x)-min(x))
467
+ Parameters
468
+ ----------
469
+ x
470
+
471
+ Returns
472
+ -------
473
+
474
+ """
475
+ oldMin, oldMax = int(x.min()), x.max()
476
+ NewMin, NewMax = 0, 1000
477
+ OldRange = (oldMax - oldMin)
478
+ NewRange = (NewMax - NewMin)
479
+ y = NewMin + (NewRange) * ((x - oldMin) / (OldRange))
480
+ return y
481
+ def signdf(df):
482
+ if df<=0:
483
+ return -1
484
+ else:
485
+ return 1
486
+ pv = self._progress
487
+ self.progressBar.setValue(pv+1)
488
+ #from melage.widgets.be_dl import MRI_bet
489
+ from melage.widgets.be_dl_unet3d import Unet3D
490
+
491
+ from melage.widgets.DeepLModels.Unet3DAtt import Unet3DAtt
492
+ from melage.widgets.Synthstrip import StripModel
493
+ # find the center of mass of image
494
+ from nibabel.processing import resample_to_output, resample_from_to
495
+ import torch
496
+ #imA = self.img
497
+ imA = self.img.__class__(self.img.dataobj[:], self.img.affine, self.img.header)
498
+
499
+ if self.checkbox_thresholding.isChecked():
500
+ if torch.cuda.is_available() :
501
+ # device = torch.device("cuda")
502
+ device = torch.device("cuda:0")
503
+ torch.cuda.set_device(0)
504
+ torch.backends.cudnn.benchmark = True
505
+ else:
506
+ device = torch.device("cpu")
507
+ else:
508
+ device = torch.device("cpu")
509
+ ci = self.comboBox_models.currentIndex()
510
+ if ci== 0:
511
+ #model = Unet3D(time_embed=True, spacing_embed=True)
512
+ model = Unet3DAtt(time_embed=True, spacing_embed=True)
513
+ #self.fractional_threshold.setValue(-0.5)
514
+ elif ci==1:
515
+ model = StripModel()
516
+ #self.fractional_threshold.setValue(-0.5)
517
+ #elif ci == 2:
518
+
519
+ #self.fractional_threshold.setValue(1)
520
+ #elif ci==2:
521
+ # from melage.widgets.DeepLModels.NPP.models.model import UNet
522
+ # self.fractional_threshold.setValue(0)
523
+ # model = UNet()
524
+ # self.fractional_threshold.setValue(-0.5)
525
+ else:
526
+ return
527
+ model.eval()
528
+
529
+ #transform, source = convert_to_ras(imA.affine, target='RAS')
530
+ #imA = imA.as_reoriented(transform)
531
+ #self.borderp = self.border_pix.value()
532
+ self.borderp = 0
533
+ if ci==1:
534
+ transform, source = convert_to_ras(imA.affine, target='LIA')
535
+ imAa = imA.as_reoriented(transform)
536
+ shape_initial = imAa.shape
537
+ image_used, pad_zero = remove_zero(imAa.get_fdata(), 0)
538
+ imAzero = nib.Nifti1Image(image_used, imAa.affine, imAa.header)
539
+ affine_used, header_used = imAa.affine, imAa.header.copy()
540
+ NewSpacing = 1
541
+ imAa = resample_to_output(imAzero, [NewSpacing, NewSpacing, NewSpacing])
542
+
543
+ transform, source = convert_to_ras(imAa.affine, target='LIA')
544
+ imAa = imAa.as_reoriented(transform)
545
+ target_shape = np.clip(np.ceil(np.array(imAa.shape[:3]) / 64).astype(int) * 64, 192, 320)
546
+ else:
547
+ shape_initial = imA.shape
548
+ border_value = imA.get_fdata()[0,0,0]
549
+ if self.checkbox_otsu.isChecked():
550
+ try:
551
+ from melage.utils.utils import Threshold_MultiOtsu
552
+ border_value = Threshold_MultiOtsu(imA.get_fdata(), 4)[0]
553
+ except:
554
+ pass
555
+ image_used, pad_zero = remove_zero(imA.get_fdata(), border_value)
556
+ imAzero = nib.Nifti1Image(image_used, imA.affine, imA.header)
557
+ affine_used, header_used = imA.affine, imA.header.copy()
558
+ Spacing = imAzero.header['pixdim'][1:4]
559
+
560
+ NewSpacing = Spacing.max() # [0]
561
+ if Spacing.max() != Spacing.min():
562
+ NewSpacing = Spacing.min()
563
+ Spacing = [Spacing.min()]
564
+ else:
565
+ Spacing = [Spacing[0]]
566
+
567
+ minus_sign = False
568
+ maxdim = np.array([el * sp / NewSpacing for el in imAzero.shape for sp in Spacing]).max()
569
+ df = (maxdim - 192)
570
+
571
+ if df>0:
572
+ resize_need = True
573
+ #minus_sign = True
574
+ prev_sign = signdf(df)
575
+ while True:
576
+ maxdim = np.array([el * sp / NewSpacing for el in imAzero.shape for sp in Spacing]).max()
577
+ df = (maxdim - 192)
578
+ if signdf(df) != prev_sign:
579
+ break
580
+ if abs(abs(df) - self.borderp)<10: #and df <= 0:
581
+ break
582
+ if minus_sign:
583
+ NewSpacing -= 0.1
584
+ else:
585
+ NewSpacing += 0.1
586
+ prev_sign = signdf(df)
587
+ while True:
588
+ imAa = resample_to_output(imAzero, [NewSpacing, NewSpacing, NewSpacing])
589
+ df = (np.max(imAa.shape) - 192)
590
+ if signdf(df) != prev_sign and df < 0:
591
+ break
592
+ prev_sign = signdf(df)
593
+ if abs(df) <= self.borderp and df <= 0:
594
+ break
595
+ else:
596
+ if signdf(df) == -1:
597
+ minus_sign = True
598
+ minus_signed = True
599
+ else:
600
+ minus_sign = False
601
+ if minus_sign:
602
+ NewSpacing -= 0.1
603
+ else:
604
+ NewSpacing += 0.1
605
+ transform, source = convert_to_ras(imAa.affine, target='RAS')
606
+ if source!='RAS':
607
+ imAa = imAa.as_reoriented(transform)
608
+ else:
609
+ resize_need = False
610
+ transform, source = convert_to_ras(imAzero.affine, target='RAS')
611
+ imAa = imAzero.as_reoriented(transform)
612
+ #imAa = nib.Nifti1Image(imAzero.get_fdata(), imAzero.affine, imAzero.header)
613
+ #transform, source = convert_to_ras(imAa.affine, target='RAS')
614
+ #imAa = imAa.as_reoriented(transform)
615
+ pixdim = imAa.header['pixdim'][1:4]
616
+ affine = imAa.affine
617
+
618
+ if ci!=1:
619
+ imA = imAa.get_fdata()
620
+ #imA -= imA.min()
621
+ #imA = rescaleint8(imAa.get_fdata())/1000
622
+ #imA = (imA / imA.max()).clip(0, 1)
623
+ if ci==0:
624
+ imA = ((imA - imA.min()) / (imA.max() - imA.min()))
625
+ else:
626
+ imA = 2 * ((imA - imA.min()) / (imA.max() - imA.min())) - 1
627
+ #imA = (imA - imA.mean())/np.std(imA)
628
+ #imA = ((imA - imA.min()) / (imA.max() - imA.min()))
629
+ else:
630
+ imA = imAa.get_fdata()
631
+ imA -= imA.min()
632
+ if np.percentile(imA, 99)!=0:
633
+ imA = (imA / np.percentile(imA, 99)).clip(0, 1)
634
+ else:
635
+ imA = (imA / imA.max()).clip(0, 1)
636
+ if ci==1:
637
+ imA, info_back = centralize_image(imA, list(target_shape))
638
+ else:
639
+ imA, info_back = centralize_image(imA, 192)
640
+ del imAa
641
+ [pads, pads_l, pads_r, npads_l, npads_r, shape_img] = info_back
642
+
643
+
644
+
645
+ #rescaleint8(imA)
646
+ #imA -= imA.min()
647
+ #if np.percentile(imA, 99)!=0:
648
+ # imA = (imA / np.percentile(imA, 99)).clip(0, 1)
649
+ #else:
650
+ # imA = (imA / imA.max()).clip(0, 1)
651
+
652
+ imA = torch.from_numpy(imA).to(torch.float).unsqueeze(0).unsqueeze(0)
653
+
654
+
655
+ print('loading model weight...')
656
+ #pma = self.border_pix.value()
657
+ if self.comboBox_image_type.currentIndex()==0:
658
+ eco_mri = -1
659
+ else:
660
+ eco_mri = 1
661
+ #time = torch.from_numpy(np.array([pma, eco_mri])).to(device).unsqueeze(0).to(torch.float)
662
+ if ci!=0:
663
+ time = torch.from_numpy(np.array(eco_mri)).unsqueeze(0).to(torch.float)
664
+ time = torch.concat([time.reshape(-1,1), torch.from_numpy(pixdim).reshape(-1,1)]).squeeze().unsqueeze(0).to(device)
665
+ else:
666
+ time = torch.from_numpy(np.array(eco_mri)).unsqueeze(0).to(torch.float).to(device)
667
+ imA = imA.to(device)
668
+ model.to(device)
669
+ self.progressBar.setValue(40)
670
+ self.label_pr.setText('loading model...')
671
+ if ci==1:
672
+ state_dict = torch.load(self.load_filepath, map_location=device)
673
+ model.load_state_dict(state_dict['model_state_dict'])
674
+ else:
675
+ try:
676
+ state_dict = torch.load(self.load_filepath, map_location=device)
677
+ #d = OrderedDict((k.replace('norm', 'norm2') if 'norm' in k else k, v) for k, v in state_dict['model'].items())
678
+ if hasattr(state_dict, 'forward'):
679
+ model = state_dict
680
+ else:
681
+ try:
682
+ model.load_state_dict(state_dict['state_dict'], strict=False)
683
+ except:
684
+ model.load_state_dict(state_dict['model'], strict=False)
685
+ except:
686
+ model = torch.load(self.load_filepath, map_location=device)
687
+
688
+ self.progressBar.setValue(50)
689
+ self.label_pr.setText('computing mask...')
690
+ im_mask = model.forward(imA, time)
691
+
692
+ if ci==0:
693
+ im_mask, im_rec=im_mask
694
+ im_mask = im_mask.detach().cpu().squeeze().numpy()
695
+ im_rec = im_rec.detach().cpu().squeeze().numpy()
696
+ maxas = [i for i in im_mask.shape]
697
+ im_rec = im_rec[pads_r[0]:maxas[0] - pads_l[0], pads_r[1]:maxas[1] - pads_l[1],
698
+ pads_r[2]:maxas[2] - pads_l[2]]
699
+ im_rec = ((im_rec - im_rec.min()) * 255 / np.ptp(im_rec))
700
+ im_mask = im_mask[pads_r[0]:maxas[0] - pads_l[0], pads_r[1]:maxas[1] - pads_l[1],
701
+ pads_r[2]:maxas[2] - pads_l[2]]
702
+ else:
703
+ im_mask = im_mask.detach().cpu().squeeze().numpy()
704
+ maxas = [i for i in im_mask.shape]
705
+ im_mask = im_mask[pads_r[0]:maxas[0] - pads_l[0], pads_r[1]:maxas[1] - pads_l[1], pads_r[2]:maxas[2] - pads_l[2]]
706
+ im_rec = None
707
+ if ci==1:
708
+ mask = nib.Nifti1Image(im_mask, affine, header_used)
709
+ mask = resample_from_to(mask, imAzero)
710
+ im_mask = np.zeros(shape_initial)
711
+ im_mask[pad_zero[0][0]:pad_zero[0][1] + 1, pad_zero[1][0]:pad_zero[1][1] + 1,
712
+ pad_zero[2][0]:pad_zero[2][1] + 1] = mask.get_fdata()
713
+ self.progressBar.setValue(80)
714
+ header = self.img.header.copy()
715
+
716
+ header['pixdim'][1:4] = pixdim
717
+ mask = nib.Nifti1Image(im_mask, affine, header)
718
+ if ci==1:
719
+ _, source = convert_to_ras(self.img.affine, target='LIA')
720
+ transform, _ = convert_to_ras(mask.affine, target=source)
721
+ mask = mask.as_reoriented(transform)
722
+ else:
723
+ mask = nib.Nifti1Image(im_mask, affine, header_used)
724
+ _, source = convert_to_ras(self.img.affine)
725
+ transform, _ = convert_to_ras(mask.affine, target=source)
726
+ mask = mask.as_reoriented(transform)
727
+ if im_rec is not None:
728
+ _rec = nib.Nifti1Image(im_rec, affine, header_used)
729
+ _rec = _rec.as_reoriented(transform)
730
+ else:
731
+ _rec = None
732
+ if resize_need:
733
+ mask = resample_from_to(mask, imAzero)
734
+ if _rec is not None:
735
+ _rec = resample_from_to(_rec, imAzero)
736
+ im_mask = np.ones(shape_initial)*mask.get_fdata()[0,0,0]
737
+
738
+ im_mask[pad_zero[0][0]:pad_zero[0][1] + 1, pad_zero[1][0]:pad_zero[1][1] + 1,
739
+ pad_zero[2][0]:pad_zero[2][1] + 1] = mask.get_fdata()
740
+ mask = nib.Nifti1Image(im_mask, self.img.affine, self.img.header)
741
+ if ci==0:
742
+ im_rec = np.ones(shape_initial) * _rec.get_fdata()[0, 0, 0]
743
+ im_rec[pad_zero[0][0]:pad_zero[0][1] + 1, pad_zero[1][0]:pad_zero[1][1] + 1,
744
+ pad_zero[2][0]:pad_zero[2][1] + 1] = _rec.get_fdata()
745
+ im_rec = nib.Nifti1Image(im_rec, self.img.affine, self.img.header)
746
+
747
+ return mask, im_rec
748
+
749
+
750
+ def compute_mask(self, mask):
751
+ """
752
+ Convert surface mesh to volume
753
+ """
754
+ threshold = self.fractional_threshold.value()
755
+ try:
756
+ import surfa as sf
757
+ if type(mask)==sf.image.framed.Volume:
758
+ label = mask.copy()
759
+ label = (label < threshold).connected_component_mask(k=1, fill=True)
760
+ return label.data.astype('int')
761
+ except:
762
+ pass
763
+
764
+ #from nibabel.processing import resample_from_to
765
+ from skimage.measure import label as label_connector
766
+ from scipy.ndimage import binary_fill_holes
767
+
768
+
769
+ im_mask = mask.get_fdata().copy()
770
+ #from utils.utils import Threshold_MultiOtsu
771
+
772
+
773
+ ind = im_mask >= threshold
774
+ im_mask[ind] = 0
775
+ im_mask[~ind] = 1
776
+ """
777
+
778
+ if self.checkbox_bone.isChecked():
779
+ A = self.img.get_fdata() * im_mask
780
+ thresholds = Threshold_MultiOtsu(A, 5)
781
+ im_mask[A > thresholds[-1]] = 0
782
+ """
783
+ #label correction
784
+ label_correction = False
785
+
786
+ labels = im_mask
787
+ labels = binary_fill_holes(labels)
788
+ labels, labels_freq = LargestCC(labels, connectivity=1)
789
+ argmax = np.argmax(
790
+ [self.img.get_fdata()[labels == el].sum() for el in range(len(labels_freq)) if el != 0]) + 1
791
+ #connectivity = 1
792
+ #labels = label_connector(labels, connectivity=connectivity)
793
+ # labels[labels>1]=1
794
+ #frequency = np.bincount(labels.flat)
795
+ # argmax = [el for el in np.argsort(-frequency) if el != 0][0]
796
+ #argmax = np.argmax([self.img.get_fdata()[labels == el].sum() for el in range(len(frequency)) if el != 0]) + 1
797
+ ind = labels != argmax
798
+ labels[ind] = 0
799
+ labels[~ind]=1
800
+
801
+ if label_correction:
802
+ connectivity = 1
803
+ labels = label_connector(im_mask, connectivity=connectivity)
804
+ # labels[labels>1]=1
805
+ frequency = np.bincount(labels.flat)
806
+ #argmax = [el for el in np.argsort(-frequency) if el != 0][0]
807
+ argmax = np.argmax([self.img.get_fdata()[labels==el].sum() for el in range(len(frequency)) if el != 0])+1
808
+ ind = labels != argmax
809
+ labels[ind] = 0
810
+ # labels[~ind]=0
811
+ labels = binary_fill_holes(labels)
812
+ for slc in range(labels.shape[0]):
813
+ im = labels[slc, :, :]
814
+ if im.max() == 0:
815
+ continue
816
+ labels[slc, :, :] = binary_fill_holes(im)
817
+ for slc in range(labels.shape[1]):
818
+ im = labels[:, slc, :]
819
+ if im.max() == 0:
820
+ continue
821
+ labels[:, slc, :] = binary_fill_holes(im)
822
+
823
+ for slc in range(labels.shape[2]):
824
+ im = labels[:, :, slc]
825
+ if im.max() == 0:
826
+ continue
827
+
828
+ lbl = label_connector(im, connectivity=connectivity)
829
+ frequency = np.bincount(lbl.flat)
830
+ argmax = [el for el in np.argsort(-frequency) if el != 0][0]
831
+ ind_remove = frequency < 0.1 * frequency[argmax]
832
+ if ind_remove.any():
833
+ index_remove = np.argwhere(ind_remove)
834
+ for el in index_remove:
835
+ ind = lbl == el
836
+ lbl[ind] = 0
837
+ lbl[lbl > 0] = 1
838
+ else:
839
+ continue
840
+ labels[:, :, slc] = lbl.copy()
841
+
842
+ for slc in range(labels.shape[2]):
843
+ im = labels[:, :, slc]
844
+ if im.max() == 0:
845
+ continue
846
+ labels[:, :, slc] = binary_fill_holes(im)
847
+
848
+ return labels.astype('int')
849
+
850
+
851
+ def run():
852
+ import sys
853
+ app = QtWidgets.QApplication(sys.argv)
854
+ file = 't1_withoutmask.nii.gz'
855
+ import nibabel as nib
856
+ #m = nib.load(file)
857
+ #res = m.header["pixdim"][1]
858
+ #nibf = m.get_fdata()
859
+ from melage.utils.utils import standardize
860
+ #nibf = standardize(nibf)
861
+ window = BE_DL()
862
+ #window.setData(m, res)
863
+ window.set_pars()
864
+ window.show()
865
+ sys.exit(app.exec_())
866
+
867
+ if __name__ == '__main__':
868
+ run()
869
+