melage 0.0.65__py3-none-any.whl → 1.0.0__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.
- assets/copyright.png +0 -0
- assets/resource/color/FreeSurferColorLUT.txt +2006 -0
- assets/resource/color/LUT_30.txt +31 -0
- assets/resource/color/SynthSeg.txt +34 -0
- assets/resource/color/lut_prostate.txt +20 -0
- assets/resource/horizontalview.png +0 -0
- assets/resource/main.ico +0 -0
- assets/resource/theme/create_ticks.py +85 -0
- assets/resource/theme/rc/checkbox_checked.png +0 -0
- assets/resource/theme/rc/checkbox_checked@2x.png +0 -0
- assets/resource/theme/rc/checkbox_checked_disabled.png +0 -0
- assets/resource/theme/rc/checkbox_checked_disabled@2x.png +0 -0
- assets/resource/theme/rc/checkbox_checked_focus.png +0 -0
- assets/resource/theme/rc/checkbox_checked_focus@2x.png +0 -0
- assets/resource/theme/rc/checkbox_checked_pressed.png +0 -0
- assets/resource/theme/rc/checkbox_checked_pressed@2x.png +0 -0
- assets/resource/theme/rc/checkbox_indeterminate.png +0 -0
- assets/resource/theme/rc/checkbox_indeterminate@2x.png +0 -0
- assets/resource/theme/rc/checkbox_indeterminate_disabled.png +0 -0
- assets/resource/theme/rc/checkbox_indeterminate_disabled@2x.png +0 -0
- assets/resource/theme/rc/checkbox_indeterminate_focus.png +0 -0
- assets/resource/theme/rc/checkbox_indeterminate_focus@2x.png +0 -0
- assets/resource/theme/rc/checkbox_indeterminate_pressed.png +0 -0
- assets/resource/theme/rc/checkbox_indeterminate_pressed@2x.png +0 -0
- assets/resource/theme/rc/checkbox_unchecked.png +0 -0
- assets/resource/theme/rc/checkbox_unchecked@2x.png +0 -0
- assets/resource/theme/rc/checkbox_unchecked_disabled.png +0 -0
- assets/resource/theme/rc/checkbox_unchecked_disabled@2x.png +0 -0
- assets/resource/theme/rc/checkbox_unchecked_focus.png +0 -0
- assets/resource/theme/rc/checkbox_unchecked_focus@2x.png +0 -0
- assets/resource/theme/rc/checkbox_unchecked_pressed.png +0 -0
- assets/resource/theme/rc/checkbox_unchecked_pressed@2x.png +0 -0
- assets/resource/verticalview.png +0 -0
- assets/resource/zoom_in.png +0 -0
- assets/resource/zoom_neutral (copy).png +0 -0
- assets/resource/zoom_neutral.png +0 -0
- assets/resource/zoom_out.png +0 -0
- data/MNI/mni_icbm152_t1_tal_nlin_sym_09a.nii +0 -0
- data/MNI/mni_icbm152_t1_tal_nlin_sym_09a_masked.nii.gz +0 -0
- data/MNI/mni_icbm152_t1_tal_nlin_sym_09a_seg.nii.gz +0 -0
- docs/manual_images/3D_rightc.png +0 -0
- docs/manual_images/3D_rightc_goto.png +0 -0
- docs/manual_images/3D_rightc_paint.png +0 -0
- docs/manual_images/3D_rightc_paint_draw1.png +0 -0
- docs/manual_images/3D_rightc_paint_draw2.png +0 -0
- docs/manual_images/3D_rightc_paint_render.png +0 -0
- docs/manual_images/3D_rightc_paint_render2.png +0 -0
- docs/manual_images/3D_rightc_paint_render3.png +0 -0
- docs/manual_images/3D_rightc_paint_render4.png +0 -0
- docs/manual_images/3D_rightc_paint_render5.png +0 -0
- docs/manual_images/3D_rightc_paint_render6.png +0 -0
- docs/manual_images/3D_rightc_seg.png +0 -0
- docs/manual_images/exit_toolbar.png +0 -0
- docs/manual_images/load_image_file.png +0 -0
- docs/manual_images/load_image_file_openp.png +0 -0
- docs/manual_images/main_page.png +0 -0
- docs/manual_images/menu_file.png +0 -0
- docs/manual_images/menu_file_export.png +0 -0
- docs/manual_images/menu_file_import.png +0 -0
- docs/manual_images/menu_file_settings.png +0 -0
- docs/manual_images/menu_file_ss.png +0 -0
- docs/manual_images/open_save_load.png +0 -0
- docs/manual_images/panning_toolbar.png +0 -0
- docs/manual_images/segmentation_toolbar.png +0 -0
- docs/manual_images/tab_mri.png +0 -0
- docs/manual_images/tab_us.png +0 -0
- docs/manual_images/tabs.png +0 -0
- docs/manual_images/toolbar_tools.png +0 -0
- docs/manual_images/tools_basic.png +0 -0
- docs/manual_images/tools_bet.png +0 -0
- docs/manual_images/tools_cs.png +0 -0
- docs/manual_images/tools_deepbet.png +0 -0
- docs/manual_images/tools_imageinfo.png +0 -0
- docs/manual_images/tools_maskO.png +0 -0
- docs/manual_images/tools_masking.png +0 -0
- docs/manual_images/tools_n4b.png +0 -0
- docs/manual_images/tools_resize.png +0 -0
- docs/manual_images/tools_ruler.png +0 -0
- docs/manual_images/tools_seg.png +0 -0
- docs/manual_images/tools_threshold.png +0 -0
- docs/manual_images/tools_tools.png +0 -0
- docs/manual_images/widget_color.png +0 -0
- docs/manual_images/widget_color_add.png +0 -0
- docs/manual_images/widget_color_add2.png +0 -0
- docs/manual_images/widget_color_additional.png +0 -0
- docs/manual_images/widget_images.png +0 -0
- docs/manual_images/widget_images2.png +0 -0
- docs/manual_images/widget_images3.png +0 -0
- docs/manual_images/widget_marker.png +0 -0
- docs/manual_images/widget_mri.png +0 -0
- docs/manual_images/widget_mri2.png +0 -0
- docs/manual_images/widget_segintensity.png +0 -0
- docs/manual_images/widget_tab_mutualview.png +0 -0
- docs/manual_images/widget_tab_mutualview2.png +0 -0
- docs/manual_images/widget_table.png +0 -0
- docs/manual_images/widget_table2.png +0 -0
- docs/manual_images/widget_us.png +0 -0
- melage/__init__.py +1 -1
- melage/config/__init__.py +100 -0
- melage/core/Registration/registration.py +54 -0
- melage/{utils/readData.py → core/io.py} +12 -4
- melage/{widgets/melageAbout.py → dialogs/AboutDialog.py} +1 -1
- melage/dialogs/MaskOperationsDialog.py +146 -0
- melage/dialogs/MaskingDialog.py +139 -0
- melage/dialogs/RegistrationDialog.py +311 -0
- melage/{widgets/ImageThresholding.py → dialogs/ThresholdingDialog.py} +2 -2
- melage/dialogs/TransformationDialog.py +275 -0
- melage/dialogs/__init__.py +9 -0
- melage/dialogs/dynamic_gui.py +327 -0
- melage/{widgets/fileDialog_widget.py → dialogs/helpers/FileDialog.py} +226 -1
- melage/dialogs/helpers/__init__.py +5 -0
- melage/main.py +13 -13
- melage/{widgets/mainwindow_widget.py → mainwindow_widget.py} +1434 -1408
- melage/plugins/N4_bias/N4.py +115 -0
- melage/plugins/N4_bias/N4_schema.py +40 -0
- melage/plugins/N4_bias/main/utils.py +46 -0
- melage/plugins/__init__.py +2 -0
- melage/plugins/bet/bet.py +176 -0
- melage/plugins/bet/bet_schema.py +73 -0
- melage/{widgets/brain_extraction.py → plugins/bet/main/BET.py} +51 -316
- melage/plugins/change_coord/change_coord.py +197 -0
- melage/plugins/change_coord/change_coord_schema.py +31 -0
- melage/plugins/change_coord/main/utils.py +15 -0
- melage/{widgets/Segmentation → plugins/esfcm/main}/FCM.py +3 -5
- melage/plugins/esfcm/main/test.py +57 -0
- melage/{widgets/Segmentation → plugins/esfcm/main}/utils.py +20 -0
- melage/plugins/esfcm/tissue_segmentation.py +124 -0
- melage/plugins/esfcm/tissue_segmentation_schema.py +33 -0
- melage/plugins/masking_operation/mo.py +115 -0
- melage/plugins/masking_operation/mo_schema.py +33 -0
- melage/plugins/mga_net/MGA_Net.py +145 -0
- melage/plugins/mga_net/MGA_Net_schema.py +29 -0
- melage/plugins/mga_net/main/figures/Network.txt +1 -0
- melage/{widgets/DeepLModels/new_unet.py → plugins/mga_net/main/model/mga_net.py} +3 -3
- melage/plugins/mga_net/main/model/utils.py +258 -0
- melage/plugins/mga_net/main/test_mgaNet.py +134 -0
- melage/plugins/resize/resize.py +136 -0
- melage/plugins/resize/resize_schema.py +41 -0
- melage/plugins/ui_helpers.py +144 -0
- melage/plugins/warpseg/WarpSeg.py +195 -0
- melage/plugins/warpseg/WarpSeg_schema.py +41 -0
- melage/plugins/warpseg/__init__.py +2 -0
- melage/plugins/warpseg/warpseg_main/data_reader/DDSet.py +303 -0
- melage/plugins/warpseg/warpseg_main/data_reader/DDSetSeg.py +279 -0
- melage/plugins/warpseg/warpseg_main/data_reader/__init__.py +60 -0
- melage/plugins/warpseg/warpseg_main/data_reader/baseData.py +18 -0
- melage/plugins/warpseg/warpseg_main/data_reader/utils.py +267 -0
- melage/plugins/warpseg/warpseg_main/dist_utils.py +18 -0
- melage/plugins/warpseg/warpseg_main/requirements.txt +10 -0
- melage/plugins/warpseg/warpseg_main/test.py +272 -0
- melage/plugins/warpseg/warpseg_main/train.py +432 -0
- melage/plugins/warpseg/warpseg_main/train_reg.py +373 -0
- melage/plugins/warpseg/warpseg_main/verify_post_process.py +73 -0
- melage/plugins/warpseg/warpseg_main/voxelmorph/__init__.py +45 -0
- melage/plugins/warpseg/warpseg_main/voxelmorph/py/__init__.py +1 -0
- melage/plugins/warpseg/warpseg_main/voxelmorph/py/utils.py +99 -0
- melage/{widgets/Synthstrip.py → plugins/warpseg/warpseg_main/voxelmorph/torch/Unet.py} +71 -51
- melage/plugins/warpseg/warpseg_main/voxelmorph/torch/__init__.py +4 -0
- melage/plugins/warpseg/warpseg_main/voxelmorph/torch/layers.py +97 -0
- melage/plugins/warpseg/warpseg_main/voxelmorph/torch/losses.py +462 -0
- melage/plugins/warpseg/warpseg_main/voxelmorph/torch/modelio.py +77 -0
- melage/{widgets/DeepLModels/InfantSegment/Unet.py → plugins/warpseg/warpseg_main/voxelmorph/torch/multi_stage_net.py} +76 -52
- melage/plugins/warpseg/warpseg_main/voxelmorph/torch/networks.py +308 -0
- melage/plugins/warpseg/warpseg_main/voxelmorph/torch/utils.py +470 -0
- melage/{utils/DispalyIm.py → rendering/DisplayIm.py} +67 -79
- melage/{utils → rendering}/glScientific.py +1 -1
- melage/utils/__init__.py +1 -0
- melage/utils/utils.py +343 -196
- melage/widgets/{dockWidgets.py → DockWidgets.py} +123 -55
- melage/widgets/SettingsWidget.py +98 -0
- melage/widgets/__init__.py +49 -0
- melage/widgets/openglWidgets.py +344 -156
- melage/widgets/openglWidgets_bu.py +645 -0
- melage/widgets/plugin_manager.py +62 -0
- melage-1.0.0.dist-info/METADATA +953 -0
- melage-1.0.0.dist-info/RECORD +571 -0
- melage-1.0.0.dist-info/entry_points.txt +2 -0
- melage-1.0.0.dist-info/top_level.txt +4 -0
- melage/requirements22.txt +0 -25
- melage/requirements_old.txt +0 -28
- melage/resource/theme/rc/checkbox_checked.png +0 -0
- melage/resource/theme/rc/checkbox_checked@2x.png +0 -0
- melage/resource/theme/rc/checkbox_checked@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_checked@2x000.png.png +0 -0
- melage/resource/theme/rc/checkbox_checked_disabled.png +0 -0
- melage/resource/theme/rc/checkbox_checked_disabled0.png +0 -0
- melage/resource/theme/rc/checkbox_checked_disabled@2x.png +0 -0
- melage/resource/theme/rc/checkbox_checked_disabled@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_checked_focus.png +0 -0
- melage/resource/theme/rc/checkbox_checked_focus0.png +0 -0
- melage/resource/theme/rc/checkbox_checked_focus@2x.png +0 -0
- melage/resource/theme/rc/checkbox_checked_focus@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_checked_pressed.png +0 -0
- melage/resource/theme/rc/checkbox_checked_pressed0.png +0 -0
- melage/resource/theme/rc/checkbox_checked_pressed@2x.png +0 -0
- melage/resource/theme/rc/checkbox_checked_pressed@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate@2x.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_disabled.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_disabled@2x.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_focus.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_focus@2x.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_pressed.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_pressed@2x.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked@2x.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked@2x00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled@2x.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled@2x00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus@2x.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus@2x00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed@2x.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed@2x00.png +0 -0
- melage/some_notes.txt +0 -3
- melage/utils/GMM.py +0 -720
- melage/utils/Shaders_bu.py +0 -314
- melage/utils/__init__0.py +0 -7
- melage/utils/glScientific_bc.py +0 -1585
- melage/utils/registration.py +0 -512
- melage/utils/source_folder.py +0 -18
- melage/version.txt +0 -1
- melage/widgets/ApplyMask.py +0 -212
- melage/widgets/ChangeSystem.py +0 -152
- melage/widgets/DeepLModels/NPP/dataset/mri_dataset_affine.py +0 -149
- melage/widgets/DeepLModels/NPP/models/checkpoints/npp_v1.pth.py +0 -0
- melage/widgets/DeepLModels/NPP/models/losses.py +0 -146
- melage/widgets/DeepLModels/NPP/models/model.py +0 -272
- melage/widgets/DeepLModels/NPP/models/utils.py +0 -303
- melage/widgets/DeepLModels/NPP/npp.py +0 -116
- melage/widgets/DeepLModels/NPP/requirements.txt +0 -8
- melage/widgets/DeepLModels/NPP/train/train.py +0 -116
- melage/widgets/DeepLModels/Unet3DAtt.py +0 -657
- melage/widgets/DeepLModels/Unet3D_basic.py +0 -648
- melage/widgets/DeepLModels/new_unet_old.py +0 -639
- melage/widgets/DeepLModels/new_unet_old2.py +0 -658
- melage/widgets/MaskOperations.py +0 -147
- melage/widgets/N4Dialog.py +0 -241
- melage/widgets/Segmentation/__init__.py +0 -588
- melage/widgets/SemiAutoSeg.py +0 -666
- melage/widgets/__init__0.py +0 -5
- melage/widgets/about.py +0 -246
- melage/widgets/activator.py +0 -147
- melage/widgets/be_dl.py +0 -409
- melage/widgets/be_dl_unet3d.py +0 -441
- melage/widgets/brain_extraction_dl.py +0 -887
- melage/widgets/brain_extraction_dl_bu.py +0 -869
- melage/widgets/registrationWidget.py +0 -342
- melage/widgets/settings_widget.py +0 -77
- melage/widgets/tranformationWidget.py +0 -275
- melage-0.0.65.dist-info/METADATA +0 -742
- melage-0.0.65.dist-info/RECORD +0 -501
- melage-0.0.65.dist-info/entry_points.txt +0 -2
- melage-0.0.65.dist-info/top_level.txt +0 -1
- {melage/resource → assets}/main.ico +0 -0
- {melage → assets}/resource/0circle.png +0 -0
- {melage → assets}/resource/0circle_faded.png +0 -0
- {melage → assets}/resource/3d.png +0 -0
- {melage → assets}/resource/3d.psd +0 -0
- {melage → assets}/resource/3dFaded.png +0 -0
- {melage → assets}/resource/Eraser.png +0 -0
- {melage → assets}/resource/EraserFaded.png +0 -0
- {melage → assets}/resource/EraserX.png +0 -0
- {melage → assets}/resource/EraserXFaded.png +0 -0
- {melage → assets}/resource/Eraser_icon.svg +0 -0
- {melage → assets}/resource/Hand.png +0 -0
- {melage → assets}/resource/HandIcons_0.png +0 -0
- {melage → assets}/resource/Hand_IX.png +0 -0
- {melage → assets}/resource/Hand_IXFaded.png +0 -0
- {melage → assets}/resource/Handsqueezed.png +0 -0
- {melage → assets}/resource/Handwriting (copy).png +0 -0
- {melage → assets}/resource/Handwriting.png +0 -0
- {melage → assets}/resource/HandwritingMinus.png +0 -0
- {melage → assets}/resource/HandwritingMinusX.png +0 -0
- {melage → assets}/resource/HandwritingPlus.png +0 -0
- {melage → assets}/resource/HandwritingPlusX.png +0 -0
- {melage → assets}/resource/Move_icon.svg +0 -0
- {melage → assets}/resource/PngItem_2422924.png +0 -0
- {melage → assets}/resource/about.png +0 -0
- {melage → assets}/resource/about_logo.png +0 -0
- {melage → assets}/resource/about_logo0.png +0 -0
- {melage → assets}/resource/action_check.png +0 -0
- {melage → assets}/resource/action_check_OFF.png +0 -0
- {melage → assets}/resource/arrow).png +0 -0
- {melage → assets}/resource/arrow.png +0 -0
- {melage → assets}/resource/arrowFaded.png +0 -0
- {melage → assets}/resource/arrow_org.png +0 -0
- {melage → assets}/resource/arrow_org.png.png +0 -0
- {melage → assets}/resource/arrows.png +0 -0
- {melage → assets}/resource/authors.mp4 +0 -0
- {melage → assets}/resource/box.png +0 -0
- {melage → assets}/resource/check-image-icon-0.jpg +0 -0
- {melage → assets}/resource/circle.png +0 -0
- {melage → assets}/resource/circle_faded.png +0 -0
- {melage → assets}/resource/circle_or.png +0 -0
- {melage → assets}/resource/close.png +0 -0
- {melage → assets}/resource/close_bg.png +0 -0
- {melage → assets}/resource/color/Simple.txt +0 -0
- {melage → assets}/resource/color/Tissue.txt +0 -0
- {melage → assets}/resource/color/Tissue12.txt +0 -0
- {melage → assets}/resource/color/albert_LUT.txt +0 -0
- {melage → assets}/resource/color/mcrib_LUT.txt +0 -0
- {melage → assets}/resource/color/pediatric1.txt +0 -0
- {melage → assets}/resource/color/pediatric1_old.txt +0 -0
- {melage → assets}/resource/color/pediatric2.txt +0 -0
- {melage → assets}/resource/color/pediatric3.txt +0 -0
- {melage → assets}/resource/color/pediatrics (copy).csv +0 -0
- {melage → assets}/resource/color/tissue_seg.txt +0 -0
- {melage → assets}/resource/contour.png +0 -0
- {melage → assets}/resource/contour.svg +0 -0
- {melage → assets}/resource/contourFaded.png +0 -0
- {melage → assets}/resource/contourX.png +0 -0
- {melage → assets}/resource/contourXFaded.png +0 -0
- {melage → assets}/resource/dti.png +0 -0
- {melage → assets}/resource/dti0.png +0 -0
- {melage → assets}/resource/dti222.png +0 -0
- {melage → assets}/resource/dti_or.png +0 -0
- {melage → assets}/resource/eco.png +0 -0
- {melage → assets}/resource/eco22.png +0 -0
- {melage → assets}/resource/eco_old.png +0 -0
- {melage → assets}/resource/eco_or.png +0 -0
- {melage → assets}/resource/eco_or2.png +0 -0
- {melage → assets}/resource/eco_seg.png +0 -0
- {melage → assets}/resource/eco_seg_old.png +0 -0
- {melage → assets}/resource/export.png +0 -0
- {melage → assets}/resource/hand-grab-icon-10.jpg +0 -0
- {melage → assets}/resource/hand-grab-icon-25.jpg +0 -0
- {melage → assets}/resource/info.png +0 -0
- {melage → assets}/resource/line.png +0 -0
- {melage → assets}/resource/linefaded.png +0 -0
- {melage → assets}/resource/load.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_goto.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_paint.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_paint_draw1.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_paint_draw2.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_paint_render.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_paint_render2.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_paint_render3.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_paint_render4.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_paint_render5.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_paint_render6.png +0 -0
- {melage → assets}/resource/manual_images/3D_rightc_seg.png +0 -0
- {melage → assets}/resource/manual_images/exit_toolbar.png +0 -0
- {melage → assets}/resource/manual_images/load_image_file.png +0 -0
- {melage → assets}/resource/manual_images/load_image_file_openp.png +0 -0
- {melage → assets}/resource/manual_images/main_page.png +0 -0
- {melage → assets}/resource/manual_images/menu_file.png +0 -0
- {melage → assets}/resource/manual_images/menu_file_export.png +0 -0
- {melage → assets}/resource/manual_images/menu_file_import.png +0 -0
- {melage → assets}/resource/manual_images/menu_file_settings.png +0 -0
- {melage → assets}/resource/manual_images/menu_file_ss.png +0 -0
- {melage → assets}/resource/manual_images/open_save_load.png +0 -0
- {melage → assets}/resource/manual_images/panning_toolbar.png +0 -0
- {melage → assets}/resource/manual_images/segmentation_toolbar.png +0 -0
- {melage → assets}/resource/manual_images/tab_mri.png +0 -0
- {melage → assets}/resource/manual_images/tab_us.png +0 -0
- {melage → assets}/resource/manual_images/tabs.png +0 -0
- {melage → assets}/resource/manual_images/toolbar_tools.png +0 -0
- {melage → assets}/resource/manual_images/tools_basic.png +0 -0
- {melage → assets}/resource/manual_images/tools_bet.png +0 -0
- {melage → assets}/resource/manual_images/tools_cs.png +0 -0
- {melage → assets}/resource/manual_images/tools_deepbet.png +0 -0
- {melage → assets}/resource/manual_images/tools_imageinfo.png +0 -0
- {melage → assets}/resource/manual_images/tools_maskO.png +0 -0
- {melage → assets}/resource/manual_images/tools_masking.png +0 -0
- {melage → assets}/resource/manual_images/tools_n4b.png +0 -0
- {melage → assets}/resource/manual_images/tools_resize.png +0 -0
- {melage → assets}/resource/manual_images/tools_ruler.png +0 -0
- {melage → assets}/resource/manual_images/tools_seg.png +0 -0
- {melage → assets}/resource/manual_images/tools_threshold.png +0 -0
- {melage → assets}/resource/manual_images/tools_tools.png +0 -0
- {melage → assets}/resource/manual_images/widget_color.png +0 -0
- {melage → assets}/resource/manual_images/widget_color_add.png +0 -0
- {melage → assets}/resource/manual_images/widget_color_add2.png +0 -0
- {melage → assets}/resource/manual_images/widget_color_additional.png +0 -0
- {melage → assets}/resource/manual_images/widget_images.png +0 -0
- {melage → assets}/resource/manual_images/widget_images2.png +0 -0
- {melage → assets}/resource/manual_images/widget_images3.png +0 -0
- {melage → assets}/resource/manual_images/widget_marker.png +0 -0
- {melage → assets}/resource/manual_images/widget_mri.png +0 -0
- {melage → assets}/resource/manual_images/widget_mri2.png +0 -0
- {melage → assets}/resource/manual_images/widget_segintensity.png +0 -0
- {melage → assets}/resource/manual_images/widget_tab_mutualview.png +0 -0
- {melage → assets}/resource/manual_images/widget_tab_mutualview2.png +0 -0
- {melage → assets}/resource/manual_images/widget_table.png +0 -0
- {melage → assets}/resource/manual_images/widget_table2.png +0 -0
- {melage → assets}/resource/manual_images/widget_us.png +0 -0
- {melage → assets}/resource/melage_top.ico +0 -0
- {melage → assets}/resource/melage_top.png +0 -0
- {melage → assets}/resource/melage_top0.png +0 -0
- {melage → assets}/resource/melage_top1.png +0 -0
- {melage → assets}/resource/melage_top4.png +0 -0
- {melage → assets}/resource/mri (copy).png +0 -0
- {melage → assets}/resource/mri.png +0 -0
- {melage → assets}/resource/mri0.png +0 -0
- {melage → assets}/resource/mri000.png +0 -0
- {melage → assets}/resource/mri22.png +0 -0
- {melage → assets}/resource/mri_big.png +0 -0
- {melage → assets}/resource/mri_old.png +0 -0
- {melage → assets}/resource/mri_seg.png +0 -0
- {melage → assets}/resource/mri_seg_old.png +0 -0
- {melage → assets}/resource/new.png +0 -0
- {melage → assets}/resource/open.png +0 -0
- {melage → assets}/resource/open2.png +0 -0
- {melage → assets}/resource/pan.png +0 -0
- {melage → assets}/resource/pencil.png +0 -0
- {melage → assets}/resource/pencilFaded.png +0 -0
- {melage → assets}/resource/points.png +0 -0
- {melage → assets}/resource/pointsFaded.png +0 -0
- {melage → assets}/resource/rotate.png +0 -0
- {melage → assets}/resource/ruler.png +0 -0
- {melage → assets}/resource/rulerFaded.png +0 -0
- {melage → assets}/resource/s.png +0 -0
- {melage → assets}/resource/s.psd +0 -0
- {melage → assets}/resource/save.png +0 -0
- {melage → assets}/resource/saveas.png +0 -0
- {melage → assets}/resource/seg_mri.png +0 -0
- {melage → assets}/resource/seg_mri2.png +0 -0
- {melage → assets}/resource/settings.png +0 -0
- {melage → assets}/resource/synch.png +0 -0
- {melage → assets}/resource/synchFaded.png +0 -0
- {melage → assets}/resource/theme/rc/.keep +0 -0
- {melage → assets}/resource/theme/rc/arrow_down.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_down@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_down_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_down_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_down_focus.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_down_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_down_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_down_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_left.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_left@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_left_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_left_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_left_focus.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_left_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_left_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_left_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_right.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_right@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_right_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_right_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_right_focus.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_right_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_right_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_right_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_up.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_up@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_up_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_up_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_up_focus.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_up_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_up_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/arrow_up_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/base_icon.png +0 -0
- {melage → assets}/resource/theme/rc/base_icon@2x.png +0 -0
- {melage → assets}/resource/theme/rc/base_icon_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/base_icon_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/base_icon_focus.png +0 -0
- {melage → assets}/resource/theme/rc/base_icon_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/base_icon_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/base_icon_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_closed.png +0 -0
- {melage → assets}/resource/theme/rc/branch_closed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_closed_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/branch_closed_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_closed_focus.png +0 -0
- {melage → assets}/resource/theme/rc/branch_closed_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_closed_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/branch_closed_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_end.png +0 -0
- {melage → assets}/resource/theme/rc/branch_end@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_end_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/branch_end_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_end_focus.png +0 -0
- {melage → assets}/resource/theme/rc/branch_end_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_end_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/branch_end_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_line.png +0 -0
- {melage → assets}/resource/theme/rc/branch_line@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_line_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/branch_line_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_line_focus.png +0 -0
- {melage → assets}/resource/theme/rc/branch_line_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_line_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/branch_line_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_more.png +0 -0
- {melage → assets}/resource/theme/rc/branch_more@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_more_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/branch_more_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_more_focus.png +0 -0
- {melage → assets}/resource/theme/rc/branch_more_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_more_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/branch_more_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_open.png +0 -0
- {melage → assets}/resource/theme/rc/branch_open@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_open_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/branch_open_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_open_focus.png +0 -0
- {melage → assets}/resource/theme/rc/branch_open_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/branch_open_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/branch_open_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/checkbox_checked0.png +0 -0
- {melage → assets}/resource/theme/rc/line_horizontal.png +0 -0
- {melage → assets}/resource/theme/rc/line_horizontal@2x.png +0 -0
- {melage → assets}/resource/theme/rc/line_horizontal_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/line_horizontal_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/line_horizontal_focus.png +0 -0
- {melage → assets}/resource/theme/rc/line_horizontal_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/line_horizontal_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/line_horizontal_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/line_vertical.png +0 -0
- {melage → assets}/resource/theme/rc/line_vertical@2x.png +0 -0
- {melage → assets}/resource/theme/rc/line_vertical_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/line_vertical_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/line_vertical_focus.png +0 -0
- {melage → assets}/resource/theme/rc/line_vertical_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/line_vertical_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/line_vertical_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/radio_checked.png +0 -0
- {melage → assets}/resource/theme/rc/radio_checked@2x.png +0 -0
- {melage → assets}/resource/theme/rc/radio_checked_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/radio_checked_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/radio_checked_focus.png +0 -0
- {melage → assets}/resource/theme/rc/radio_checked_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/radio_checked_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/radio_checked_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/radio_unchecked.png +0 -0
- {melage → assets}/resource/theme/rc/radio_unchecked@2x.png +0 -0
- {melage → assets}/resource/theme/rc/radio_unchecked_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/radio_unchecked_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/radio_unchecked_focus.png +0 -0
- {melage → assets}/resource/theme/rc/radio_unchecked_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/radio_unchecked_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/radio_unchecked_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_horizontal.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_horizontal@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_horizontal_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_horizontal_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_horizontal_focus.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_horizontal_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_horizontal_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_horizontal_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_vertical.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_vertical@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_vertical_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_vertical_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_vertical_focus.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_vertical_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_vertical_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_move_vertical_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_horizontal.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_horizontal@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_focus.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_vertical.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_vertical@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_vertical_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_vertical_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_vertical_focus.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_vertical_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_vertical_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/toolbar_separator_vertical_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/transparent.png +0 -0
- {melage → assets}/resource/theme/rc/transparent@2x.png +0 -0
- {melage → assets}/resource/theme/rc/transparent_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/transparent_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/transparent_focus.png +0 -0
- {melage → assets}/resource/theme/rc/transparent_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/transparent_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/transparent_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_close.png +0 -0
- {melage → assets}/resource/theme/rc/window_close@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_close_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/window_close_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_close_focus.png +0 -0
- {melage → assets}/resource/theme/rc/window_close_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_close_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/window_close_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_grip.png +0 -0
- {melage → assets}/resource/theme/rc/window_grip@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_grip_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/window_grip_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_grip_focus.png +0 -0
- {melage → assets}/resource/theme/rc/window_grip_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_grip_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/window_grip_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_minimize.png +0 -0
- {melage → assets}/resource/theme/rc/window_minimize@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_minimize_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/window_minimize_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_minimize_focus.png +0 -0
- {melage → assets}/resource/theme/rc/window_minimize_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_minimize_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/window_minimize_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_undock.png +0 -0
- {melage → assets}/resource/theme/rc/window_undock@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_undock_disabled.png +0 -0
- {melage → assets}/resource/theme/rc/window_undock_disabled@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_undock_focus.png +0 -0
- {melage → assets}/resource/theme/rc/window_undock_focus@2x.png +0 -0
- {melage → assets}/resource/theme/rc/window_undock_pressed.png +0 -0
- {melage → assets}/resource/theme/rc/window_undock_pressed@2x.png +0 -0
- {melage → assets}/resource/theme/style.qss +0 -0
- {melage → assets}/resource/tract.png +0 -0
- {melage → assets}/resource/view1.png +0 -0
- {melage → assets}/resource/view1_eco.png +0 -0
- {melage → assets}/resource/view1_mri.png +0 -0
- {melage → assets}/resource/view1_seg.png +0 -0
- {melage → assets}/resource/view2.png +0 -0
- {melage → assets}/resource/view2_seg.png +0 -0
- {melage → assets}/resource/w.png +0 -0
- {melage → assets}/resource/zoom_inFaded.png +0 -0
- /melage/resource/zoom_in.png → /assets/resource/zoom_in_old.png +0 -0
- {melage → assets}/resource/zoom_outFaded.png +0 -0
- /melage/resource/zoom_out.png → /assets/resource/zoom_out_old.png +0 -0
- /melage/{widgets/activation.py → dialogs/ActivationDialog.py} +0 -0
- /melage/{widgets/HistImage.py → dialogs/HistogramDialog.py} +0 -0
- /melage/{widgets/iminfo.py → dialogs/ImInfoDialog.py} +0 -0
- /melage/{widgets/colorwidget.py → dialogs/helpers/ColorDialog.py} +0 -0
- /melage/{utils/custom_QScrollBar.py → dialogs/helpers/CustomScrollbar.py} +0 -0
- /melage/{widgets/repeat_widget.py → dialogs/helpers/RepeatDialog.py} +0 -0
- /melage/{widgets/screenshot_widget.py → dialogs/helpers/ScreenshotDialog.py} +0 -0
- /melage/{cli.py → melage.py} +0 -0
- /melage/{utils/brain_extraction_helper.py → plugins/bet/main/utils.py} +0 -0
- /melage/{graphics → rendering}/GLGraphicsItem.py +0 -0
- /melage/{graphics → rendering}/GLViewWidget.py +0 -0
- /melage/{graphics → rendering}/Transform3D.py +0 -0
- /melage/{graphics → rendering}/__init__.py +0 -0
- /melage/{graphics → rendering}/functions.py +0 -0
- /melage/{utils → rendering/helpers}/Shaders_120.py +0 -0
- /melage/{utils → rendering/helpers}/Shaders_330.py +0 -0
- /melage/{graphics → rendering}/items/GLAxisItem.py +0 -0
- /melage/{graphics → rendering}/items/GLGridItem.py +0 -0
- /melage/{graphics → rendering}/items/GLPolygonItem.py +0 -0
- /melage/{graphics → rendering}/items/GLScatterPlotItem.py +0 -0
- /melage/{graphics → rendering}/items/GLVolumeItem.py +0 -0
- /melage/{graphics → rendering}/items/GLVolumeItem_b.py +0 -0
- /melage/{graphics → rendering}/items/__init__.py +0 -0
- /melage/{graphics → rendering}/shaders.py +0 -0
- /melage/widgets/{enhanceImWidget.py → EnhanceImageWidget.py} +0 -0
- {melage-0.0.65.dist-info → melage-1.0.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
import torch.nn.functional as F
|
|
3
|
+
import torch.nn as nn
|
|
4
|
+
import ants
|
|
5
|
+
import nibabel as nib
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
from scipy.ndimage import gaussian_filter
|
|
9
|
+
from scipy.ndimage import zoom
|
|
10
|
+
|
|
11
|
+
def intensity_res(imT1, prob):
|
|
12
|
+
# Avoid division by zero
|
|
13
|
+
eps = 1e-5
|
|
14
|
+
|
|
15
|
+
# Ensure input tensors are on the same device (e.g., CUDA or CPU)
|
|
16
|
+
imT1 = imT1.float() # Ensure imT1 is a float tensor
|
|
17
|
+
prob = prob.float() # Ensure prob is a float tensor
|
|
18
|
+
|
|
19
|
+
# Broadcast imT1 to match the shape of prob (B, K, D, H, W)
|
|
20
|
+
if imT1.shape[1] == 1:
|
|
21
|
+
imT1_broadcast = imT1.expand(-1, prob.shape[1], -1, -1, -1) # Broadcast imT1 to (B, K, D, H, W)
|
|
22
|
+
else:
|
|
23
|
+
imT1_broadcast = imT1 # (B, K, D, H, W), no need to broadcast if shapes already match
|
|
24
|
+
|
|
25
|
+
# Mean: mu_k shape (B, K)
|
|
26
|
+
sum_prob = torch.sum(prob, dim=(2, 3, 4)) # Sum over the spatial dimensions
|
|
27
|
+
mu_k = torch.sum(prob * imT1_broadcast, dim=(2, 3, 4)) / (sum_prob + eps)
|
|
28
|
+
|
|
29
|
+
# Variance: var_k shape (B, K)
|
|
30
|
+
mu_k_broadcast = mu_k.unsqueeze(-1).unsqueeze(-1).unsqueeze(-1) # (B, K, 1, 1, 1) for broadcasting
|
|
31
|
+
var_k = torch.sum(prob * (imT1_broadcast - mu_k_broadcast) ** 2, dim=(2, 3, 4)) / (sum_prob + eps)
|
|
32
|
+
|
|
33
|
+
# Standard deviation: std_k shape (B, K)
|
|
34
|
+
std_k = torch.sqrt(var_k + eps)
|
|
35
|
+
|
|
36
|
+
# Expand for broadcasting
|
|
37
|
+
mu = mu_k.unsqueeze(-1).unsqueeze(-1).unsqueeze(-1) # shape (B, K, 1, 1, 1)
|
|
38
|
+
std = std_k.unsqueeze(-1).unsqueeze(-1).unsqueeze(-1) # shape (B, K, 1, 1, 1)
|
|
39
|
+
|
|
40
|
+
# Log-likelihood under Gaussian model
|
|
41
|
+
log_likelihood = -0.5 * ((imT1_broadcast - mu) ** 2) / (std ** 2 + eps) \
|
|
42
|
+
- torch.log(std + eps) \
|
|
43
|
+
- 0.5 * np.log(2 * np.pi)
|
|
44
|
+
|
|
45
|
+
# Softmax across regions (K) to get confidence weights
|
|
46
|
+
logits = log_likelihood
|
|
47
|
+
logits_max = torch.max(logits, dim=1, keepdim=True).values # Numerical stability (subtract max)
|
|
48
|
+
exp_logits = torch.exp(logits - logits_max) # for numerical stability
|
|
49
|
+
confidence_weights = exp_logits / (torch.sum(exp_logits, dim=1, keepdim=True) + eps) # shape (B, K, D, H, W)
|
|
50
|
+
|
|
51
|
+
return confidence_weights
|
|
52
|
+
|
|
53
|
+
def create_image_from_prob(imT1, prob_value):
|
|
54
|
+
topk_probs, topk_labels = torch.topk(prob_value, k=1, dim=1)
|
|
55
|
+
|
|
56
|
+
centers = (prob_value * imT1).sum(dim=[2, 3, 4]) / (prob_value.sum(dim=[2, 3, 4]) + 1e-5) # shape [B, C]
|
|
57
|
+
# Reshape centers for broadcasting: [B, C, 1, 1, 1]
|
|
58
|
+
centers_expanded = centers.view(centers.shape[0], centers.shape[1], 1, 1, 1)
|
|
59
|
+
# Expand to match spatial dims of topk_labels: [B, C, D, H, W]
|
|
60
|
+
centers_expanded = centers_expanded.expand(-1, -1, *topk_labels.shape[2:])
|
|
61
|
+
# Make sure topk_labels is shaped for indexing: [B, 1, D, H, W] (for class/channel selection)
|
|
62
|
+
# It should be long/int type
|
|
63
|
+
topk_labels = topk_labels.long() # Add channel dim for gather
|
|
64
|
+
# Gather values: [B, 1, D, H, W]
|
|
65
|
+
new_image = torch.gather(centers_expanded, dim=1, index=topk_labels)
|
|
66
|
+
|
|
67
|
+
return new_image
|
|
68
|
+
|
|
69
|
+
def write_to_file(prob_atlas_size,mask_original, mask_new, prob_new, pathOrigin):
|
|
70
|
+
imA = read_atlas_file(pathOrigin, rewrite_to_file=True)
|
|
71
|
+
|
|
72
|
+
mask_original = mask_original.squeeze().detach().cpu().numpy()
|
|
73
|
+
mask_original = nib.Nifti1Image(mask_original.astype(np.int16), affine=imA.affine, header=imA.header)
|
|
74
|
+
|
|
75
|
+
mask_original.to_filename(mask_new)
|
|
76
|
+
|
|
77
|
+
prob_atlas_size = prob_atlas_size.squeeze().detach().cpu().numpy()
|
|
78
|
+
prob_atlas_size = nib.Nifti1Image(prob_atlas_size, affine=imA.affine, header=imA.header)
|
|
79
|
+
|
|
80
|
+
prob_atlas_size.to_filename(prob_new)
|
|
81
|
+
print(f'OutProb_original: {prob_new}')
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class Histogram_Matching(nn.Module):
|
|
86
|
+
def __init__(self, differentiable=True, bins=32, sigma=None):
|
|
87
|
+
super(Histogram_Matching, self).__init__()
|
|
88
|
+
self.differentiable = differentiable
|
|
89
|
+
self.bins = bins
|
|
90
|
+
self.sigma = sigma if sigma is not None else 5.0
|
|
91
|
+
|
|
92
|
+
def forward(self, dst, ref):
|
|
93
|
+
B, C, D, H, W = dst.shape
|
|
94
|
+
assert dst.device == ref.device
|
|
95
|
+
|
|
96
|
+
hist_dst = self.cal_hist(dst)
|
|
97
|
+
hist_ref = self.cal_hist(ref)
|
|
98
|
+
|
|
99
|
+
tables = self.cal_trans_batch(hist_dst, hist_ref)
|
|
100
|
+
|
|
101
|
+
dst_flat = dst.view(B*C, -1) * (self.bins - 1) # scale intensities
|
|
102
|
+
dst_flat = dst_flat.unsqueeze(2) # (B*C, N, 1)
|
|
103
|
+
|
|
104
|
+
indices = torch.linspace(0, self.bins-1, self.bins, device=dst.device).view(1, 1, -1) # (1,1,bins)
|
|
105
|
+
|
|
106
|
+
weights = torch.softmax(-((dst_flat - indices)**2) / (2*(self.sigma**2)), dim=-1) # (B*C, N, bins)
|
|
107
|
+
|
|
108
|
+
matched = torch.bmm(weights, tables.unsqueeze(-1)).squeeze(-1) # (B*C, N)
|
|
109
|
+
|
|
110
|
+
matched = matched.view(B, C, D, H, W) / (self.bins - 1) # back to [0,1]
|
|
111
|
+
|
|
112
|
+
return matched
|
|
113
|
+
|
|
114
|
+
def cal_hist(self, img):
|
|
115
|
+
B, C, D, H, W = img.shape
|
|
116
|
+
if self.differentiable:
|
|
117
|
+
hists = self.soft_histc_batch(img * (self.bins - 1))
|
|
118
|
+
else:
|
|
119
|
+
hists = torch.stack([
|
|
120
|
+
torch.histc(img[b, c] * (self.bins - 1), bins=self.bins, min=0, max=self.bins-1)
|
|
121
|
+
for b in range(B) for c in range(C)
|
|
122
|
+
])
|
|
123
|
+
hists = F.normalize(hists.float(), p=1, dim=1)
|
|
124
|
+
cdfs = torch.cumsum(hists, dim=1)
|
|
125
|
+
return cdfs
|
|
126
|
+
|
|
127
|
+
def soft_histc_batch(self, x):
|
|
128
|
+
B, C, D, H, W = x.shape
|
|
129
|
+
x = x.view(B*C, -1)
|
|
130
|
+
|
|
131
|
+
delta = 1.0
|
|
132
|
+
centers = torch.linspace(0, self.bins-1, self.bins, device=x.device).float()
|
|
133
|
+
centers = centers[None, :, None] # (1, bins, 1)
|
|
134
|
+
|
|
135
|
+
x = x.unsqueeze(1) # (B*C, 1, N)
|
|
136
|
+
|
|
137
|
+
soft_bins = torch.sigmoid((x - centers + delta/2) * self.sigma) - torch.sigmoid((x - centers - delta/2) * self.sigma)
|
|
138
|
+
soft_hist = soft_bins.sum(dim=2) # (B*C, bins)
|
|
139
|
+
|
|
140
|
+
return soft_hist
|
|
141
|
+
|
|
142
|
+
def cal_trans_batch(self, cdf_src, cdf_ref):
|
|
143
|
+
Bc, bins = cdf_src.shape
|
|
144
|
+
cdf_src = cdf_src.unsqueeze(2) # (B*C, bins, 1)
|
|
145
|
+
cdf_ref = cdf_ref.unsqueeze(1) # (B*C, 1, bins)
|
|
146
|
+
|
|
147
|
+
dist = torch.abs(cdf_src - cdf_ref) # (B*C, bins, bins)
|
|
148
|
+
|
|
149
|
+
mapping = dist.argmin(dim=2) # (B*C, bins)
|
|
150
|
+
|
|
151
|
+
return mapping.float()
|
|
152
|
+
|
|
153
|
+
def erode_mask(mask, radius=1):
|
|
154
|
+
kernel = torch.ones((1, 1, 2*radius+1, 2*radius+1, 2*radius+1), device=mask.device)
|
|
155
|
+
padded = F.pad(mask.float(), [radius]*6, mode='replicate')
|
|
156
|
+
eroded = F.conv3d(padded, kernel) == kernel.numel()
|
|
157
|
+
return eroded.float()
|
|
158
|
+
|
|
159
|
+
def adjust_probs_with_uncertainty(probs, uncertainty, min_temp=1.0, max_temp=5.0):
|
|
160
|
+
# Normalize uncertainty to [0, 1]
|
|
161
|
+
norm_unc = (uncertainty - uncertainty.min()) / (uncertainty.max() - uncertainty.min() + 1e-5)
|
|
162
|
+
|
|
163
|
+
# Convert normalized uncertainty to temperature (higher temp = more smoothing)
|
|
164
|
+
temp = min_temp + (max_temp - min_temp) * norm_unc # shape: (B, 1, D, H, W)
|
|
165
|
+
|
|
166
|
+
# To avoid instability, apply temp scaling in log-space
|
|
167
|
+
log_probs = torch.log(probs + 1e-8)
|
|
168
|
+
log_probs_scaled = log_probs / temp # broadcast over channels
|
|
169
|
+
|
|
170
|
+
probs_adj = F.softmax(log_probs_scaled, dim=1)
|
|
171
|
+
return probs_adj
|
|
172
|
+
|
|
173
|
+
def get_back_to_size_torch(img: torch.Tensor, pad_width):
|
|
174
|
+
(pad_x, pad_y, pad_z) = pad_width
|
|
175
|
+
pad_x1, pad_x2 = pad_x
|
|
176
|
+
pad_y1, pad_y2 = pad_y
|
|
177
|
+
pad_z1, pad_z2 = pad_z
|
|
178
|
+
|
|
179
|
+
unpadded_img = img[
|
|
180
|
+
...,
|
|
181
|
+
pad_x1 : -pad_x2 if pad_x2 > 0 else None,
|
|
182
|
+
pad_y1 : -pad_y2 if pad_y2 > 0 else None,
|
|
183
|
+
pad_z1 : -pad_z2 if pad_z2 > 0 else None,
|
|
184
|
+
]
|
|
185
|
+
return unpadded_img
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def calculate_jacobian_determinant_3d(flow):
|
|
189
|
+
"""Calculates the Jacobian determinant of a 3D deformation field."""
|
|
190
|
+
B, _, D, H, W = flow.shape
|
|
191
|
+
device = flow.device
|
|
192
|
+
grid_z, grid_y, grid_x = torch.meshgrid(torch.arange(D, device=device), torch.arange(H, device=device),
|
|
193
|
+
torch.arange(W, device=device), indexing='ij')
|
|
194
|
+
grid = torch.stack((grid_x, grid_y, grid_z), dim=0).float()
|
|
195
|
+
grid = grid.unsqueeze(0).repeat(B, 1, 1, 1, 1)
|
|
196
|
+
transform_map = grid + flow
|
|
197
|
+
|
|
198
|
+
diff_x = transform_map[..., 1:] - transform_map[..., :-1]
|
|
199
|
+
grad_x = torch.cat([diff_x, diff_x[..., -1:]], dim=-1)
|
|
200
|
+
diff_y = transform_map[..., 1:, :] - transform_map[..., :-1, :]
|
|
201
|
+
grad_y = torch.cat([diff_y, diff_y[..., -1:, :]], dim=-2)
|
|
202
|
+
diff_z = transform_map[:, :, 1:, :, :] - transform_map[:, :, :-1, :, :]
|
|
203
|
+
grad_z = torch.cat([diff_z, diff_z[:, :, -1:, :, :]], dim=-3)
|
|
204
|
+
|
|
205
|
+
J_xx, J_yx, J_zx = grad_x[:, 0, ...], grad_x[:, 1, ...], grad_x[:, 2, ...]
|
|
206
|
+
J_xy, J_yy, J_zy = grad_y[:, 0, ...], grad_y[:, 1, ...], grad_y[:, 2, ...]
|
|
207
|
+
J_xz, J_yz, J_zz = grad_z[:, 0, ...], grad_z[:, 1, ...], grad_z[:, 2, ...]
|
|
208
|
+
|
|
209
|
+
determinant = (J_xx * (J_yy * J_zz - J_zy * J_yz) - J_xy * (J_yx * J_zz - J_zx * J_yz) + J_xz * (
|
|
210
|
+
J_yx * J_zy - J_zx * J_yy))
|
|
211
|
+
return determinant.unsqueeze(1)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def spatial_transformer_field(image, deformation_field, mode='bilinear'):
|
|
215
|
+
device = image.device
|
|
216
|
+
D, H, W = image.shape[2:]
|
|
217
|
+
d_coords, h_coords, w_coords = torch.meshgrid(torch.linspace(-1, 1, D), torch.linspace(-1, 1, H), torch.linspace(-1, 1, W), indexing='ij')
|
|
218
|
+
identity_grid = torch.stack([w_coords, h_coords, d_coords], dim=-1).unsqueeze(0).to(device)
|
|
219
|
+
scaling = torch.tensor([2 / (W - 1), 2 / (H - 1), 2 / (D - 1)], device=device)
|
|
220
|
+
deformation_field_normalized = deformation_field.permute(0, 2, 3, 4, 1) * scaling
|
|
221
|
+
sampling_grid = identity_grid + deformation_field_normalized
|
|
222
|
+
if mode=='bilinear':
|
|
223
|
+
warped_image = F.grid_sample(image, sampling_grid, mode='bilinear', padding_mode='border', align_corners=True)
|
|
224
|
+
elif mode=='nearest':
|
|
225
|
+
warped_image = warped_image = F.grid_sample(image, sampling_grid, mode='nearest', padding_mode='border', align_corners=True)
|
|
226
|
+
else:
|
|
227
|
+
return None
|
|
228
|
+
return warped_image
|
|
229
|
+
|
|
230
|
+
def augment_based_on_deform_field(source, atlas_probs):
|
|
231
|
+
# Define which ROIs you want to smooth
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
IMAGE_SHAPE = source.shape[2:]
|
|
236
|
+
DEFORMATION_COARSE_GRID = (4, 2, 4)
|
|
237
|
+
DEFORMATION_MAGNITUDE = 8.0 # Max displacement in pixels
|
|
238
|
+
deformation_field = generate_smooth_deformation_field(
|
|
239
|
+
shape=IMAGE_SHAPE,
|
|
240
|
+
coarse_grid_shape=DEFORMATION_COARSE_GRID,
|
|
241
|
+
magnitude=DEFORMATION_MAGNITUDE
|
|
242
|
+
)
|
|
243
|
+
print("Calculating Jacobian determinant...")
|
|
244
|
+
jacobian_map = calculate_jacobian_determinant_3d(deformation_field)
|
|
245
|
+
y_source = spatial_transformer_field(source, deformation_field)
|
|
246
|
+
prob_atlas = spatial_transformer_field(atlas_probs, deformation_field, mode='nearest') # *mask
|
|
247
|
+
# c. Modulate the intensity of the warped image using the Jacobian
|
|
248
|
+
print("Modulating intensity based on deformation...")
|
|
249
|
+
INTENSITY_EFFECT_STRENGTH = 0.8 # How much compression/expansion changes brightness
|
|
250
|
+
INTENSITY_NOISE_LEVEL = 0.01 # How much random noise to add
|
|
251
|
+
modulated_image = modulate_intensity_with_jacobian(
|
|
252
|
+
y_source, prob_atlas, jacobian_map,
|
|
253
|
+
effect_strength=INTENSITY_EFFECT_STRENGTH,
|
|
254
|
+
noise_level=INTENSITY_NOISE_LEVEL
|
|
255
|
+
)
|
|
256
|
+
return modulated_image, prob_atlas
|
|
257
|
+
|
|
258
|
+
# --- NEW FUNCTION ---
|
|
259
|
+
def modulate_intensity_with_jacobian(base_image, atlas, jacobian_map, effect_strength=0.5, noise_level=0.1):
|
|
260
|
+
"""
|
|
261
|
+
Modulates image intensity within ROIs based on local Jacobian values.
|
|
262
|
+
|
|
263
|
+
Args:
|
|
264
|
+
base_image (torch.Tensor): The image to modify (1, 1, D, H, W).
|
|
265
|
+
atlas (torch.Tensor): Atlas with integer labels for ROIs (1, 1, D, H, W).
|
|
266
|
+
jacobian_map (torch.Tensor): The Jacobian determinant map (1, 1, D, H, W).
|
|
267
|
+
effect_strength (float): How strongly the Jacobian affects intensity.
|
|
268
|
+
Positive: compression -> brighter.
|
|
269
|
+
Negative: compression -> darker.
|
|
270
|
+
noise_level (float): The standard deviation of Gaussian noise to add.
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
torch.Tensor: The image with modulated intensities.
|
|
274
|
+
"""
|
|
275
|
+
#modulated_image = base_image.clone()
|
|
276
|
+
|
|
277
|
+
pixels_in_roi = base_image
|
|
278
|
+
jacobian_in_roi = jacobian_map
|
|
279
|
+
|
|
280
|
+
# 1. Calculate the deterministic intensity modulation factor
|
|
281
|
+
# (J-1) centers the effect: J=1 -> no change. J<1 (compression) -> negative.
|
|
282
|
+
|
|
283
|
+
modulation_factor = 1.0 - (jacobian_in_roi - (jacobian_in_roi.mean()+2*jacobian_in_roi.std())) * effect_strength
|
|
284
|
+
|
|
285
|
+
# 2. Create a random noise component
|
|
286
|
+
random_noise = torch.randn_like(pixels_in_roi) * noise_level
|
|
287
|
+
|
|
288
|
+
# 3. Apply the changes
|
|
289
|
+
modified_pixels = pixels_in_roi * modulation_factor + random_noise
|
|
290
|
+
|
|
291
|
+
# Place the modified pixels back into the image
|
|
292
|
+
modulated_image = modified_pixels
|
|
293
|
+
|
|
294
|
+
"""
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
# Process each ROI label found in the atlas
|
|
298
|
+
for label in torch.unique(atlas)[1:]: # Skip background (label 0)
|
|
299
|
+
mask = (atlas == label)
|
|
300
|
+
|
|
301
|
+
# Get the pixels and corresponding Jacobian values for this ROI
|
|
302
|
+
pixels_in_roi = base_image[mask]
|
|
303
|
+
jacobian_in_roi = jacobian_map[mask]
|
|
304
|
+
|
|
305
|
+
# 1. Calculate the deterministic intensity modulation factor
|
|
306
|
+
# (J-1) centers the effect: J=1 -> no change. J<1 (compression) -> negative.
|
|
307
|
+
modulation_factor = 1.0 - (jacobian_in_roi - 1.0) * effect_strength
|
|
308
|
+
|
|
309
|
+
# 2. Create a random noise component
|
|
310
|
+
random_noise = torch.randn_like(pixels_in_roi) * noise_level
|
|
311
|
+
|
|
312
|
+
# 3. Apply the changes
|
|
313
|
+
modified_pixels = pixels_in_roi * modulation_factor + random_noise
|
|
314
|
+
|
|
315
|
+
# Place the modified pixels back into the image
|
|
316
|
+
modulated_image[mask] = modified_pixels
|
|
317
|
+
"""
|
|
318
|
+
return modulated_image
|
|
319
|
+
def generate_smooth_deformation_field(shape, coarse_grid_shape, magnitude):
|
|
320
|
+
|
|
321
|
+
"""
|
|
322
|
+
Generates a smooth, random 3D deformation field.
|
|
323
|
+
|
|
324
|
+
This works by creating a very low-resolution random vector field and then
|
|
325
|
+
upsampling and smoothing it into a high-resolution, plausible deformation.
|
|
326
|
+
|
|
327
|
+
Args:
|
|
328
|
+
shape (tuple): The final shape of the field (D, H, W).
|
|
329
|
+
coarse_grid_shape (tuple): The low-resolution grid size (e.g., (4, 4, 4)).
|
|
330
|
+
magnitude (float): A scaling factor for the displacement strength.
|
|
331
|
+
|
|
332
|
+
Returns:
|
|
333
|
+
torch.Tensor: The smooth deformation field of shape (1, 3, D, H, W).
|
|
334
|
+
"""
|
|
335
|
+
# 1. Create the coarse, random vector field
|
|
336
|
+
coarse_field = np.random.randn(*coarse_grid_shape, 3) * magnitude
|
|
337
|
+
|
|
338
|
+
# 2. Upsample the coarse field to the final shape
|
|
339
|
+
zoom_factors = [s / cs for s, cs in zip(shape, coarse_grid_shape)]
|
|
340
|
+
|
|
341
|
+
# Upsample each displacement channel (x, y, z)
|
|
342
|
+
upsampled_field = np.zeros((*shape, 3))
|
|
343
|
+
for i in range(3):
|
|
344
|
+
upsampled_field[..., i] = zoom(coarse_field[..., i], zoom=zoom_factors, order=3) # Cubic spline interpolation
|
|
345
|
+
|
|
346
|
+
# 3. Smooth the upsampled field to make it physically plausible
|
|
347
|
+
# A large sigma creates very smooth, large-scale deformations.
|
|
348
|
+
smoothed_field = np.zeros_like(upsampled_field)
|
|
349
|
+
for i in range(3):
|
|
350
|
+
smoothed_field[..., i] = gaussian_filter(upsampled_field[..., i], sigma=10)
|
|
351
|
+
|
|
352
|
+
# 4. Convert to a PyTorch tensor and format for the spatial transformer
|
|
353
|
+
# The channels need to be in the second dimension (B, C, D, H, W)
|
|
354
|
+
# The standard for grid_sample is (x, y, z), which corresponds to (W, H, D)
|
|
355
|
+
#flow_tensor = torch.from_numpy(smoothed_field).permute(3, 0, 1, 2).unsqueeze(0).float()
|
|
356
|
+
|
|
357
|
+
# PyTorch flow fields are ordered (x,y,z), corresponding to W,H,D dimensions
|
|
358
|
+
# Our numpy array was D,H,W,C so we permute C,D,H,W
|
|
359
|
+
# Let's re-order the numpy array for clarity before converting to tensor
|
|
360
|
+
smoothed_field_xyz = smoothed_field[..., [2, 1, 0]] # Reorder to x,y,z
|
|
361
|
+
flow_tensor = torch.from_numpy(smoothed_field_xyz).permute(3, 0, 1, 2).unsqueeze(0).float()
|
|
362
|
+
|
|
363
|
+
return flow_tensor
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def restore_zero_torch(cropped_data: torch.Tensor, original_shape, min_max, value=0):
|
|
367
|
+
"""
|
|
368
|
+
Restore the cropped data back to the original shape with padding (default = 0).
|
|
369
|
+
|
|
370
|
+
:param cropped_data: The cropped tensor from remove_zero
|
|
371
|
+
:param original_shape: The shape of the original full image
|
|
372
|
+
:param min_max: The min/max indices used for cropping
|
|
373
|
+
:param value: The padding value to fill
|
|
374
|
+
:return: Restored full-size tensor
|
|
375
|
+
"""
|
|
376
|
+
if min_max.abs().sum()==0:
|
|
377
|
+
return cropped_data
|
|
378
|
+
B, C, _, _, _ = cropped_data.shape
|
|
379
|
+
W,H, D = original_shape
|
|
380
|
+
restored = torch.full((B,C,W,H,D), value, dtype=cropped_data.dtype, device=cropped_data.device)
|
|
381
|
+
|
|
382
|
+
restored[:,:,
|
|
383
|
+
min_max[0][0]:min_max[0][1] + 1,
|
|
384
|
+
min_max[1][0]:min_max[1][1] + 1,
|
|
385
|
+
min_max[2][0]:min_max[2][1] + 1
|
|
386
|
+
] = cropped_data
|
|
387
|
+
|
|
388
|
+
return restored
|
|
389
|
+
|
|
390
|
+
def change_to_original(im_changed, data, batch_num=0):
|
|
391
|
+
im1 = get_back_to_size_torch(im_changed, data['pad_width'][batch_num])
|
|
392
|
+
im1 = restore_zero_torch(im1, data['shape_original'][batch_num], data['min_max'][batch_num])
|
|
393
|
+
return im1
|
|
394
|
+
|
|
395
|
+
def differentiable_boundary(mask, kernel_size=3):
|
|
396
|
+
"""Returns soft boundary: high when neighbor differs from center."""
|
|
397
|
+
# Laplacian-like filter via average pooling
|
|
398
|
+
pad = kernel_size // 2
|
|
399
|
+
avg_mask = F.avg_pool3d(mask, kernel_size=kernel_size, stride=1, padding=pad)
|
|
400
|
+
return torch.abs(avg_mask - mask)
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
def laplacian_3d(image):
|
|
404
|
+
# 3D Laplacian kernel (center - 6 neighbors)
|
|
405
|
+
kernel = torch.tensor([[[[0, 0, 0],
|
|
406
|
+
[0, -1, 0],
|
|
407
|
+
[0, 0, 0]],
|
|
408
|
+
|
|
409
|
+
[[0, -1, 0],
|
|
410
|
+
[-1, 6, -1],
|
|
411
|
+
[0, -1, 0]],
|
|
412
|
+
|
|
413
|
+
[[0, 0, 0],
|
|
414
|
+
[0, -1, 0],
|
|
415
|
+
[0, 0, 0]]]], dtype=image.dtype, device=image.device)
|
|
416
|
+
|
|
417
|
+
kernel = kernel.unsqueeze(0) # shape: [1, 1, 3, 3, 3]
|
|
418
|
+
|
|
419
|
+
# Apply convolution
|
|
420
|
+
lap = F.conv3d(image, kernel, padding=1)
|
|
421
|
+
return lap
|
|
422
|
+
def soft_erode(img, iterations=3):
|
|
423
|
+
for _ in range(iterations):
|
|
424
|
+
img = -F.max_pool3d(-img, kernel_size=3, stride=1, padding=1)
|
|
425
|
+
return img
|
|
426
|
+
|
|
427
|
+
def soft_skeletonize(img, iterations=3):
|
|
428
|
+
skel = F.relu(img - soft_erode(img, iterations))
|
|
429
|
+
return skel
|
|
430
|
+
def gradient_3d(img):
|
|
431
|
+
dz = img[:, :, 1:, :, :] - img[:, :, :-1, :, :]
|
|
432
|
+
dy = img[:, :, :, 1:, :] - img[:, :, :, :-1, :]
|
|
433
|
+
dx = img[:, :, :, :, 1:] - img[:, :, :, :, :-1]
|
|
434
|
+
return dx, dy, dz
|
|
435
|
+
|
|
436
|
+
def bending_energy_loss(disp):
|
|
437
|
+
"""
|
|
438
|
+
disp: tensor of shape (B, 3, D, H, W), displacement field
|
|
439
|
+
"""
|
|
440
|
+
dx = disp[:, :, 2:, 1:-1, 1:-1] - 2 * disp[:, :, 1:-1, 1:-1, 1:-1] + disp[:, :, :-2, 1:-1, 1:-1]
|
|
441
|
+
dy = disp[:, :, 1:-1, 2:, 1:-1] - 2 * disp[:, :, 1:-1, 1:-1, 1:-1] + disp[:, :, 1:-1, :-2, 1:-1]
|
|
442
|
+
dz = disp[:, :, 1:-1, 1:-1, 2:] - 2 * disp[:, :, 1:-1, 1:-1, 1:-1] + disp[:, :, 1:-1, 1:-1, :-2]
|
|
443
|
+
return (dx.pow(2) + dy.pow(2) + dz.pow(2)).mean()
|
|
444
|
+
|
|
445
|
+
def gm_highest_at_wm_border(P_WM, P_GM, P_BG, P_GM_previous, eps=1e-6):
|
|
446
|
+
"""
|
|
447
|
+
Computes a soft, differentiable metric for:
|
|
448
|
+
where WM touches CSF or BG, is GM the highest?
|
|
449
|
+
"""
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
# Extract individual tissue probs
|
|
453
|
+
wm = P_WM
|
|
454
|
+
gm = P_GM
|
|
455
|
+
bg = P_BG
|
|
456
|
+
|
|
457
|
+
# Define WM border using soft boundary detection
|
|
458
|
+
kernel = torch.zeros((1, 1, 3, 3, 3), device=P_BG.device)
|
|
459
|
+
offsets = [(0, 1, 1), (1, 0, 1), (1, 1, 0),
|
|
460
|
+
(1, 1, 2), (1, 2, 1), (2, 1, 1)]
|
|
461
|
+
for i, j, k in offsets:
|
|
462
|
+
kernel[0, 0, i, j, k] = 1.0
|
|
463
|
+
neighbour_wm = F.conv3d((wm > 0.5).float(), kernel, padding=1)/6. # (B, 1, H, W, D)
|
|
464
|
+
wm_boundary = (neighbour_wm-wm).abs()
|
|
465
|
+
# Compute contact with CSF or BG: high where neighboring probs are nonzero
|
|
466
|
+
csf_or_bg = ( (bg[0]==0)).float()
|
|
467
|
+
touching = (wm_boundary * csf_or_bg)>0 # soft mask for "touching" regions
|
|
468
|
+
gm[touching] = P_GM_previous[touching]
|
|
469
|
+
|
|
470
|
+
return gm # in [0, 1], higher = more GM dominance at WM borders
|
|
@@ -22,10 +22,10 @@ import math
|
|
|
22
22
|
from collections import defaultdict
|
|
23
23
|
from sys import platform
|
|
24
24
|
if platform=='darwin':
|
|
25
|
-
from melage.
|
|
25
|
+
from melage.rendering.helpers.Shaders_120 import vsrc, fsrc, fsrcPaint, vsrcPaint
|
|
26
26
|
else:
|
|
27
|
-
from melage.
|
|
28
|
-
|
|
27
|
+
from melage.rendering.helpers.Shaders_330 import vsrc, fsrc, fsrcPaint, vsrcPaint
|
|
28
|
+
|
|
29
29
|
from melage.utils.utils import LargestCC
|
|
30
30
|
from sklearn.mixture import GaussianMixture
|
|
31
31
|
|
|
@@ -970,97 +970,84 @@ class GLWidget(QOpenGLWidget):
|
|
|
970
970
|
if self.imSlice is None:
|
|
971
971
|
return
|
|
972
972
|
|
|
973
|
-
self.UpdatePaintInfo()
|
|
974
973
|
self.makeObject()
|
|
975
974
|
|
|
976
|
-
|
|
977
975
|
def UpdatePaintInfo(self):
|
|
978
976
|
"""
|
|
979
|
-
Update
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
self.left = imWidth / 2 - (self.zoomed_height * self.windowAR - self.zoomed_width / 2)
|
|
1001
|
-
|
|
1002
|
-
# image right position
|
|
1003
|
-
self.right = self.left + self.zoomed_width
|
|
1004
|
-
else:
|
|
1005
|
-
if ratioX < 1 and ratioY > 1:
|
|
1006
|
-
self.zoomed_height = imHeight
|
|
1007
|
-
self.bottom = 0 #
|
|
1008
|
-
self.top = self.bottom + self.zoomed_height
|
|
1009
|
-
|
|
1010
|
-
self.zoomed_width = ratioY * self.width()
|
|
1011
|
-
self.left = imWidth / 2 - (self.zoomed_height * self.windowAR - self.zoomed_width / 2)
|
|
1012
|
-
self.right = self.left + self.zoomed_width
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
else:
|
|
1016
|
-
self.zoomed_width = imWidth
|
|
1017
|
-
self.left = 0 # -imWidth * (self.windowAR - 1) / 2
|
|
1018
|
-
self.right = self.left + self.zoomed_width
|
|
1019
|
-
|
|
1020
|
-
self.zoomed_height = ratioX * self.height()
|
|
1021
|
-
self.bottom = imHeight / 2 - (self.zoomed_width / self.windowAR - self.zoomed_height / 2)
|
|
1022
|
-
self.top = self.bottom + self.zoomed_height
|
|
977
|
+
Update information of the image with a simplified "fit" scaling.
|
|
978
|
+
|
|
979
|
+
This centers the image and scales it to fit within the window
|
|
980
|
+
while preserving its aspect ratio, creating "letterboxing" or
|
|
981
|
+
"pillarboxing" as needed.
|
|
982
|
+
"""
|
|
983
|
+
# Add a small epsilon to prevent division by zero
|
|
984
|
+
epsilon = 0.000001
|
|
985
|
+
|
|
986
|
+
window_w = self.width()
|
|
987
|
+
window_h = self.height() + epsilon
|
|
988
|
+
img_w = self.imWidth
|
|
989
|
+
img_h = self.imHeight
|
|
990
|
+
#print(f"windw w {window_w} and {window_h}")
|
|
991
|
+
# Handle case where image might not be loaded yet
|
|
992
|
+
if img_w == 0 or img_h == 0:
|
|
993
|
+
self.left = 0
|
|
994
|
+
self.right = window_w
|
|
995
|
+
self.bottom = 0
|
|
996
|
+
self.top = window_h
|
|
997
|
+
return
|
|
1023
998
|
|
|
999
|
+
img_h += epsilon # Add epsilon to image height as well
|
|
1024
1000
|
|
|
1025
|
-
|
|
1001
|
+
# 1. Calculate Aspect Ratios
|
|
1002
|
+
window_ar = window_w / window_h
|
|
1003
|
+
image_ar = img_w / img_h
|
|
1026
1004
|
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1005
|
+
# 2. Compare aspect ratios to determine the limiting dimension
|
|
1006
|
+
if window_ar > image_ar:
|
|
1007
|
+
# --- CASE 1: Window is "wider" than the image ---
|
|
1008
|
+
# The image is "taller" relative to the window.
|
|
1009
|
+
# We are limited by the image's HEIGHT.
|
|
1010
|
+
# This will create "pillarboxing" (black bars on left/right).
|
|
1032
1011
|
|
|
1033
|
-
|
|
1012
|
+
# The view's height will be the image's height
|
|
1013
|
+
view_height = img_h
|
|
1014
|
+
# The view's width must be calculated from the view's height
|
|
1015
|
+
# to match the window's aspect ratio.
|
|
1016
|
+
view_width = view_height * window_ar
|
|
1034
1017
|
|
|
1035
|
-
|
|
1036
|
-
|
|
1018
|
+
# Center the view horizontally around the image's center
|
|
1019
|
+
self.bottom = 0
|
|
1020
|
+
self.top = img_h
|
|
1021
|
+
self.left = (img_w / 2.0) - (view_width / 2.0)
|
|
1022
|
+
self.right = (img_w / 2.0) + (view_width / 2.0)
|
|
1037
1023
|
|
|
1038
1024
|
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1025
|
+
else:
|
|
1026
|
+
# --- CASE 2: Image is "wider" than the window ---
|
|
1027
|
+
# The image is "wider" relative to the window.
|
|
1028
|
+
# We are limited by the image's WIDTH.
|
|
1029
|
+
# This will create "letterboxing" (black bars on top/bottom).
|
|
1043
1030
|
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1031
|
+
# The view's width will be the image's width
|
|
1032
|
+
view_width = img_w
|
|
1033
|
+
# The view's height must be calculated from the view's width
|
|
1034
|
+
# to match the window's aspect ratio.
|
|
1035
|
+
view_height = view_width / window_ar
|
|
1047
1036
|
|
|
1037
|
+
# Center the view vertically around the image's center
|
|
1038
|
+
self.left = 0
|
|
1039
|
+
self.right = img_w
|
|
1040
|
+
self.bottom = (img_h / 2.0) - (view_height / 2.0)
|
|
1041
|
+
self.top = (img_h / 2.0) + (view_height / 2.0)
|
|
1048
1042
|
|
|
1049
|
-
else:
|
|
1050
1043
|
|
|
1051
|
-
self.zoomed_width = imWidth
|
|
1052
|
-
self.left = 0
|
|
1053
|
-
self.right = self.left + self.zoomed_width
|
|
1054
1044
|
|
|
1055
|
-
|
|
1056
|
-
|
|
1045
|
+
# These are just for information, not used by glOrtho
|
|
1046
|
+
self.zoomed_width = view_width
|
|
1047
|
+
self.zoomed_height = view_height
|
|
1057
1048
|
|
|
1058
|
-
self.bottom = imHeight / 2 - (self.zoomed_width / self.windowAR - self.zoomed_height / 2)
|
|
1059
|
-
self.top = self.bottom + self.zoomed_height
|
|
1060
|
-
#if self.currentWidnowName != 'axial' and self.imType == 't1':
|
|
1061
|
-
# self.updateScale( self.width()//2, self.height()//2, 1, 0.5)
|
|
1062
1049
|
self.halfH = self.height() // 2
|
|
1063
|
-
glEnable(GL_NORMALIZE)
|
|
1050
|
+
glEnable(GL_NORMALIZE)
|
|
1064
1051
|
|
|
1065
1052
|
def drawImage(self):
|
|
1066
1053
|
|
|
@@ -1394,6 +1381,7 @@ class GLWidget(QOpenGLWidget):
|
|
|
1394
1381
|
def resizeGL(self, width, height):
|
|
1395
1382
|
if self.imSlice is None:
|
|
1396
1383
|
return
|
|
1384
|
+
self.UpdatePaintInfo()
|
|
1397
1385
|
side = min(width, height)
|
|
1398
1386
|
#Set viewport
|
|
1399
1387
|
glViewport((width- side) // 2, (height-side) // 2, self.imWidth,
|
|
@@ -1613,7 +1601,7 @@ class GLWidget(QOpenGLWidget):
|
|
|
1613
1601
|
else:
|
|
1614
1602
|
self._magic_slice = None
|
|
1615
1603
|
elif self.enabledCircle:
|
|
1616
|
-
# from
|
|
1604
|
+
# from MELAGE.utils.utils import
|
|
1617
1605
|
if self._NenabledCircle > 0 and self.colorInd != 9876:
|
|
1618
1606
|
|
|
1619
1607
|
self._center_circle = []
|
|
@@ -1950,7 +1938,7 @@ class GLWidget(QOpenGLWidget):
|
|
|
1950
1938
|
polErase = ConvertPToPolygons(self.erasePoints) # convert to polygons
|
|
1951
1939
|
self.erasePolygon(polErase)
|
|
1952
1940
|
elif self.enabledCircle:
|
|
1953
|
-
#from
|
|
1941
|
+
#from MELAGE.utils.utils import
|
|
1954
1942
|
if self._NenabledCircle>0:
|
|
1955
1943
|
|
|
1956
1944
|
self._center_circle=[]
|
|
@@ -2077,7 +2065,7 @@ class GLWidget(QOpenGLWidget):
|
|
|
2077
2065
|
seg_c = segmented_image[int(yc_mp)-min_whit[0], int(xc_mp)-min_whit[1]]
|
|
2078
2066
|
(segmented_image-seg_c)
|
|
2079
2067
|
|
|
2080
|
-
from
|
|
2068
|
+
from MELAGE.utils.utils import Threshold_MultiOtsu
|
|
2081
2069
|
num_class = 3
|
|
2082
2070
|
|
|
2083
2071
|
ths = Threshold_MultiOtsu(im1, num_class)
|
|
@@ -3,7 +3,7 @@ __author__= 'Bahram Jafrasteh'
|
|
|
3
3
|
import numpy as np
|
|
4
4
|
import sys
|
|
5
5
|
sys.path.append('../')
|
|
6
|
-
from melage.
|
|
6
|
+
from melage.rendering import GLViewWidget, GLAxisItem, GLScatterPlotItem, GLGridItem, GLVolumeItem, GLPolygonItem
|
|
7
7
|
from OpenGL.GL import *
|
|
8
8
|
from collections import defaultdict
|
|
9
9
|
from PyQt5.QtWidgets import QApplication, QWidget, QMenu, QAction, QSlider, QFileDialog
|