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