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,417 @@
1
+ from nibabel.affines import apply_affine
2
+ import numpy as np
3
+ from sklearn.linear_model import LinearRegression, BayesianRidge
4
+ from sklearn.ensemble import RandomForestRegressor
5
+ from sklearn.preprocessing import RobustScaler, StandardScaler
6
+ from scipy.special import softmax
7
+ import torch
8
+ import torch.nn.functional as F
9
+ from skimage.measure import label as label_connector
10
+ import nibabel as nib
11
+ from scipy.ndimage import binary_fill_holes
12
+ from scipy.ndimage import distance_transform_edt as edistance
13
+ from scipy.ndimage import distance_transform_cdt as chdistance
14
+
15
+ def compute_sdf(segmentation, distance_use='edt', bounded=True):
16
+ """BY B
17
+ compute the signed distance map of binary mask
18
+ input: segmentation, shape = (batch_size, class, x, y, z)
19
+ output: the Signed Distance Map (SDM)
20
+ sdm(x) = 0; x in segmentation boundary
21
+ -inf|x-y|; x in segmentation
22
+ +inf|x-y|; x out of segmentation
23
+ """
24
+ if distance_use=='cdt':
25
+ distance = chdistance
26
+ else:
27
+ distance = edistance
28
+
29
+ posmask = segmentation.astype(np.uint8)
30
+ # negmask = ~posmask
31
+ thrs = 4
32
+ from skimage import morphology
33
+
34
+ posdis = posmask
35
+ #posdis[posdis > np.max(posdis) / 5] = np.max(posdis) / 5
36
+ #posdis = posdis#/spacing[0]
37
+ #ind = posdis>thrs
38
+ #posdis[ind] = thrs
39
+
40
+
41
+ #ind_use = (interior+ exterior + eroded)>0
42
+ #int_ext = (interior+ exterior)>0
43
+ dis = -distance(posmask)
44
+
45
+ negdis = distance(1 - posmask)
46
+ dis[(negdis > 0)] = negdis[(negdis > 0)]
47
+ if bounded:
48
+ dis[dis>4] =4
49
+ dis[dis<-4] = -4
50
+
51
+
52
+ return dis
53
+
54
+ def binary_fill_holes_lcc_diff(index, threshold=None):
55
+ segl, segl_f = LargestCC(index)
56
+ if len(segl_f) > 2:
57
+ argmax_gmf = np.argsort(segl_f)[-2]
58
+ elif len(segl_f)==2:
59
+ argmax_gmf = 1
60
+ else:
61
+ argmax_gmf = 0
62
+ index_used = (segl != 0) * (segl != argmax_gmf)
63
+ index_used_filled = binary_fill_holes(index_used) > 0
64
+ index_remain = (index_used_filled.astype('int') - index_used.astype('int'))>0
65
+ if threshold is None:
66
+ threshold = (segl_f[argmax_gmf]-1)
67
+ segl_f_remove = np.argwhere(segl_f <= threshold)
68
+ segl_f_keep = np.argwhere(segl_f > threshold)
69
+
70
+ if len(segl_f_keep)< len(segl_f_remove):
71
+ shouldbe_kept = 0
72
+ for el in segl_f_keep:
73
+ shouldbe_kept += (segl == el).astype('int')
74
+ shouldbe_removed = ~(shouldbe_kept > 0)
75
+ else:
76
+ shouldbe_removed = 0
77
+ for el in segl_f_remove:
78
+ if el == 0:
79
+ continue
80
+ shouldbe_removed += (segl == el).astype('int')
81
+ if type(shouldbe_removed) == int:
82
+ shouldbe_removed = np.zeros_like(index_used)>0
83
+ else:
84
+ shouldbe_removed = shouldbe_removed>0
85
+ return index_remain, shouldbe_removed
86
+
87
+ class BiasCorrection(object):
88
+ def __init__(self):
89
+ pass
90
+ def set_info(self, target, reference, weight, biasfield, padding, mask, affine, cov_pq = None,
91
+ use_original=True):
92
+ self.target = target
93
+ self.reference = reference
94
+ self.weight = weight
95
+ self.biasfield = biasfield
96
+ self.padding = padding
97
+ self.mask = mask
98
+ self.affine = affine
99
+ self.scaler = RobustScaler()
100
+ self.scalerW = StandardScaler()
101
+ self.scalery = StandardScaler()
102
+ self.cov_pq = cov_pq
103
+ self.use_original=use_original
104
+
105
+ def _weighted_leas_square(self, imcoord, realdcoord, bias, weights,
106
+ use_original=True, sample_every= None):
107
+
108
+ if sample_every is not None:
109
+ vecB = bias[::sample_every]
110
+ weight = weights[::sample_every]
111
+ realdcoord = realdcoord[::sample_every, :]
112
+ else:
113
+ vecB = bias
114
+ weight = weights
115
+
116
+ A = self.biasfield.fit_transform(realdcoord)
117
+
118
+
119
+ if self.use_original:
120
+ AtW = np.einsum('ji,ik->ji',A.T, weight.reshape(-1,1))
121
+ AtWA = np.matmul(AtW,A)
122
+ AtWy = np.matmul(AtW, vecB.reshape(-1,1))
123
+ invAtWA = np.linalg.inv(AtWA)
124
+ coef = np.matmul(invAtWA, AtWy)
125
+ return coef
126
+ else:
127
+ A = self.scaler.fit_transform(A)
128
+
129
+ weight = (weight - weight.min())/np.ptp(weight)
130
+ vecB = self.scalery.fit_transform(vecB.reshape(-1, 1)).squeeze()
131
+ WLS = LinearRegression()
132
+
133
+ WLS.fit(A, vecB, sample_weight=1-weight)
134
+ return WLS
135
+ def normalize(self, fi, source):
136
+ a, b = source.min(), source.max()
137
+ dif = b - a
138
+ mindata = fi.min()
139
+ maxdata = fi.max()
140
+ filtered_image = a + (((fi - mindata) * dif) / (maxdata - mindata))
141
+ return filtered_image
142
+ def Apply(self, x, weight=None):
143
+ # apply bias field correction on image
144
+ ind_non_padd = (x != self.padding)* (self.mask==1)
145
+ coord = np.argwhere(ind_non_padd)
146
+ world = apply_affine(self.affine, coord)
147
+ A = self.biasfield.transform(world)
148
+ if self.use_original:
149
+ res = np.matmul(A, self.coef).squeeze()
150
+ else:
151
+ A = self.scaler.transform(A)
152
+ res = self.scalery.inverse_transform(self.coef.predict(A).reshape(-1,1)).squeeze()
153
+
154
+ if weight is not None:
155
+ x[ind_non_padd] = x[ind_non_padd] -weight[ind_non_padd]*res
156
+ else:
157
+ x[ind_non_padd] = x[ind_non_padd] -res
158
+ return x
159
+
160
+ def Run(self):
161
+ index_selected = (self.target!= self.padding)* (self.mask==1)
162
+ imcoord = np.argwhere(index_selected)
163
+ realdcoord = apply_affine(self.affine, imcoord)
164
+ if self.cov_pq is not None:
165
+ realdcoord = np.concatenate([realdcoord, self.cov_pq[index_selected].reshape(-1,1)], 1)
166
+
167
+ bias= (self.target[index_selected] - self.reference[index_selected])#/np.median(self.target[self.target>0])
168
+
169
+ weights = self.weight[index_selected]
170
+ # wheighted least square for bias field which polynomial here
171
+ self.coef = self._weighted_leas_square(imcoord, realdcoord, bias=bias, weights=weights, sample_every=None)
172
+
173
+ def gaussian(window_size, sigma):
174
+ gauss = torch.Tensor([np.exp(-(x - window_size // 2) ** 2 / float(2 * sigma ** 2))/(np.sqrt(2*np.pi)*sigma) for x in range(window_size)])
175
+ return gauss / gauss.sum()
176
+ def create_window_3D(window_size, channel):
177
+ from torch.autograd import Variable
178
+ _1D_window = gaussian(window_size, 1.5).unsqueeze(1)
179
+ _2D_window = _1D_window.mm(_1D_window.t())
180
+ _3D_window = _1D_window.mm(_2D_window.reshape(1, -1)).reshape(window_size, window_size,
181
+ window_size).float().unsqueeze(0).unsqueeze(0)
182
+ window = Variable(_3D_window.expand(channel, 1, window_size, window_size, window_size).contiguous())
183
+ return window
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+ def ssim3D(i1, i2, window, window_size, channel, contrast=True, L=1):
194
+ img1 =torch.from_numpy(i1).unsqueeze(0).unsqueeze(0).to(torch.float)
195
+ img2 = torch.from_numpy(i2).unsqueeze(0).unsqueeze(0).to(torch.float)
196
+ mux = F.conv3d(img1, window, padding=window_size // 2, groups=channel) #Overall Mean Luminance im1
197
+ muy = F.conv3d(img2, window, padding=window_size // 2, groups=channel)#Overall Mean Luminance im2
198
+ mux_sq = mux.pow(2)
199
+ muy_sq = muy.pow(2)
200
+ # Constants for SSIM calculation
201
+ C1 = (0.01 * L) ** 2
202
+ C2 = (0.03 * L) ** 2
203
+
204
+
205
+ mux_muy = mux * muy
206
+
207
+ sigmax_sq = F.conv3d(img1 * img1, window, padding=window_size // 2, groups=channel) - mux_sq
208
+ sigmax_sq = np.clip(sigmax_sq, 0, sigmax_sq.max())
209
+ sigmay_sq = F.conv3d(img2 * img2, window, padding=window_size // 2, groups=channel) - muy_sq
210
+ sigmay_sq = np.clip(sigmay_sq, 0, sigmay_sq.max())
211
+ sigmaxy = F.conv3d(img1 * img2, window, padding=window_size // 2, groups=channel) - mux_muy
212
+ # structural similarity
213
+ #ssim_map = (sigmaxy + C1) / (sigmax_sq.sqrt() * sigmay_sq.sqrt() + C1)
214
+ #Luminance
215
+ #ssim_map = (2 * mux * muy + C1) / (mux** 2 + muy** 2 + C1)#contrast
216
+ if contrast:
217
+ ssim_map = (2 * sigmax_sq.sqrt() * sigmay_sq.sqrt() + C1) / (sigmax_sq + sigmay_sq + C1)
218
+ else:
219
+ ssim_map = ((2 * mux_muy + C1) * (2 * sigmaxy + C2)) / ((mux_sq + muy_sq + C1) * (sigmax_sq + sigmay_sq + C2))
220
+ ssim_map = ssim_map.squeeze().detach().cpu().numpy()
221
+ return ssim_map
222
+
223
+ def LargestCC(segmentation, connectivity=3):
224
+ """
225
+ Get largets connected components
226
+ """
227
+ ndim = 3
228
+ if segmentation.ndim == 4:
229
+ segmentation = segmentation.squeeze(-1)
230
+ ndim = 4
231
+ labels = label_connector(segmentation, connectivity=connectivity)
232
+ frequency = np.bincount(labels.flat)
233
+ # frequency = -np.sort(-frequency)
234
+ return labels, frequency
235
+
236
+
237
+ def update_according_to_neighbours_conv(segmentation, index, label, sign='+',
238
+ connectivity=6,kernel_size =3, index_extra=None):
239
+ if kernel_size != 3:
240
+ kernel_size =3
241
+ segmentation_extended = segmentation.reshape(1, 1, *segmentation.shape)
242
+ segmentation_extended = torch.from_numpy(segmentation_extended.astype(np.float32))
243
+ in_out = np.zeros_like(segmentation)
244
+ if sign != '+':
245
+ in_out[index] += 6
246
+ if connectivity==6:
247
+ proxs = [(0, 1, 1), (1, 0, 1), (1, 1, 0), (1, 1, 2), (1, 2, 1), (2, 1, 1)]
248
+ elif connectivity==26:
249
+ import itertools
250
+ proxs=list(itertools.product([0,1,2], repeat=3))
251
+ proxs.remove((1, 1, 1))
252
+
253
+ for i, pr in enumerate(proxs):
254
+ kernel_used = np.zeros(kernel_size).astype(np.float32)
255
+ footprint = np.einsum('i,j,k->ijk', kernel_used, kernel_used, kernel_used) # mean
256
+ footprint[pr] = 1
257
+ footprint = torch.from_numpy(footprint.reshape(1, 1, *footprint.shape))
258
+
259
+ output = F.conv3d(segmentation_extended,
260
+ footprint, stride=1,
261
+ padding=kernel_size // 2).squeeze().cpu().numpy()
262
+ if index_extra is not None:
263
+ indo = 0
264
+ for l in label:
265
+ indo += (output == l)
266
+ index_sel = ((indo)+index_extra)*index
267
+ else:
268
+ indo = 0
269
+ for l in label:
270
+ indo += (output == l)
271
+ index_sel = (indo)*index
272
+ if sign != '+':
273
+ in_out[index_sel>0] -= 1
274
+ else:
275
+ in_out[index_sel>0] += 1
276
+ return in_out
277
+
278
+
279
+ def neighborhood_conv(output, kerenel_size=3, direction ='x',sqr2dist=False):
280
+ # compute neighborhood pixels
281
+ if sqr2dist: # average of all neighborhood pixels in 3D
282
+ kernel_used = torch.from_numpy(np.zeros(kerenel_size).astype(np.float32)) # mean
283
+ threed_kernel = torch.einsum('i,j,k->ijk', kernel_used, kernel_used, kernel_used) # mean
284
+
285
+ if direction=='xz':
286
+ threed_kernel[0][1][[0,2]] = 1 #xz
287
+ threed_kernel[2][1][[0, 2]] = 1 #xz
288
+ elif direction=='xy':
289
+ threed_kernel[0][0][1] = 1 #xy
290
+ threed_kernel[0][2][1] = 1 #xy
291
+
292
+ threed_kernel[2][0][1] = 1 #xy
293
+ threed_kernel[2][2][1] = 1 #xy
294
+ elif direction == 'yz':
295
+ threed_kernel[1][0][[0,2]] =1 # yz
296
+ threed_kernel[1][2][[0,2]] =1 # yz
297
+ elif direction == 'xyz':
298
+ threed_kernel[0][1][[0,2]] = 1 #xz
299
+ threed_kernel[2][1][[0, 2]] = 1 #xz
300
+
301
+ threed_kernel[0][0][1] = 1 #xy
302
+ threed_kernel[0][2][1] = 1 #xy
303
+
304
+ threed_kernel[2][0][1] = 1 #xy
305
+ threed_kernel[2][2][1] = 1 #xy
306
+
307
+ threed_kernel[1][0][[0,2]] =1 # yz
308
+ threed_kernel[1][2][[0,2]] =1 # yz
309
+ else:
310
+ raise exit('Direction should be xy, xz, yz or xyz')
311
+
312
+ else:
313
+ kernel_used = torch.from_numpy(np.zeros(kerenel_size).astype(np.float32)) # mean
314
+ threed_kernel = torch.einsum('i,j,k->ijk', kernel_used, kernel_used, kernel_used)
315
+ if direction=='x':
316
+
317
+ threed_kernel[0][1][1] = 1.0 # left
318
+ threed_kernel[2][1][1] = 1.0 # right
319
+ elif direction=='y':
320
+ threed_kernel[1][0][1] = 1.0 # left
321
+ threed_kernel[1][2][1] = 1.0 # right
322
+ elif direction == 'z':
323
+ threed_kernel[1][1][0] = 1.0 # left
324
+ threed_kernel[1][1][2] = 1.0 # right
325
+ elif direction == 'xyz':
326
+ threed_kernel[0][1][1] = 1.0 # left
327
+ threed_kernel[2][1][1] = 1.0 # right
328
+
329
+ threed_kernel[1][0][1] = 1.0 # left
330
+ threed_kernel[1][2][1] = 1.0 # right
331
+
332
+ threed_kernel[1][1][0] = 1.0 # left
333
+ threed_kernel[1][1][2] = 1.0 # right
334
+ else:
335
+ raise exit('Direction should be x, y, y or xyz')
336
+ inp_torch = torch.from_numpy(output.astype(np.float32)).unsqueeze(0).permute([4, 0, 1, 2, 3])
337
+ s = F.conv3d(inp_torch,
338
+ threed_kernel.reshape(1, 1, *threed_kernel.shape), stride=1,
339
+ padding=len(kernel_used) // 2)
340
+ s= s.permute([1, 2, 3, 4, 0]).squeeze(0).squeeze(-1).detach().cpu().numpy()
341
+ if s.ndim==3:
342
+ s = s.reshape(*s.shape,1)
343
+ return s
344
+
345
+ def axis_based_convolution(dif_ven, kernel_size=3, connectivity=6):
346
+ """
347
+ @param larg_dif:
348
+ @param kernel_size:
349
+ @param connectivity:
350
+ @return:
351
+ """
352
+ output = np.repeat(np.expand_dims(np.zeros_like(dif_ven), -1), connectivity, -1)
353
+ dif_ven = dif_ven.reshape(1, 1, *dif_ven.shape)
354
+ dif_ven = torch.from_numpy(dif_ven.astype(np.float32))
355
+
356
+ if connectivity==6:
357
+ #'x1,x2, y1,y2,z1,z2'
358
+ proxs=[(0,1,1), (2,1,1), (1,0,1), (1,2,1), (1,1,0), (1,1,2)]
359
+
360
+ elif connectivity==26:
361
+ import itertools
362
+ proxs=list(itertools.product([0,1,2], repeat=3))
363
+ proxs.remove((1, 1, 1))
364
+ for i, pr in enumerate(proxs):
365
+
366
+ kernel_used = np.zeros(kernel_size).astype(np.float32)
367
+ footprint = np.einsum('i,j,k->ijk', kernel_used, kernel_used, kernel_used) # mean
368
+ footprint[pr] = 1
369
+ footprint = torch.from_numpy(footprint.reshape(1, 1, *footprint.shape))
370
+
371
+ output[...,i] = F.conv3d(dif_ven,
372
+ footprint, stride=1,
373
+ padding=kernel_size // 2).squeeze().cpu().numpy()
374
+ return output
375
+
376
+
377
+ def adjust_common_structures(prob_r_nonc, threshold=5):
378
+ ind_zero = prob_r_nonc.sum(-1) == 0
379
+ seg_init_nonc = prob_r_nonc.argmax(-1) + 1
380
+ seg_init_nonc[ind_zero] = 0
381
+ neigbs = np.zeros_like(prob_r_nonc)
382
+ concat1 = []
383
+ concat2 = []
384
+ for i in range(prob_r_nonc.shape[-1]):
385
+ ind_ex = seg_init_nonc == (i + 1)
386
+ ind_cc, ind_extra = binary_fill_holes_lcc_diff(ind_ex, threshold=threshold)
387
+ neigbs[..., i] = ind_ex
388
+ concat1.append(ind_extra)
389
+ concat2.append(ind_cc)
390
+
391
+ neigbs = neighborhood_conv(neigbs, kerenel_size=3,
392
+ direction='xyz', sqr2dist=True)
393
+
394
+ neigbssf = softmax(neigbs,-1)
395
+ for indice in concat1:
396
+ prob_r_nonc[indice, :] = neigbssf[indice, :]
397
+ for indice in concat2:
398
+ prob_r_nonc[indice, :] = neigbssf[indice, :]
399
+ return prob_r_nonc
400
+
401
+
402
+
403
+ def rescale_between_a_b(image, a, b):
404
+ nifti_type = False
405
+ if hasattr(image, 'get_fdata'):
406
+ nifti_type = True
407
+ data_im = image.get_fdata().copy()
408
+ else:
409
+ data_im = image.copy()
410
+ dif = b-a
411
+ mindata= data_im.min()
412
+ maxdata = data_im.max()
413
+ data_im = a + (((data_im - mindata) * dif) / (maxdata - mindata))
414
+ if nifti_type:
415
+ return nib.Nifti1Image(data_im, image.affine, image.header)
416
+ else:
417
+ return data_im