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,588 @@
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
+ from PyQt5.QtCore import pyqtSignal
13
+ import sys
14
+ from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout
15
+ from PyQt5.QtCore import Qt
16
+ from melage.utils.utils import convert_to_ras, LargestCC
17
+
18
+
19
+ def to_str(val):
20
+ return '{:.2f}'.format(val)
21
+
22
+
23
+ def remove_zero(f_data, value=0):
24
+ """
25
+ Remove non segmented areas from image
26
+ :param f_data:
27
+ :param value:
28
+ :return:
29
+ """
30
+
31
+ xs, ys, zs = np.where(f_data > value) # find zero values
32
+ tol = 4
33
+
34
+ min_max = []
35
+ for x in [xs, ys, zs]:
36
+ minx = min(x) - tol if min(x) - tol > 1 else min(x)
37
+ maxx = max(x) + tol if max(x) + tol < f_data.shape[0] - 1 else max(x)
38
+ min_max.append([minx, maxx])
39
+ 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]
40
+
41
+ return f_data, min_max
42
+
43
+
44
+ def centralize_image(img, maxas=128, border=None):
45
+ """
46
+ Put image in the center
47
+ :param img:
48
+ :param maxas:
49
+ :param border:
50
+ :return:
51
+ """
52
+
53
+ n = img.shape
54
+ if type(maxas) != list:
55
+ maxas = [maxas, maxas, maxas]
56
+ pads = np.array([maxas[i] - a for i, a in enumerate(n)])
57
+ pads_r = pads // 2
58
+ pads_l = pads - pads_r
59
+ npads_l = pads_l * -1
60
+ npads_r = pads_r * -1
61
+ if border is None:
62
+ border = img[0, 0, 0]
63
+ new_img = np.ones((maxas[0], maxas[1], maxas[2])) * border
64
+
65
+ pads_r[pads_r < 0] = 0
66
+ pads_l[pads_l < 0] = 0
67
+ npads_l[npads_l < 0] = 0
68
+ npads_r[npads_r < 0] = 0
69
+ # print(pads_l, pads_r)
70
+ new_img[pads_r[0]:maxas[0] - pads_l[0], pads_r[1]:maxas[1] - pads_l[1], pads_r[2]:maxas[2] - pads_l[2]] = img[
71
+ npads_r[
72
+ 0]:n[
73
+ 0] -
74
+ npads_l[
75
+ 0],
76
+ npads_r[
77
+ 1]:n[
78
+ 1] -
79
+ npads_l[
80
+ 1],
81
+ npads_r[
82
+ 2]:n[
83
+ 2] -
84
+ npads_l[
85
+ 2]]
86
+ return new_img, [pads, pads_l, pads_r, npads_l, npads_r, n]
87
+
88
+
89
+ class Tissue_Seg(QDialog):
90
+ """
91
+ This class has been implemented to use deep learning algorithms for brain extraction
92
+ """
93
+ closeSig = pyqtSignal()
94
+ betcomp = pyqtSignal(int)
95
+ datachange = pyqtSignal()
96
+ back_orig = pyqtSignal(int)
97
+
98
+ backbutton = pyqtSignal()
99
+ """
100
+
101
+ """
102
+
103
+ def __init__(self, parent=None
104
+ ):
105
+ super(Tissue_Seg, self).__init__(parent)
106
+ # self.load_filepath = 'widgets/Hybrid_latest.pth'
107
+ self._curent_weight_dir = os.path.dirname(os.path.join(os.getcwd()))
108
+ """
109
+ Initialization of Brain Extractor
110
+
111
+ Computes image range/thresholds and
112
+ estimates the brain radius
113
+ """
114
+
115
+ def set_pars(self, threshold=50, remove_extra_bone=True):
116
+ # print("Initializing...")
117
+
118
+ # get image resolution
119
+
120
+ self.threshold = threshold
121
+ self.borderp = 0.0
122
+
123
+ # store brain extraction parameters
124
+ self.setupUi()
125
+
126
+ def setData(self, img, res):
127
+ # store the image
128
+ self.img = img
129
+ self.initial_mask = None
130
+ self.shape = img.shape # 3D shape
131
+
132
+ def activate_advanced(self, value):
133
+ self.widget.setEnabled(value)
134
+
135
+ def setupUi(self):
136
+ Dialog = self.window()
137
+ Dialog.setObjectName("N4")
138
+ Dialog.resize(500, 220)
139
+ self.grid_main = QtWidgets.QGridLayout(self)
140
+ self.grid_main.setContentsMargins(0, 0, 0, 0)
141
+ self.grid_main.setObjectName("gridLayout")
142
+
143
+ self.hbox = QtWidgets.QHBoxLayout()
144
+ self.hbox.setContentsMargins(0, 0, 0, 0)
145
+ self.hbox.setObjectName("gridLayout")
146
+ self.grid_main.addLayout(self.hbox, 0, 0)
147
+
148
+ self.checkBox = QtWidgets.QCheckBox()
149
+ self.hbox.addWidget(self.checkBox, 0)
150
+ self.checkBox.setObjectName("checkBox")
151
+ self.checkBox.stateChanged.connect(self.activate_advanced)
152
+ self.comboBox_image = QtWidgets.QComboBox()
153
+ self.comboBox_image.setGeometry(QtCore.QRect(20, 10, 321, 25))
154
+ self.comboBox_image.setObjectName("comboBox")
155
+ for i in range(2):
156
+ self.comboBox_image.addItem("")
157
+ self.comboBox_image.currentIndexChanged.connect(self.datachange)
158
+
159
+ self.comboBox_models = QtWidgets.QComboBox()
160
+ self.comboBox_models.setGeometry(QtCore.QRect(20, 10, 321, 25))
161
+ self.comboBox_models.setObjectName("comboBox")
162
+ for i in range(3):
163
+ self.comboBox_models.addItem("")
164
+ self.comboBox_models.currentIndexChanged.connect(partial(self.parChanged, True))
165
+
166
+ self.hbox.addWidget(self.comboBox_image, 1)
167
+ self.hbox.addWidget(self.comboBox_models, 2)
168
+
169
+ self.progressBar = QtWidgets.QProgressBar()
170
+ self.progressBar.setEnabled(False)
171
+ self.progressBar.setProperty("value", 0)
172
+ self.progressBar.setAlignment(QtCore.Qt.AlignCenter)
173
+ self.progressBar.setObjectName("progressBar")
174
+ self.progressBar.setMaximum(100)
175
+
176
+ self.hbox2 = QtWidgets.QHBoxLayout()
177
+ self.hbox2.setContentsMargins(0, 0, 0, 0)
178
+ self.hbox2.setObjectName("gridLayout")
179
+ self.hbox2.addWidget(self.progressBar, 1)
180
+
181
+ self.widget = QtWidgets.QWidget()
182
+ self.widget.setObjectName("widget")
183
+ self.gridLayout = QtWidgets.QGridLayout(self.widget)
184
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
185
+ self.gridLayout.setObjectName("gridLayout")
186
+ self.splitter_3 = QtWidgets.QSplitter(self.widget)
187
+ self.splitter_3.setOrientation(QtCore.Qt.Horizontal)
188
+ self.splitter_3.setObjectName("splitter_3")
189
+
190
+ self.gridLayout.addWidget(self.splitter_3, 0, 0, 1, 1)
191
+ self.splitter = QtWidgets.QSplitter(self.widget)
192
+ self.splitter.setOrientation(QtCore.Qt.Horizontal)
193
+ self.splitter.setObjectName("splitter")
194
+
195
+
196
+ self.checkbox_post = QtWidgets.QCheckBox(self.splitter)
197
+ # self.checkbox_post.setAlignment(QtCore.Qt.AlignCenter)
198
+
199
+
200
+ # self.checkbox_bone = QtWidgets.QCheckBox(self.splitter)
201
+ # self.checkbox_bone.setObjectName("histogram_bone")
202
+ # self.checkbox_bone.setChecked(False)
203
+ self.label_type = QtWidgets.QLabel(self.splitter)
204
+ self.label_type.setAlignment(QtCore.Qt.AlignCenter)
205
+ self.label_type.setObjectName("label")
206
+ self.spinbox_num_tissue = QtWidgets.QSpinBox(self.splitter)
207
+
208
+ self.spinbox_num_tissue.setMaximum(50)
209
+ self.spinbox_num_tissue.setMinimum(2)
210
+ self.spinbox_num_tissue.setSingleStep(1)
211
+ self.spinbox_num_tissue.setValue(3)
212
+
213
+ #self.spinbox_num_tissue.setGeometry(QtCore.QRect(20, 10, 321, 25))
214
+ #self.spinbox_num_tissue.setObjectName("comboBox")
215
+ #self.spinbox_num_tissue.setCurrentIndex(0)
216
+ #self.spinbox_num_tissue.currentIndexChanged.connect(partial(self.parChanged, False))
217
+ #for i in range(2):
218
+ # self.spinbox_num_tissue.addItem("")
219
+
220
+ # self.histogram_threshold_min = QtWidgets.QDoubleSpinBox(self.splitter)
221
+ # self.histogram_threshold_min.setObjectName("histogram_threshold_min")
222
+ # self.histogram_threshold_min.setValue(6)#(self.ht_min)*100)
223
+ # self.histogram_threshold_min.setMaximum(10)
224
+ # self.histogram_threshold_min.setMinimum(0)
225
+
226
+ # self.histogram_threshold_max = QtWidgets.QDoubleSpinBox(self.splitter)
227
+ # self.histogram_threshold_max.setObjectName("histogram_threshold_max")
228
+ # self.histogram_threshold_max.setValue((self.ht_max) * 100)
229
+ # self.histogram_threshold_max.setMaximum(100)
230
+ # self.histogram_threshold_max.setMinimum(0)
231
+
232
+ # self.histogram_threshold_min.setEnabled(True)
233
+ # self.histogram_threshold_max.setEnabled(False)
234
+
235
+ self.gridLayout.addWidget(self.splitter, 1, 0, 1, 1)
236
+
237
+ self.splitter_2 = QtWidgets.QSplitter(self.widget)
238
+ self.splitter_2.setOrientation(QtCore.Qt.Horizontal)
239
+ self.splitter_2.setObjectName("splitter_2")
240
+
241
+ self.label = QtWidgets.QLabel(self.splitter_2)
242
+ self.label.setAlignment(QtCore.Qt.AlignCenter)
243
+ self.label.setObjectName("label")
244
+ self.max_iter = QtWidgets.QSpinBox(self.splitter_2)
245
+ self.max_iter.setObjectName("fractional_threshold")
246
+
247
+ self.max_iter.setMaximum(1000)
248
+ self.max_iter.setMinimum(2)
249
+ self.max_iter.setSingleStep(1)
250
+ self.max_iter.setValue(50)
251
+
252
+
253
+
254
+ # self.label_pma = QtWidgets.QLabel(self.splitter_2)
255
+ # self.label_pma.setAlignment(QtCore.Qt.AlignCenter)
256
+ # self.label_pma.setObjectName("label")
257
+ # self.border_pix = QtWidgets.QDoubleSpinBox(self.splitter_2)
258
+ # self.border_pix.setObjectName("PMA")
259
+ # self.border_pix.setValue((self.borderp))
260
+ # self.border_pix.setMaximum(150)
261
+ # self.border_pix.setMinimum(0)
262
+ # self.border_pix.setSingleStep(5)
263
+ # self.border_pix.valueChanged.connect(partial(self.parChanged, False))
264
+ self.gridLayout.addWidget(self.splitter_2, 2, 0, 1, 1)
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
+
271
+ self.pushButton = QtWidgets.QPushButton()
272
+
273
+ self.pushButton.setObjectName("pushButton")
274
+ self.pushButton.pressed.connect(self.accepted_emit)
275
+ self.hbox2.addWidget(self.pushButton, 0)
276
+ self.pushButton.setDefault(True)
277
+ self.gridLayout.addWidget(self.splitter_3, 3, 0, 1, 1)
278
+
279
+ self.widget.setEnabled(False)
280
+
281
+ self.grid_main.addWidget(self.widget)
282
+ self.grid_main.addLayout(self.hbox2, 20, 0)
283
+
284
+ self.label_pr = QtWidgets.QLabel()
285
+ self.label_pr.setAlignment(QtCore.Qt.AlignCenter)
286
+ self.label_pr.setObjectName("label_2")
287
+ self.label_pr.setText('fdfdf')
288
+ self.label_pr.setVisible(False)
289
+
290
+ self.grid_main.addWidget(self.label_pr)
291
+ self.retranslateUi(Dialog)
292
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
293
+
294
+ def resetParams(self, state):
295
+
296
+ self.init_im_rec = None
297
+ self.initial_mask = None
298
+
299
+
300
+
301
+ def parChanged(self, model_changed=True):
302
+ """
303
+ if model parameter changed the user needs to run the algorithm again
304
+ :param model_changed:
305
+ :return:
306
+ """
307
+ self.initial_mask = None
308
+ if model_changed:
309
+ ci = self.comboBox_models.currentIndex()
310
+ if ci == 0:
311
+ self.max_iter.setValue(50)
312
+
313
+ elif ci == 1:
314
+ self.max_iter.setValue(50)
315
+ elif ci == 2:
316
+ self.max_iter.setValue(1)
317
+ else:
318
+ return
319
+
320
+
321
+
322
+ def clear(self):
323
+ # store the image
324
+ self.img = None
325
+ self.shape = None # 3D shape
326
+ self.mask = None
327
+ self.im_rec = None
328
+ self.initial_mask = None
329
+ self.init_im_rec = None
330
+
331
+ def retranslateUi(self, Dialog):
332
+ _translate = QtCore.QCoreApplication.translate
333
+ Dialog.setWindowTitle(_translate("Dialog", "Tissue Segmetnation"))
334
+ self.checkBox.setText(_translate("Dialog", "Advanced"))
335
+ self.comboBox_image.setItemText(0, _translate("Dialog", "View 1"))
336
+ self.comboBox_image.setItemText(1, _translate("Dialog", "View 2"))
337
+ #self.spinbox_num_tissue.setItemText(0, _translate("Dialog", "Ultrasound"))
338
+ #self.spinbox_num_tissue.setItemText(1, _translate("Dialog", "MRI"))
339
+ self.comboBox_models.setItemText(0, _translate("Dialog", "esFCM"))
340
+ self.comboBox_models.setItemText(1, _translate("Dialog", "FCM"))
341
+ self.comboBox_models.setItemText(2, _translate("Dialog", "GMM"))
342
+
343
+
344
+ self.pushButton.setText(_translate("Dialog", "Apply"))
345
+
346
+ self.checkbox_post.setText(_translate("Dialog", "PostCorr."))
347
+ # self.checkbox_bone.setText(_translate("Dialog", "Remove extra bone"))
348
+
349
+ self.label.setText(_translate("Dialog", "No. Iteration"))
350
+ self.label_type.setText(_translate("Dialog", "Image type"))
351
+
352
+ # self.label_pma.setText(_translate("Dialog", "Border Pixels"))
353
+
354
+
355
+ def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
356
+ self.closeSig.emit()
357
+ super(Tissue_Seg, self).closeEvent(a0)
358
+
359
+ def accepted_emit(self):
360
+ if not hasattr(self, 'initial_mask'):
361
+ return
362
+ try:
363
+ self.label_pr.setVisible(True)
364
+ self.label_pr.setText('Initialization...')
365
+
366
+
367
+ self.progressBar.setValue(5)
368
+ self._progress = 5
369
+
370
+ if self.initial_mask is None:
371
+ self.mask = self.initialization()
372
+
373
+
374
+
375
+
376
+ """
377
+ a = self.initial_mask.get_fdata().copy()
378
+ a *= self.mask
379
+ from melage.utils.utils import standardize
380
+ a = standardize(-a, 20)
381
+ a[self.mask==0] = -1
382
+ a = nib.Nifti1Image(a, self.initial_mask.affine, self.initial_mask.header)
383
+ a.to_filename('/home/binibica/eco/172_X_20210325_seg0.nii.gz')
384
+ """
385
+
386
+ self.im_seg = nib.Nifti1Image(self.mask, self.img.affine, self.img.header)
387
+ self.progressBar.setValue(98)
388
+ self.label_pr.setVisible(False)
389
+ self._progress = 100
390
+ self.progressBar.setValue(self._progress)
391
+ self._progress = 0
392
+ self.betcomp.emit(True)
393
+
394
+ except Exception as e:
395
+ print(e)
396
+ self.screen_error_msgbox(e.args[0])
397
+
398
+ def screen_error_msgbox(self, text=None):
399
+ if text is None:
400
+ text = 'There is an error. Screen is not captured. Please check the content.'
401
+ MessageBox = QtWidgets.QMessageBox(self)
402
+ MessageBox.setText(str(text))
403
+ MessageBox.setWindowTitle('Warning')
404
+ MessageBox.show()
405
+ self.progressBar.setValue(0)
406
+
407
+ def initialization(self):
408
+ ci = self.comboBox_models.currentIndex()
409
+ use_ssim = True
410
+ equalize = False
411
+ padding = 0
412
+ image_range = 1000
413
+ tissue_labels = None
414
+ num_tissues = self.spinbox_num_tissue.value()
415
+ fuzziness = 3
416
+ post_correction = self.checkbox_post.isChecked()
417
+ constraint = False
418
+ InitMethod = 'otsu'
419
+ if num_tissues>3 and not constraint:
420
+ post_correction = False
421
+ InitMethod = "kmeans"
422
+
423
+ epsilon = 5e-3
424
+ max_iter = self.max_iter.value()
425
+ image_used, pad_zero = remove_zero(self.img.get_fdata(), 0)
426
+ if ci == 0:
427
+ from melage.widgets.Segmentation.FCM import esFCM
428
+
429
+
430
+ model = esFCM(image_used, self.img.affine,
431
+ image_range, num_tissues, fuzziness,
432
+ epsilon=epsilon, max_iter=max_iter,
433
+ padding=padding,
434
+ tissuelabels=tissue_labels,
435
+ mask=image_used>0, use_ssim=use_ssim)
436
+ try:
437
+ model.initialize_fcm(initialization_method=InitMethod)
438
+ except:
439
+ model.initialize_fcm(initialization_method='kmeans')
440
+
441
+ model.fit(self.progressBar)
442
+ seg1 = model.predict(use_softmax=True).astype('int')
443
+ seg_init2 = np.zeros(self.img.shape)
444
+ seg_init2[pad_zero[0][0]:pad_zero[0][1] + 1, pad_zero[1][0]:pad_zero[1][1] + 1,
445
+ pad_zero[2][0]:pad_zero[2][1] + 1] = seg1
446
+ return seg_init2
447
+
448
+ elif ci == 1:
449
+ from melage.widgets.Segmentation.FCM import FCM_pure as FCM
450
+ model = FCM(image_used, self.img.affine, None,
451
+ image_range, num_tissues, fuzziness,
452
+ epsilon=epsilon, max_iter=max_iter,
453
+ padding=padding, constraint=False, post_correction=True, mask =image_used>0)
454
+ try:
455
+ model.initialize_fcm(initialization_method=InitMethod)
456
+ except:
457
+ model.initialize_fcm(initialization_method='kmeans')
458
+ model.fit(self.progressBar)
459
+ seg1 = model.predict(use_softmax=True).astype('int')
460
+ seg_init2 = np.zeros(self.img.shape)
461
+ seg_init2[pad_zero[0][0]:pad_zero[0][1] + 1, pad_zero[1][0]:pad_zero[1][1] + 1,
462
+ pad_zero[2][0]:pad_zero[2][1] + 1] = seg1
463
+ return seg_init2
464
+ elif ci == 2:
465
+ self.max_iter.setValue(1)
466
+ else:
467
+ return
468
+
469
+ def compute_mask(self, mask):
470
+ """
471
+ Convert surface mesh to volume
472
+ """
473
+ threshold = self.max_iter.value()
474
+ try:
475
+ import surfa as sf
476
+ if type(mask) == sf.image.framed.Volume:
477
+ label = mask.copy()
478
+ label = (label < threshold).connected_component_mask(k=1, fill=True)
479
+ return label.data.astype('int')
480
+ except:
481
+ pass
482
+
483
+ # from nibabel.processing import resample_from_to
484
+ from skimage.measure import label as label_connector
485
+ from scipy.ndimage import binary_fill_holes
486
+
487
+ im_mask = mask.get_fdata().copy()
488
+ # from utils.utils import Threshold_MultiOtsu
489
+
490
+ ind = im_mask >= threshold
491
+ im_mask[ind] = 0
492
+ im_mask[~ind] = 1
493
+ """
494
+
495
+ if self.checkbox_bone.isChecked():
496
+ A = self.img.get_fdata() * im_mask
497
+ thresholds = Threshold_MultiOtsu(A, 5)
498
+ im_mask[A > thresholds[-1]] = 0
499
+ """
500
+ # label correction
501
+ label_correction = False
502
+
503
+ labels = im_mask
504
+ labels = binary_fill_holes(labels)
505
+ labels, labels_freq = LargestCC(labels, connectivity=1)
506
+ argmax = np.argmax(
507
+ [self.img.get_fdata()[labels == el].sum() for el in range(len(labels_freq)) if el != 0]) + 1
508
+ # connectivity = 1
509
+ # labels = label_connector(labels, connectivity=connectivity)
510
+ # labels[labels>1]=1
511
+ # frequency = np.bincount(labels.flat)
512
+ # argmax = [el for el in np.argsort(-frequency) if el != 0][0]
513
+ # argmax = np.argmax([self.img.get_fdata()[labels == el].sum() for el in range(len(frequency)) if el != 0]) + 1
514
+ ind = labels != argmax
515
+ labels[ind] = 0
516
+ labels[~ind] = 1
517
+
518
+ if label_correction:
519
+ connectivity = 1
520
+ labels = label_connector(im_mask, connectivity=connectivity)
521
+ # labels[labels>1]=1
522
+ frequency = np.bincount(labels.flat)
523
+ # argmax = [el for el in np.argsort(-frequency) if el != 0][0]
524
+ argmax = np.argmax(
525
+ [self.img.get_fdata()[labels == el].sum() for el in range(len(frequency)) if el != 0]) + 1
526
+ ind = labels != argmax
527
+ labels[ind] = 0
528
+ # labels[~ind]=0
529
+ labels = binary_fill_holes(labels)
530
+ for slc in range(labels.shape[0]):
531
+ im = labels[slc, :, :]
532
+ if im.max() == 0:
533
+ continue
534
+ labels[slc, :, :] = binary_fill_holes(im)
535
+ for slc in range(labels.shape[1]):
536
+ im = labels[:, slc, :]
537
+ if im.max() == 0:
538
+ continue
539
+ labels[:, slc, :] = binary_fill_holes(im)
540
+
541
+ for slc in range(labels.shape[2]):
542
+ im = labels[:, :, slc]
543
+ if im.max() == 0:
544
+ continue
545
+
546
+ lbl = label_connector(im, connectivity=connectivity)
547
+ frequency = np.bincount(lbl.flat)
548
+ argmax = [el for el in np.argsort(-frequency) if el != 0][0]
549
+ ind_remove = frequency < 0.1 * frequency[argmax]
550
+ if ind_remove.any():
551
+ index_remove = np.argwhere(ind_remove)
552
+ for el in index_remove:
553
+ ind = lbl == el
554
+ lbl[ind] = 0
555
+ lbl[lbl > 0] = 1
556
+ else:
557
+ continue
558
+ labels[:, :, slc] = lbl.copy()
559
+
560
+ for slc in range(labels.shape[2]):
561
+ im = labels[:, :, slc]
562
+ if im.max() == 0:
563
+ continue
564
+ labels[:, :, slc] = binary_fill_holes(im)
565
+
566
+ return labels.astype('int')
567
+
568
+
569
+ def run():
570
+ import sys
571
+ app = QtWidgets.QApplication(sys.argv)
572
+ file = 't1_withoutmask.nii.gz'
573
+ import nibabel as nib
574
+ # m = nib.load(file)
575
+ # res = m.header["pixdim"][1]
576
+ # nibf = m.get_fdata()
577
+ from melage.utils.utils import normalize_mri
578
+ # nibf = standardize(nibf)
579
+ window = Tissue_Seg()
580
+ # window.setData(m, res)
581
+ window.set_pars()
582
+ window.show()
583
+ sys.exit(app.exec_())
584
+
585
+
586
+ if __name__ == '__main__':
587
+ run()
588
+