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,197 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from PyQt5.QtWidgets import QMessageBox
|
|
3
|
+
from melage.widgets import MelagePlugin
|
|
4
|
+
from melage.dialogs.dynamic_gui import DynamicDialog
|
|
5
|
+
from .change_coord_schema import get_schema
|
|
6
|
+
from PyQt5.QtCore import Qt
|
|
7
|
+
from PyQt5.QtCore import pyqtSignal
|
|
8
|
+
from .main.utils import changeCoordSystem
|
|
9
|
+
# --- THE LOGIC CLASS ---
|
|
10
|
+
class ChangeCoordLogic(DynamicDialog):
|
|
11
|
+
"""
|
|
12
|
+
This class handles the BRAIN of the WarpSeg tool.
|
|
13
|
+
The LOOKS are handled automatically by DynamicDialog + Schema.
|
|
14
|
+
"""
|
|
15
|
+
completed = pyqtSignal(object)
|
|
16
|
+
AXIS_GROUPS = [
|
|
17
|
+
{'R', 'L'},
|
|
18
|
+
{'A', 'P'},
|
|
19
|
+
{'S', 'I'}
|
|
20
|
+
]
|
|
21
|
+
ALL_OPTIONS = ['R', 'L', 'A', 'P', 'S', 'I']
|
|
22
|
+
|
|
23
|
+
def __init__(self, data_context,parent=None):
|
|
24
|
+
# 1. Initialize DynamicDialog with the Schema
|
|
25
|
+
# This single line builds the entire window!
|
|
26
|
+
|
|
27
|
+
super().__init__(parent)
|
|
28
|
+
self.create_main_ui(schema=get_schema(), default_items=False)
|
|
29
|
+
self.setAttribute(Qt.WA_DeleteOnClose)
|
|
30
|
+
self.data_context = data_context
|
|
31
|
+
|
|
32
|
+
# 2. AUTOMATICALLY WIDGET BINDING
|
|
33
|
+
# Iterate over all widgets created by the schema and bind them to 'self'.
|
|
34
|
+
for widget_id, widget_obj in self.widgets.items():
|
|
35
|
+
setattr(self, widget_id, widget_obj)
|
|
36
|
+
|
|
37
|
+
# 3. GENERAL PURPOSE SIGNAL CONNECTION (Auto-Connect)
|
|
38
|
+
# Instead of a hardcoded dictionary, we iterate through every widget from the schema
|
|
39
|
+
# and look for a matching method in this class named: on_<ID>_<Signal>
|
|
40
|
+
# This works for ANY schema changes automatically.
|
|
41
|
+
supported_signals = [
|
|
42
|
+
"clicked", "toggled", "currentIndexChanged",
|
|
43
|
+
"textChanged", "valueChanged"
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
for widget_id, widget_obj in self.widgets.items():
|
|
47
|
+
for signal_name in supported_signals:
|
|
48
|
+
# 1. Check if the widget has this signal (e.g., Button has 'clicked')
|
|
49
|
+
if hasattr(widget_obj, signal_name):
|
|
50
|
+
# 2. Check if WE have a handler method (e.g., 'on_btn_apply_clicked')
|
|
51
|
+
handler_name = f"on_{widget_id}_{signal_name}"
|
|
52
|
+
if hasattr(self, handler_name):
|
|
53
|
+
# 3. Connect them!
|
|
54
|
+
signal = getattr(widget_obj, signal_name)
|
|
55
|
+
handler = getattr(self, handler_name)
|
|
56
|
+
# Disconnect first to be safe (idempotent), then connect
|
|
57
|
+
try:
|
|
58
|
+
signal.disconnect(handler)
|
|
59
|
+
except TypeError:
|
|
60
|
+
pass
|
|
61
|
+
signal.connect(handler)
|
|
62
|
+
# print(f"Auto-connected: {widget_id}.{signal_name} -> {handler_name}")
|
|
63
|
+
self.update_2nd_combo()
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def ui_schema(self):
|
|
67
|
+
# We call the function to get the dictionary
|
|
68
|
+
return get_schema()
|
|
69
|
+
|
|
70
|
+
def get_axis_group(self, letter):
|
|
71
|
+
"""Helper: Returns the set containing the letter (e.g., 'R' -> {'R', 'L'})"""
|
|
72
|
+
for group in self.AXIS_GROUPS:
|
|
73
|
+
if letter in group:
|
|
74
|
+
return group
|
|
75
|
+
return set()
|
|
76
|
+
|
|
77
|
+
def update_2nd_combo(self):
|
|
78
|
+
"""
|
|
79
|
+
Filters Combo 2 based on Combo 1 selection.
|
|
80
|
+
"""
|
|
81
|
+
selection_1 = self.combo_1st.currentText()
|
|
82
|
+
forbidden_group = self.get_axis_group(selection_1)
|
|
83
|
+
|
|
84
|
+
# Calculate allowed options for 2nd box
|
|
85
|
+
# Logic: All Options MINUS the axis used in box 1
|
|
86
|
+
allowed = [opt for opt in self.ALL_OPTIONS if opt not in forbidden_group]
|
|
87
|
+
|
|
88
|
+
# Repopulate 2nd Combo
|
|
89
|
+
self._repopulate_combo(self.combo_2nd, allowed)
|
|
90
|
+
|
|
91
|
+
# Force update of 3rd combo because 2nd changed
|
|
92
|
+
self.update_3rd_combo()
|
|
93
|
+
|
|
94
|
+
def update_3rd_combo(self):
|
|
95
|
+
"""
|
|
96
|
+
Filters Combo 3 based on Combo 1 AND Combo 2 selection.
|
|
97
|
+
"""
|
|
98
|
+
selection_1 = self.combo_1st.currentText()
|
|
99
|
+
selection_2 = self.combo_2nd.currentText()
|
|
100
|
+
|
|
101
|
+
group_1 = self.get_axis_group(selection_1)
|
|
102
|
+
group_2 = self.get_axis_group(selection_2)
|
|
103
|
+
|
|
104
|
+
# Calculate allowed options for 3rd box
|
|
105
|
+
# Logic: All Options MINUS axis 1 MINUS axis 2
|
|
106
|
+
allowed = [
|
|
107
|
+
opt for opt in self.ALL_OPTIONS
|
|
108
|
+
if opt not in group_1 and opt not in group_2
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
# Repopulate 3rd Combo
|
|
112
|
+
self._repopulate_combo(self.combo_3rd, allowed)
|
|
113
|
+
|
|
114
|
+
def _repopulate_combo(self, combo_widget, allowed_options):
|
|
115
|
+
"""
|
|
116
|
+
Safely updates items while trying to preserve the current selection.
|
|
117
|
+
"""
|
|
118
|
+
current_val = combo_widget.currentText()
|
|
119
|
+
|
|
120
|
+
# Block signals to prevent infinite recursion loops during update
|
|
121
|
+
combo_widget.blockSignals(True)
|
|
122
|
+
combo_widget.clear()
|
|
123
|
+
combo_widget.addItems(allowed_options)
|
|
124
|
+
|
|
125
|
+
# Try to restore previous selection, otherwise pick index 0
|
|
126
|
+
index = combo_widget.findText(current_val)
|
|
127
|
+
if index >= 0:
|
|
128
|
+
combo_widget.setCurrentIndex(index)
|
|
129
|
+
else:
|
|
130
|
+
combo_widget.setCurrentIndex(0)
|
|
131
|
+
|
|
132
|
+
combo_widget.blockSignals(False)
|
|
133
|
+
|
|
134
|
+
# Renamed from 'run_process' to match the schema ID 'btn_apply'
|
|
135
|
+
def on_btn_apply_clicked(self):
|
|
136
|
+
view = self.combo_view.currentText()
|
|
137
|
+
data_view = self.data_context[view]
|
|
138
|
+
if data_view is None:
|
|
139
|
+
QMessageBox.information(self, "Error", "No image data available for the selected view.")
|
|
140
|
+
return
|
|
141
|
+
|
|
142
|
+
try:
|
|
143
|
+
"""The main execution function."""
|
|
144
|
+
self.progress_bar.setValue(10)
|
|
145
|
+
|
|
146
|
+
data = data_view.get_fdata().copy()
|
|
147
|
+
if len(data.shape)<=1:
|
|
148
|
+
raise ValueError("Input image must be at least 2D NIfTI.")
|
|
149
|
+
|
|
150
|
+
el_1 = self.combo_1st.currentText()
|
|
151
|
+
el_2 = self.combo_2nd.currentText()
|
|
152
|
+
el_3 = self.combo_3rd.currentText()
|
|
153
|
+
target = f"{el_1}{el_2}{el_3}"
|
|
154
|
+
used_axes = [self.get_axis_group(x) for x in [el_1, el_2, el_3]]
|
|
155
|
+
unique_axes = set(tuple(s) for s in used_axes)
|
|
156
|
+
|
|
157
|
+
if len(unique_axes) != 3:
|
|
158
|
+
raise ValueError(f"Invalid orientation {target}. Axes must be orthogonal.")
|
|
159
|
+
if np.unique([el_1, el_2, el_3]).shape[0]!=3:
|
|
160
|
+
QMessageBox.information(self, "INVALID COORDINATION SYSTEM", f"{target} is not a valid coorrdiantion system")
|
|
161
|
+
self.progress_bar.setValue(0)
|
|
162
|
+
return
|
|
163
|
+
im = changeCoordSystem(im=data_view, target=target)
|
|
164
|
+
result_package = {
|
|
165
|
+
"image": im.get_fdata(),
|
|
166
|
+
"affine": im.affine,
|
|
167
|
+
"label": np.zeros_like(im.get_fdata()),
|
|
168
|
+
"view": view
|
|
169
|
+
}
|
|
170
|
+
self.completed.emit(result_package)
|
|
171
|
+
self.progress_bar.setValue(100)
|
|
172
|
+
#QMessageBox.information(self, "Done", "Segmentation Complete")
|
|
173
|
+
|
|
174
|
+
except Exception as e:
|
|
175
|
+
QMessageBox.information(self, "Error", f"{e}")
|
|
176
|
+
self.progress_bar.setValue(0)
|
|
177
|
+
|
|
178
|
+
def on_context_action(self, text, widget):
|
|
179
|
+
"""Handle the Right-Click Context Menu defined in schema"""
|
|
180
|
+
if text == "Reset Adult Options":
|
|
181
|
+
# Access radio button directly by ID
|
|
182
|
+
self.radio_adult_whole.setChecked(True)
|
|
183
|
+
print("Options reset.")
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
# --- THE PLUGIN WRAPPER ---
|
|
187
|
+
class ChangeCoordPlugin(MelagePlugin):
|
|
188
|
+
@property
|
|
189
|
+
def name(self) -> str: return "Change Coord Sys."
|
|
190
|
+
|
|
191
|
+
@property
|
|
192
|
+
def category(self) -> str: return "Basic"
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def get_widget(self, data_context =None,parent=None):
|
|
196
|
+
logic = ChangeCoordLogic(data_context, parent)
|
|
197
|
+
return logic
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
|
|
2
|
+
from ..ui_helpers import Label, Combo, Check, Radio, Group, Button, Progress, HBox, FilePicker, SpinBox, Reference
|
|
3
|
+
|
|
4
|
+
# The simplified schema using helper functions.
|
|
5
|
+
# The main layout defaults to 'vbox', so items stack automatically.
|
|
6
|
+
def get_schema():
|
|
7
|
+
UI_SCHEMA = {
|
|
8
|
+
"title": "Enhanced spatial Fuzzy C-Means algorithm ...",
|
|
9
|
+
"min_width": 500,
|
|
10
|
+
"layout": "vbox",
|
|
11
|
+
"items": [
|
|
12
|
+
#Label(id="lbl_model_info", text="Model Info: Ready for Ifant brain segmentation"),
|
|
13
|
+
Reference(
|
|
14
|
+
"<b>Jafrasteh et al. (2024)</b>. <i>'Enhanced Spatial Fuzzy C-Means...'</i>. "
|
|
15
|
+
'<a href="https://link.springer.com/article/10.1007/s12021-024-09661-x">(paper)</a>'
|
|
16
|
+
|
|
17
|
+
),
|
|
18
|
+
Group(id="group_mode", layout="hbox", title="Destination",children=[
|
|
19
|
+
Combo(id="combo_1st", label="", options=["R", "L", "P", "A", "I", "S"], default="R", function_name="update_2nd_combo"),
|
|
20
|
+
Combo(id="combo_2nd", label="", options=["R", "L", "P", "A", "I", "S"], default="A", function_name="update_3rd_combo"),
|
|
21
|
+
Combo(id="combo_3rd", label="", options=["R", "L", "P", "A", "I", "S"], default="S"),
|
|
22
|
+
]),
|
|
23
|
+
|
|
24
|
+
HBox([
|
|
25
|
+
Progress(id="progress_bar"),
|
|
26
|
+
Button(id="btn_apply", text="Apply", default=True)
|
|
27
|
+
])
|
|
28
|
+
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
return UI_SCHEMA
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from melage.utils.utils import convert_to_ras
|
|
2
|
+
import nibabel as nib
|
|
3
|
+
def changeCoordSystem(im, target):
|
|
4
|
+
"""
|
|
5
|
+
Changing coordinate system of image
|
|
6
|
+
:param target:
|
|
7
|
+
:return:
|
|
8
|
+
"""
|
|
9
|
+
previous_affine = im.affine
|
|
10
|
+
previous_header = im.header
|
|
11
|
+
transform, source_system = convert_to_ras(im.affine, target=target)
|
|
12
|
+
if source_system == target:
|
|
13
|
+
return im
|
|
14
|
+
im = im.as_reoriented(transform)
|
|
15
|
+
return nib.Nifti1Image(im.get_fdata(),affine=previous_affine, header=previous_header)
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import numpy as np
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
from melage.widgets.Segmentation.utils import create_window_3D, ssim3D
|
|
5
|
-
from melage.widgets.Segmentation.utils import LargestCC, \
|
|
3
|
+
from .utils import BiasCorrection, create_window_3D, ssim3D, LargestCC, \
|
|
6
4
|
update_according_to_neighbours_conv, neighborhood_conv, axis_based_convolution, adjust_common_structures, \
|
|
7
5
|
compute_sdf, rescale_between_a_b
|
|
8
6
|
from sklearn.preprocessing import PolynomialFeatures
|
|
@@ -311,11 +309,11 @@ class esFCM(FCM):
|
|
|
311
309
|
if fast_method:
|
|
312
310
|
if self._is2D:
|
|
313
311
|
cost_ssim, ssim_map = ssim(s1.squeeze() / s1.max(), s2.squeeze() / s2.max(), full=True,
|
|
314
|
-
win_size=11)
|
|
312
|
+
win_size=11, data_range=1)
|
|
315
313
|
ssim_map = np.expand_dims(ssim_map, np.where(self._imdim)[0][0])
|
|
316
314
|
else:
|
|
317
315
|
cost_ssim, ssim_map = ssim(s1 / s1.max(), s2 / s2.max(), full=True,
|
|
318
|
-
win_size=11)
|
|
316
|
+
win_size=11, data_range=1)
|
|
319
317
|
else: # faster
|
|
320
318
|
ssim_map = ssim3D(s1 / s1.max(), s2 / s2.max(), self.window,
|
|
321
319
|
self.window.shape[-1], 1, contrast=False)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from .FCM import esFCM, FCM, FCM_pure
|
|
2
|
+
from .utils import remove_zero
|
|
3
|
+
import numpy as np
|
|
4
|
+
def get_inference(model_name, progressBar, im, affine, num_tissues, post_correction, max_iter):
|
|
5
|
+
if affine is None:
|
|
6
|
+
affine = np.eye(4) # put identity if affine is None
|
|
7
|
+
use_ssim = True
|
|
8
|
+
padding = 0
|
|
9
|
+
image_range = 1000
|
|
10
|
+
tissue_labels = None
|
|
11
|
+
fuzziness = 3
|
|
12
|
+
constraint = False
|
|
13
|
+
InitMethod = 'otsu'
|
|
14
|
+
if num_tissues > 3 and not constraint:
|
|
15
|
+
post_correction = False
|
|
16
|
+
InitMethod = "kmeans"
|
|
17
|
+
|
|
18
|
+
epsilon = 5e-3
|
|
19
|
+
shape_init = im.shape
|
|
20
|
+
image_used, pad_zero = remove_zero(im, 0)
|
|
21
|
+
if model_name.lower() == 'esfcm':
|
|
22
|
+
|
|
23
|
+
model = esFCM(image_used, affine,
|
|
24
|
+
image_range, num_tissues, fuzziness,
|
|
25
|
+
epsilon=epsilon, max_iter=max_iter,
|
|
26
|
+
padding=padding,
|
|
27
|
+
tissuelabels=tissue_labels,
|
|
28
|
+
mask=image_used > 0, use_ssim=use_ssim)
|
|
29
|
+
try:
|
|
30
|
+
model.initialize_fcm(initialization_method=InitMethod)
|
|
31
|
+
except:
|
|
32
|
+
model.initialize_fcm(initialization_method='kmeans')
|
|
33
|
+
|
|
34
|
+
model.fit(progressBar)
|
|
35
|
+
seg1 = model.predict(use_softmax=True).astype('int')
|
|
36
|
+
seg_init2 = np.zeros(shape_init)
|
|
37
|
+
seg_init2[pad_zero[0][0]:pad_zero[0][1] + 1, pad_zero[1][0]:pad_zero[1][1] + 1,
|
|
38
|
+
pad_zero[2][0]:pad_zero[2][1] + 1] = seg1
|
|
39
|
+
return seg_init2
|
|
40
|
+
|
|
41
|
+
elif model_name.lower() == 'fcm':
|
|
42
|
+
from melage.core.Segmentation.FCM import FCM_pure as FCM
|
|
43
|
+
|
|
44
|
+
model = FCM(image_used, affine, None,
|
|
45
|
+
image_range, num_tissues, fuzziness,
|
|
46
|
+
epsilon=epsilon, max_iter=max_iter,
|
|
47
|
+
padding=padding, constraint=False, post_correction=post_correction, mask=image_used > 0)
|
|
48
|
+
try:
|
|
49
|
+
model.initialize_fcm(initialization_method=InitMethod)
|
|
50
|
+
except:
|
|
51
|
+
model.initialize_fcm(initialization_method='kmeans')
|
|
52
|
+
model.fit(progressBar)
|
|
53
|
+
seg1 = model.predict(use_softmax=True).astype('int')
|
|
54
|
+
seg_init2 = np.zeros(shape_init)
|
|
55
|
+
seg_init2[pad_zero[0][0]:pad_zero[0][1] + 1, pad_zero[1][0]:pad_zero[1][1] + 1,
|
|
56
|
+
pad_zero[2][0]:pad_zero[2][1] + 1] = seg1
|
|
57
|
+
return seg_init2
|
|
@@ -12,6 +12,26 @@ from scipy.ndimage import binary_fill_holes
|
|
|
12
12
|
from scipy.ndimage import distance_transform_edt as edistance
|
|
13
13
|
from scipy.ndimage import distance_transform_cdt as chdistance
|
|
14
14
|
|
|
15
|
+
def remove_zero(f_data, value=0):
|
|
16
|
+
"""
|
|
17
|
+
Remove non segmented areas from image
|
|
18
|
+
:param f_data:
|
|
19
|
+
:param value:
|
|
20
|
+
:return:
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
xs, ys, zs = np.where(f_data > value) # find zero values
|
|
24
|
+
tol = 4
|
|
25
|
+
|
|
26
|
+
min_max = []
|
|
27
|
+
for x in [xs, ys, zs]:
|
|
28
|
+
minx = min(x) - tol if min(x) - tol > 1 else min(x)
|
|
29
|
+
maxx = max(x) + tol if max(x) + tol < f_data.shape[0] - 1 else max(x)
|
|
30
|
+
min_max.append([minx, maxx])
|
|
31
|
+
f_data = f_data[min_max[0][0]:min_max[0][1] + 1, min_max[1][0]:min_max[1][1] + 1, min_max[2][0]:min_max[2][1] + 1]
|
|
32
|
+
|
|
33
|
+
return f_data, min_max
|
|
34
|
+
|
|
15
35
|
def compute_sdf(segmentation, distance_use='edt', bounded=True):
|
|
16
36
|
"""BY B
|
|
17
37
|
compute the signed distance map of binary mask
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
from PyQt5.QtWidgets import QMessageBox
|
|
2
|
+
from melage.widgets import MelagePlugin
|
|
3
|
+
from melage.dialogs.dynamic_gui import DynamicDialog
|
|
4
|
+
from .tissue_segmentation_schema import get_schema
|
|
5
|
+
from PyQt5 import QtWidgets
|
|
6
|
+
from .main.test import get_inference
|
|
7
|
+
import torch
|
|
8
|
+
from PyQt5.QtCore import Qt
|
|
9
|
+
from melage.config import settings
|
|
10
|
+
import os
|
|
11
|
+
from PyQt5.QtCore import pyqtSignal
|
|
12
|
+
# --- THE LOGIC CLASS ---
|
|
13
|
+
class esFCMLogic(DynamicDialog):
|
|
14
|
+
"""
|
|
15
|
+
This class handles the BRAIN of the WarpSeg tool.
|
|
16
|
+
The LOOKS are handled automatically by DynamicDialog + Schema.
|
|
17
|
+
"""
|
|
18
|
+
completed = pyqtSignal(object)
|
|
19
|
+
def __init__(self, data_context,parent=None):
|
|
20
|
+
# 1. Initialize DynamicDialog with the Schema
|
|
21
|
+
# This single line builds the entire window!
|
|
22
|
+
|
|
23
|
+
super().__init__(parent)
|
|
24
|
+
self.create_main_ui(schema=get_schema(), default_items=False)
|
|
25
|
+
self.setAttribute(Qt.WA_DeleteOnClose)
|
|
26
|
+
self.data_context = data_context
|
|
27
|
+
|
|
28
|
+
# 2. AUTOMATICALLY WIDGET BINDING
|
|
29
|
+
# Iterate over all widgets created by the schema and bind them to 'self'.
|
|
30
|
+
for widget_id, widget_obj in self.widgets.items():
|
|
31
|
+
setattr(self, widget_id, widget_obj)
|
|
32
|
+
|
|
33
|
+
# 3. GENERAL PURPOSE SIGNAL CONNECTION (Auto-Connect)
|
|
34
|
+
# Instead of a hardcoded dictionary, we iterate through every widget from the schema
|
|
35
|
+
# and look for a matching method in this class named: on_<ID>_<Signal>
|
|
36
|
+
# This works for ANY schema changes automatically.
|
|
37
|
+
supported_signals = [
|
|
38
|
+
"clicked", "toggled", "currentIndexChanged",
|
|
39
|
+
"textChanged", "valueChanged"
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
for widget_id, widget_obj in self.widgets.items():
|
|
43
|
+
for signal_name in supported_signals:
|
|
44
|
+
# 1. Check if the widget has this signal (e.g., Button has 'clicked')
|
|
45
|
+
if hasattr(widget_obj, signal_name):
|
|
46
|
+
# 2. Check if WE have a handler method (e.g., 'on_btn_apply_clicked')
|
|
47
|
+
handler_name = f"on_{widget_id}_{signal_name}"
|
|
48
|
+
if hasattr(self, handler_name):
|
|
49
|
+
# 3. Connect them!
|
|
50
|
+
signal = getattr(widget_obj, signal_name)
|
|
51
|
+
handler = getattr(self, handler_name)
|
|
52
|
+
# Disconnect first to be safe (idempotent), then connect
|
|
53
|
+
try:
|
|
54
|
+
signal.disconnect(handler)
|
|
55
|
+
except TypeError:
|
|
56
|
+
pass
|
|
57
|
+
signal.connect(handler)
|
|
58
|
+
# print(f"Auto-connected: {widget_id}.{signal_name} -> {handler_name}")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def ui_schema(self):
|
|
63
|
+
# We call the function to get the dictionary
|
|
64
|
+
return get_schema()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
# Renamed from 'run_process' to match the schema ID 'btn_apply'
|
|
70
|
+
def on_btn_apply_clicked(self):
|
|
71
|
+
view = self.combo_view.currentText()
|
|
72
|
+
data_view = self.data_context[view]
|
|
73
|
+
if data_view is None:
|
|
74
|
+
QMessageBox.information(self, "Error", "No image data available for the selected view.")
|
|
75
|
+
return
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
"""The main execution function."""
|
|
79
|
+
self.progress_bar.setValue(10)
|
|
80
|
+
|
|
81
|
+
data = data_view.get_fdata().copy()
|
|
82
|
+
if len(data.shape)<=1:
|
|
83
|
+
raise ValueError("Input image must be at least 2D NIfTI.")
|
|
84
|
+
|
|
85
|
+
model_name = self.combo_method.currentText()
|
|
86
|
+
num_tissues = int(self.spin_num_classes.value())
|
|
87
|
+
max_iter = int(self.spin_max_iter.value())
|
|
88
|
+
seg = get_inference(model_name, self.progress_bar, data, affine=None, num_tissues=num_tissues,
|
|
89
|
+
post_correction=True, max_iter=max_iter)
|
|
90
|
+
seg = seg.astype('int')
|
|
91
|
+
result_package = {
|
|
92
|
+
"image": None,
|
|
93
|
+
"label": seg,
|
|
94
|
+
"view": view
|
|
95
|
+
}
|
|
96
|
+
self.completed.emit(result_package)
|
|
97
|
+
self.progress_bar.setValue(100)
|
|
98
|
+
#QMessageBox.information(self, "Done", "Segmentation Complete")
|
|
99
|
+
|
|
100
|
+
except Exception as e:
|
|
101
|
+
QMessageBox.information(self, "Error", f"{e}")
|
|
102
|
+
self.progress_bar.setValue(0)
|
|
103
|
+
|
|
104
|
+
def on_context_action(self, text, widget):
|
|
105
|
+
"""Handle the Right-Click Context Menu defined in schema"""
|
|
106
|
+
if text == "Reset Adult Options":
|
|
107
|
+
# Access radio button directly by ID
|
|
108
|
+
self.radio_adult_whole.setChecked(True)
|
|
109
|
+
print("Options reset.")
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# --- THE PLUGIN WRAPPER ---
|
|
113
|
+
class WarpSegPlugin(MelagePlugin):
|
|
114
|
+
@property
|
|
115
|
+
def name(self) -> str: return "FCM"
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def category(self) -> str: return "UnSupervised Segmentation"
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def get_widget(self, data_context =None,parent=None):
|
|
122
|
+
logic = esFCMLogic(data_context, parent)
|
|
123
|
+
|
|
124
|
+
return logic
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
|
|
2
|
+
from ..ui_helpers import Label, Combo, Check, Radio, Group, Button, Progress, HBox, FilePicker, SpinBox, Reference
|
|
3
|
+
|
|
4
|
+
# The simplified schema using helper functions.
|
|
5
|
+
# The main layout defaults to 'vbox', so items stack automatically.
|
|
6
|
+
def get_schema():
|
|
7
|
+
UI_SCHEMA = {
|
|
8
|
+
"title": "Enhanced spatial Fuzzy C-Means algorithm ...",
|
|
9
|
+
"min_width": 500,
|
|
10
|
+
"layout": "vbox",
|
|
11
|
+
"items": [
|
|
12
|
+
#Label(id="lbl_model_info", text="Model Info: Ready for Ifant brain segmentation"),
|
|
13
|
+
Reference(
|
|
14
|
+
"<b>Jafrasteh et al. (2024)</b>. <i>'Enhanced Spatial Fuzzy C-Means...'</i>. "
|
|
15
|
+
'<a href="https://link.springer.com/article/10.1007/s12021-024-09661-x">(paper)</a>'
|
|
16
|
+
|
|
17
|
+
),
|
|
18
|
+
Combo(id="combo_method", label="Select Method:", options=["esFCM", "FCM"]),
|
|
19
|
+
Group(id="group_mode", layout="hbox", children=[
|
|
20
|
+
SpinBox(id="spin_num_classes", label="Number of classes:", value=3, min_val=2, max_val=50,
|
|
21
|
+
step=1, decimals=0),
|
|
22
|
+
SpinBox(id="spin_max_iter", label="Max No of Iter:", value=50, min_val=2, max_val=500,
|
|
23
|
+
step=1, decimals=0),
|
|
24
|
+
]),
|
|
25
|
+
|
|
26
|
+
HBox([
|
|
27
|
+
Progress(id="progress_bar"),
|
|
28
|
+
Button(id="btn_apply", text="Apply", default=True)
|
|
29
|
+
])
|
|
30
|
+
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
return UI_SCHEMA
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from PyQt5.QtWidgets import QMessageBox
|
|
3
|
+
from melage.widgets import MelagePlugin
|
|
4
|
+
from melage.dialogs.dynamic_gui import DynamicDialog
|
|
5
|
+
from .mo_schema import get_schema
|
|
6
|
+
from PyQt5.QtCore import Qt
|
|
7
|
+
from PyQt5.QtCore import pyqtSignal
|
|
8
|
+
import SimpleITK as sitk
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
#from .main.utils import changeCoordSystem
|
|
13
|
+
# --- THE LOGIC CLASS ---
|
|
14
|
+
class MainLogic(DynamicDialog):
|
|
15
|
+
"""
|
|
16
|
+
This class handles the BRAIN of the WarpSeg tool.
|
|
17
|
+
The LOOKS are handled automatically by DynamicDialog + Schema.
|
|
18
|
+
"""
|
|
19
|
+
completed = pyqtSignal(object)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def __init__(self, data_context,parent=None):
|
|
23
|
+
# 1. Initialize DynamicDialog with the Schema
|
|
24
|
+
# This single line builds the entire window!
|
|
25
|
+
|
|
26
|
+
super().__init__(parent)
|
|
27
|
+
self.create_main_ui(schema=get_schema(), default_items=False)
|
|
28
|
+
self.setAttribute(Qt.WA_DeleteOnClose)
|
|
29
|
+
self.data_context = data_context
|
|
30
|
+
|
|
31
|
+
# 2. AUTOMATICALLY WIDGET BINDING
|
|
32
|
+
# Iterate over all widgets created by the schema and bind them to 'self'.
|
|
33
|
+
for widget_id, widget_obj in self.widgets.items():
|
|
34
|
+
setattr(self, widget_id, widget_obj)
|
|
35
|
+
|
|
36
|
+
# 3. GENERAL PURPOSE SIGNAL CONNECTION (Auto-Connect)
|
|
37
|
+
# Instead of a hardcoded dictionary, we iterate through every widget from the schema
|
|
38
|
+
# and look for a matching method in this class named: on_<ID>_<Signal>
|
|
39
|
+
# This works for ANY schema changes automatically.
|
|
40
|
+
supported_signals = [
|
|
41
|
+
"clicked", "toggled", "currentIndexChanged",
|
|
42
|
+
"textChanged", "valueChanged"
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
for widget_id, widget_obj in self.widgets.items():
|
|
46
|
+
for signal_name in supported_signals:
|
|
47
|
+
# 1. Check if the widget has this signal (e.g., Button has 'clicked')
|
|
48
|
+
if hasattr(widget_obj, signal_name):
|
|
49
|
+
# 2. Check if WE have a handler method (e.g., 'on_btn_apply_clicked')
|
|
50
|
+
handler_name = f"on_{widget_id}_{signal_name}"
|
|
51
|
+
if hasattr(self, handler_name):
|
|
52
|
+
# 3. Connect them!
|
|
53
|
+
signal = getattr(widget_obj, signal_name)
|
|
54
|
+
handler = getattr(self, handler_name)
|
|
55
|
+
# Disconnect first to be safe (idempotent), then connect
|
|
56
|
+
try:
|
|
57
|
+
signal.disconnect(handler)
|
|
58
|
+
except TypeError:
|
|
59
|
+
pass
|
|
60
|
+
signal.connect(handler)
|
|
61
|
+
# print(f"Auto-connected: {widget_id}.{signal_name} -> {handler_name}")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def ui_schema(self):
|
|
66
|
+
# We call the function to get the dictionary
|
|
67
|
+
return get_schema()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# Renamed from 'run_process' to match the schema ID 'btn_apply'
|
|
71
|
+
def on_btn_apply_clicked(self):
|
|
72
|
+
view = self.combo_view.currentText()
|
|
73
|
+
data_view = self.data_context[view]
|
|
74
|
+
if data_view is None:
|
|
75
|
+
QMessageBox.information(self, "Error", "No image data available for the selected view.")
|
|
76
|
+
return
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
"""The main execution function."""
|
|
80
|
+
self.progress_bar.setValue(0)
|
|
81
|
+
max_iters = int(self.iteration.value())
|
|
82
|
+
numberFittingLevels = int((self.fit_lvl.value()))
|
|
83
|
+
shrinkFactor = int((self.shrink_fct.value()))
|
|
84
|
+
status_otsu = self.check_otsu.isChecked()
|
|
85
|
+
im = N4_bias_correction(data_view, use_otsu=status_otsu, shrinkFactor=shrinkFactor,
|
|
86
|
+
numberFittingLevels=numberFittingLevels, max_iter=max_iters)
|
|
87
|
+
result_package = {
|
|
88
|
+
"image": im.get_fdata(),
|
|
89
|
+
"affine": im.affine,
|
|
90
|
+
"label": np.zeros_like(im.get_fdata()),
|
|
91
|
+
"view": view
|
|
92
|
+
}
|
|
93
|
+
self.completed.emit(result_package)
|
|
94
|
+
self.progress_bar.setValue(100)
|
|
95
|
+
#QMessageBox.information(self, "Done", "Segmentation Complete")
|
|
96
|
+
|
|
97
|
+
except Exception as e:
|
|
98
|
+
QMessageBox.information(self, "Error", f"{e}")
|
|
99
|
+
self.progress_bar.setValue(0)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
# --- THE PLUGIN WRAPPER ---
|
|
105
|
+
class AuxPlugin(MelagePlugin):
|
|
106
|
+
@property
|
|
107
|
+
def name(self) -> str: return "Masking Operation"
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def category(self) -> str: return "Basic"
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def get_widget(self, data_context =None,parent=None):
|
|
114
|
+
logic = MainLogic(data_context, parent)
|
|
115
|
+
return logic
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
|
|
2
|
+
from ..ui_helpers import Label, Combo, Check, Radio, Group, Button, Progress, HBox, FilePicker, SpinBox, Reference
|
|
3
|
+
|
|
4
|
+
# The simplified schema using helper functions.
|
|
5
|
+
# The main layout defaults to 'vbox', so items stack automatically.
|
|
6
|
+
def get_schema():
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
UI_SCHEMA = {
|
|
10
|
+
"title": "N4 Bias Field Correction",
|
|
11
|
+
"min_width": 310,
|
|
12
|
+
"layout": "vbox",
|
|
13
|
+
"items": [
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
Group(id="group_mode", layout="hbox", title="Operation",children=[
|
|
18
|
+
Combo(id="combo_1", label="Label 1", options=[],),
|
|
19
|
+
Combo(id="combo_operation", label="", options=["/", "*", "-", "+"], default="+"),
|
|
20
|
+
Combo(id="combo_2", label="Label 2", options=[]),
|
|
21
|
+
]),
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# --- Bottom Row: Progress + Apply ---
|
|
27
|
+
HBox(children=[
|
|
28
|
+
Progress(id="progress_bar"),
|
|
29
|
+
Button(id="btn_apply", text="Apply", default=True)
|
|
30
|
+
])
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
return UI_SCHEMA
|