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
melage/utils/utils.py
CHANGED
|
@@ -4,6 +4,7 @@ __AUTHOR__ = 'Bahram Jafrasteh'
|
|
|
4
4
|
|
|
5
5
|
import sys
|
|
6
6
|
from operator import index
|
|
7
|
+
from pathlib import Path
|
|
7
8
|
|
|
8
9
|
sys.path.append("../../")
|
|
9
10
|
import numpy as np
|
|
@@ -28,7 +29,7 @@ try:
|
|
|
28
29
|
except:
|
|
29
30
|
None
|
|
30
31
|
try:
|
|
31
|
-
from melage.
|
|
32
|
+
from melage.config import settings
|
|
32
33
|
except:
|
|
33
34
|
pass
|
|
34
35
|
# Direction of medical image Left, Right, Posterior Anterior, Inferior, Superior
|
|
@@ -43,6 +44,50 @@ class Item:
|
|
|
43
44
|
size: bytes
|
|
44
45
|
|
|
45
46
|
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def get_filter_for_file(filename, all_filters):
|
|
51
|
+
"""
|
|
52
|
+
Returns the specific filter string (e.g., 'Nifti (*.nii)') that matches
|
|
53
|
+
the given filename.
|
|
54
|
+
"""
|
|
55
|
+
# 1. Split the massive filter string into individual categories
|
|
56
|
+
# "Nifti(...);;Vol(...)" -> ["Nifti(...)", "Vol(...)"]
|
|
57
|
+
categories = all_filters.split(';;')
|
|
58
|
+
|
|
59
|
+
# We compare in lowercase to handle extensions robustly (e.g., .NII vs .nii)
|
|
60
|
+
filename_lower = filename.lower()
|
|
61
|
+
|
|
62
|
+
for category in categories:
|
|
63
|
+
# 2. Extract the part inside parentheses: "*.nii *.nii.gz"
|
|
64
|
+
start = category.find('(')
|
|
65
|
+
end = category.find(')')
|
|
66
|
+
|
|
67
|
+
if start != -1 and end != -1:
|
|
68
|
+
# Get the content inside ()
|
|
69
|
+
pattern_str = category[start + 1:end]
|
|
70
|
+
|
|
71
|
+
# Split into individual extensions: ["*.nii", "*.nii.gz"]
|
|
72
|
+
patterns = pattern_str.split()
|
|
73
|
+
|
|
74
|
+
for pattern in patterns:
|
|
75
|
+
# Clean the pattern to get the suffix
|
|
76
|
+
# "*.nii.gz" -> ".nii.gz"
|
|
77
|
+
# "**" -> skip
|
|
78
|
+
clean_ext = pattern.replace('*', '').lower()
|
|
79
|
+
|
|
80
|
+
if not clean_ext:
|
|
81
|
+
continue # Skip empty or pure wildcards
|
|
82
|
+
|
|
83
|
+
# 3. Check if the filename ends with this extension
|
|
84
|
+
# "mri.nii.gz" ends with ".nii.gz" -> Match!
|
|
85
|
+
if filename_lower.endswith(clean_ext):
|
|
86
|
+
return category
|
|
87
|
+
|
|
88
|
+
# Fallback: If no specific match found, return "All Files" or the first one
|
|
89
|
+
return "All Files (*)"
|
|
90
|
+
|
|
46
91
|
def guess_num_image_index(nifti_input):
|
|
47
92
|
"""
|
|
48
93
|
Guess which axis of the image shape represents the 'num_images' (volume/time/channel) dimension.
|
|
@@ -56,7 +101,7 @@ def guess_num_image_index(nifti_input):
|
|
|
56
101
|
if isinstance(nifti_input, nib.Nifti1Image):
|
|
57
102
|
hdr = nifti_input.header
|
|
58
103
|
else:
|
|
59
|
-
return
|
|
104
|
+
return np.argmin(nifti_input.shape), 1
|
|
60
105
|
|
|
61
106
|
ndim = hdr['dim'][0]
|
|
62
107
|
shape = hdr['dim'][1:4]
|
|
@@ -380,7 +425,10 @@ def resample_to_spacing(im, newSpacing, method='spline'):
|
|
|
380
425
|
|
|
381
426
|
|
|
382
427
|
# Define the new spacing (voxel size) for resampling
|
|
383
|
-
|
|
428
|
+
if type(newSpacing)==list or type(newSpacing)==tuple:
|
|
429
|
+
new_spacing = newSpacing
|
|
430
|
+
else:
|
|
431
|
+
new_spacing = (newSpacing, newSpacing, newSpacing)
|
|
384
432
|
|
|
385
433
|
# Calculate the new size based on the original size and spacing
|
|
386
434
|
new_size = [int(sz * spc / new_spc + 0.5) for sz, spc, new_spc in
|
|
@@ -403,7 +451,7 @@ def resample_to_spacing(im, newSpacing, method='spline'):
|
|
|
403
451
|
return read_sitk_as_nib(resampled_image)
|
|
404
452
|
except:
|
|
405
453
|
from nibabel.processing import resample_to_output
|
|
406
|
-
return resample_to_output(im,
|
|
454
|
+
return resample_to_output(im, new_spacing)
|
|
407
455
|
|
|
408
456
|
|
|
409
457
|
###################### Help dialogue to open new image ######################
|
|
@@ -468,174 +516,6 @@ def calculate_snr(image_array):
|
|
|
468
516
|
|
|
469
517
|
###################### A class to resize image######################
|
|
470
518
|
|
|
471
|
-
class resize_window(QtWidgets.QDialog):
|
|
472
|
-
from PyQt5.QtCore import pyqtSignal
|
|
473
|
-
closeSig = pyqtSignal()
|
|
474
|
-
resizeim = pyqtSignal(object)
|
|
475
|
-
comboboxCh = pyqtSignal(object, object)
|
|
476
|
-
"""
|
|
477
|
-
A dialog for combo box created for reading 4d images
|
|
478
|
-
"""
|
|
479
|
-
def __init__(self, parent=None, use_combobox=False):
|
|
480
|
-
QtWidgets.QDialog.__init__(self, parent)
|
|
481
|
-
self.setWindowTitle("Child Window!")
|
|
482
|
-
Dialog = self.window()
|
|
483
|
-
self.use_combobox = use_combobox
|
|
484
|
-
self.setupUi(Dialog)
|
|
485
|
-
self.check_box.setCheckState(Qt.Checked)
|
|
486
|
-
self._status = False
|
|
487
|
-
|
|
488
|
-
def setupUi(self, Dialog):
|
|
489
|
-
|
|
490
|
-
Dialog.setObjectName("Dialog")
|
|
491
|
-
Dialog.resize(500, 112)
|
|
492
|
-
self.grid_main = QtWidgets.QGridLayout(self)
|
|
493
|
-
self.grid_main.setContentsMargins(10,10,10,10)
|
|
494
|
-
self.grid_main.setObjectName("gridLayout")
|
|
495
|
-
|
|
496
|
-
self.hbox_0 = QtWidgets.QHBoxLayout()
|
|
497
|
-
self.label_warning = QtWidgets.QLabel()
|
|
498
|
-
self.label_warning.setText('The pixels are not isotropic. Do you want to resize image (isotropic)?')
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
self.hbox_0.addWidget(self.label_warning)
|
|
502
|
-
|
|
503
|
-
_translate = QtCore.QCoreApplication.translate
|
|
504
|
-
self.pushbutton = QtWidgets.QDialogButtonBox()
|
|
505
|
-
self.pushbutton_cancel = QtWidgets.QPushButton()
|
|
506
|
-
self.pushbutton.setStandardButtons(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
|
|
507
|
-
self.pushbutton.accepted.connect(self.accept_it)
|
|
508
|
-
self.pushbutton.rejected.connect(self.reject_it)
|
|
509
|
-
|
|
510
|
-
#self.hbox_0.addWidget(self.pushbutton)
|
|
511
|
-
|
|
512
|
-
if self.use_combobox:
|
|
513
|
-
self.comboBox_image = QtWidgets.QComboBox()
|
|
514
|
-
self.comboBox_image.setObjectName("comboBox_image")
|
|
515
|
-
self.comboBox_image.addItem("")
|
|
516
|
-
self.comboBox_image.addItem("")
|
|
517
|
-
self.comboBox_image.currentIndexChanged.connect(self.comboBOX_changed)
|
|
518
|
-
#
|
|
519
|
-
self.hbox_0.addWidget(self.comboBox_image)
|
|
520
|
-
self.grid_main.addLayout(self.hbox_0, 0, 0, 1, 1)
|
|
521
|
-
else:
|
|
522
|
-
self.grid_main.addLayout(self.hbox_0, 0, 0, 1, 1)
|
|
523
|
-
|
|
524
|
-
self.grid_main.addWidget(self.pushbutton, 3, 0, 1, 1)
|
|
525
|
-
self.check_box = QtWidgets.QCheckBox()
|
|
526
|
-
|
|
527
|
-
self.check_box.stateChanged.connect(self.changeAllSpacing)
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
self.label_current_spc0 = QtWidgets.QLabel()
|
|
531
|
-
self.label_current_spc0.setText('Current Spacing')
|
|
532
|
-
|
|
533
|
-
self.label_current_spc = QtWidgets.QLabel()
|
|
534
|
-
#self.label_current_spc.setReadOnly(True)
|
|
535
|
-
self.label_current_spc.setText('0,0,0')
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
self.radioButton_1 = QtWidgets.QCheckBox()
|
|
539
|
-
|
|
540
|
-
self.radioButton_1.setObjectName("radioButton_1")
|
|
541
|
-
self.radioButton_1.setChecked(False)
|
|
542
|
-
|
|
543
|
-
self.hbox = QtWidgets.QHBoxLayout()
|
|
544
|
-
self.hbox.addWidget(self.check_box)
|
|
545
|
-
self.hbox.addWidget(self.radioButton_1)
|
|
546
|
-
self.hbox.addWidget(self.label_current_spc0)
|
|
547
|
-
self.hbox.addWidget(self.label_current_spc)
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
self.hbox2 = QtWidgets.QHBoxLayout()
|
|
551
|
-
self.label_new_spc0 = QtWidgets.QLabel()
|
|
552
|
-
self.label_new_spc0.setText('New Spacing')
|
|
553
|
-
self.label_new_spc0.setStyleSheet('color: Red')
|
|
554
|
-
|
|
555
|
-
self.label_new_spc = QtWidgets.QDoubleSpinBox(self)
|
|
556
|
-
self.label_new_spc_y = QtWidgets.QDoubleSpinBox(self)
|
|
557
|
-
self.label_new_spc_z = QtWidgets.QDoubleSpinBox(self)
|
|
558
|
-
|
|
559
|
-
for spin_box in (self.label_new_spc, self.label_new_spc_y, self.label_new_spc_z):
|
|
560
|
-
spin_box.setMinimum(0.01)
|
|
561
|
-
spin_box.setMaximum(20)
|
|
562
|
-
spin_box.setSingleStep(0.1)
|
|
563
|
-
spin_box.setValue(1.0)
|
|
564
|
-
spin_box.setDecimals(2)
|
|
565
|
-
|
|
566
|
-
self.hbox2.addWidget(self.label_new_spc0)
|
|
567
|
-
self.hbox2.addWidget(self.label_new_spc)
|
|
568
|
-
self.hbox2.addWidget(self.label_new_spc_y)
|
|
569
|
-
self.hbox2.addWidget(self.label_new_spc_z)
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
#self.pushbutton.setText(_translate("Dialog", "OK"))
|
|
573
|
-
#self.grid_main.addWidget(self.label_warning, 0,0,1,1)
|
|
574
|
-
self.grid_main.addLayout(self.hbox, 1,0,1,1)
|
|
575
|
-
self.grid_main.addLayout(self.hbox2,2,0,1,1)
|
|
576
|
-
|
|
577
|
-
#self.hbox3 = QtWidgets.QHBoxLayout()
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
#self.grid_main.addLayout(self.hbox_0, 3, 0, 1, 1)
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
self.retranslateUi(Dialog)
|
|
584
|
-
|
|
585
|
-
QtCore.QMetaObject.connectSlotsByName(Dialog)
|
|
586
|
-
|
|
587
|
-
def changeAllSpacing(self, state):
|
|
588
|
-
if state == QtCore.Qt.Checked:
|
|
589
|
-
# Connect the change signal to synchronize function
|
|
590
|
-
self.label_new_spc.valueChanged.connect(self.synchronizeSpacings)
|
|
591
|
-
self.label_new_spc_y.valueChanged.connect(self.synchronizeSpacings)
|
|
592
|
-
self.label_new_spc_z.valueChanged.connect(self.synchronizeSpacings)
|
|
593
|
-
else:
|
|
594
|
-
# Disconnect the synchronize function to allow independent changes
|
|
595
|
-
self.label_new_spc.valueChanged.disconnect(self.synchronizeSpacings)
|
|
596
|
-
self.label_new_spc_y.valueChanged.disconnect(self.synchronizeSpacings)
|
|
597
|
-
self.label_new_spc_z.valueChanged.disconnect(self.synchronizeSpacings)
|
|
598
|
-
|
|
599
|
-
def synchronizeSpacings(self, value):
|
|
600
|
-
# Set the value of all spin boxes to the changed value
|
|
601
|
-
self.label_new_spc.blockSignals(True)
|
|
602
|
-
self.label_new_spc_y.blockSignals(True)
|
|
603
|
-
self.label_new_spc_z.blockSignals(True)
|
|
604
|
-
self.label_new_spc.setValue(value)
|
|
605
|
-
self.label_new_spc_y.setValue(value)
|
|
606
|
-
self.label_new_spc_z.setValue(value)
|
|
607
|
-
self.label_new_spc.blockSignals(False)
|
|
608
|
-
self.label_new_spc_y.blockSignals(False)
|
|
609
|
-
self.label_new_spc_z.blockSignals(False)
|
|
610
|
-
|
|
611
|
-
def comboBOX_changed(self):
|
|
612
|
-
ind = self.comboBox_image.currentIndex()
|
|
613
|
-
self.comboboxCh.emit(None, ind)
|
|
614
|
-
|
|
615
|
-
def retranslateUi(self, Dialog):
|
|
616
|
-
_translate = QtCore.QCoreApplication.translate
|
|
617
|
-
Dialog.setWindowTitle(_translate("Dialog", "Resize..."))
|
|
618
|
-
|
|
619
|
-
_translate = QtCore.QCoreApplication.translate
|
|
620
|
-
self.radioButton_1.setText(_translate("Main", "Linear"))
|
|
621
|
-
self.check_box.setText(_translate("Main", "Isotropic"))
|
|
622
|
-
if self.use_combobox:
|
|
623
|
-
self.comboBox_image.setItemText(0, _translate("Form", " Top Image "))
|
|
624
|
-
self.comboBox_image.setItemText(1, _translate("Form", " Bottom Image "))
|
|
625
|
-
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
|
|
626
|
-
self.closeSig.emit()
|
|
627
|
-
super(resize_window, self).closeEvent(a0)
|
|
628
|
-
def accept_it(self):
|
|
629
|
-
self._status = True
|
|
630
|
-
if self.use_combobox:
|
|
631
|
-
index = self.comboBox_image.currentIndex()
|
|
632
|
-
self.resizeim.emit(index)
|
|
633
|
-
self.accept()
|
|
634
|
-
|
|
635
|
-
def reject_it(self):
|
|
636
|
-
self._status = False
|
|
637
|
-
self.reject()
|
|
638
|
-
|
|
639
519
|
########### COMBO BOX To read 4D images #####################
|
|
640
520
|
class ComboBox_Dialog(QtWidgets.QDialog):
|
|
641
521
|
"""
|
|
@@ -920,9 +800,199 @@ def manually_check_tree_item(self, txt='9876'):
|
|
|
920
800
|
for l in ls:
|
|
921
801
|
root.child(l).setCheckState(Qt.Checked)
|
|
922
802
|
return ls
|
|
803
|
+
####################### Discover all scheme files #####################
|
|
804
|
+
def discover_color_files(base_folder):
|
|
805
|
+
"""
|
|
806
|
+
Dynamically finds all .txt files in the 'color' subdirectory.
|
|
807
|
+
|
|
808
|
+
Args:
|
|
809
|
+
base_folder (str): The root folder containing the 'color' directory.
|
|
923
810
|
|
|
811
|
+
Returns:
|
|
812
|
+
dict: A dictionary where keys are filenames (without extension)
|
|
813
|
+
and values are the relative paths to the .txt files.
|
|
814
|
+
Returns an empty dictionary if the folder doesn't exist.
|
|
815
|
+
"""
|
|
816
|
+
color_dir = Path(base_folder) / 'color'
|
|
817
|
+
if not color_dir.is_dir():
|
|
818
|
+
print(f"Warning: Color directory not found at '{color_dir}'")
|
|
819
|
+
return {}
|
|
820
|
+
|
|
821
|
+
# Create a dictionary mapping the filename (e.g., 'Simple')
|
|
822
|
+
# to its relative path (e.g., 'color/Simple.txt')
|
|
823
|
+
# The .lower() makes the key consistent for lookups.
|
|
824
|
+
return {
|
|
825
|
+
path.stem: f"/color/{path.name}"
|
|
826
|
+
for path in color_dir.glob('*.txt')
|
|
827
|
+
}
|
|
924
828
|
###################### Updating current color scheme ##################
|
|
925
|
-
|
|
829
|
+
|
|
830
|
+
MAX_COLORS = 255
|
|
831
|
+
COMBINED_COLOR_ID = 9876
|
|
832
|
+
DEFAULT_COLOR_FILES = {
|
|
833
|
+
'simple': '/color/Simple.txt',
|
|
834
|
+
'tissue': '/color/Tissue.txt',
|
|
835
|
+
'albert': '/color/albert_LUT.txt',
|
|
836
|
+
'mcrib': '/color/mcrib_LUT.txt',
|
|
837
|
+
}
|
|
838
|
+
from PyQt5.QtWidgets import QFileDialog
|
|
839
|
+
|
|
840
|
+
# --- Helper Functions (These perform the specific, isolated tasks) ---
|
|
841
|
+
|
|
842
|
+
def _get_required_indices(data, data_add=None):
|
|
843
|
+
"""Extracts unique positive integer indices from data arrays."""
|
|
844
|
+
|
|
845
|
+
indices = set([l for l in np.unique(data).astype('int') if l > 0])
|
|
846
|
+
if data_add is not None:
|
|
847
|
+
indices.update([l for l in np.unique(data_add).astype('int') if l > 0])
|
|
848
|
+
return {idx for idx in indices if idx > 0}
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
def _get_color_filepath(app_instance, show_dialog, unique_count):
|
|
852
|
+
|
|
853
|
+
"""Gets color file path via dialog or automatic selection."""
|
|
854
|
+
if show_dialog:
|
|
855
|
+
filters = "Text files (*.txt)"
|
|
856
|
+
opts = QFileDialog.DontUseNativeDialog
|
|
857
|
+
file_path, _ = QFileDialog.getOpenFileName(app_instance, "Open Color File", settings.DEFAULT_USE_DIR, filters,
|
|
858
|
+
options=opts)
|
|
859
|
+
if file_path!='':
|
|
860
|
+
return file_path
|
|
861
|
+
available_files = discover_color_files(settings.RESOURCE_DIR)
|
|
862
|
+
if not available_files:
|
|
863
|
+
print("Error: No color files found.")
|
|
864
|
+
return None # No files to choose from
|
|
865
|
+
# Automatic selection logic
|
|
866
|
+
# This example selects a file based on name, similar to before.
|
|
867
|
+
if unique_count <= 2 and 'Simple' in available_files:
|
|
868
|
+
filepath = available_files['Simple']
|
|
869
|
+
elif unique_count <= 9 and 'Tissue' in available_files:
|
|
870
|
+
filepath = available_files['Tissue']
|
|
871
|
+
elif unique_count < 90 and 'albert_LUT' in available_files:
|
|
872
|
+
filepath = available_files['albert_LUT']
|
|
873
|
+
elif 'mcrib_LUT' in available_files: # Fallback for larger counts
|
|
874
|
+
filepath = available_files['mcrib_LUT']
|
|
875
|
+
else:
|
|
876
|
+
# If no specific logic matches, just pick the first available file
|
|
877
|
+
filepath = next(iter(available_files.values()))
|
|
878
|
+
filepath = available_files["FreeSurferColorLUT"]
|
|
879
|
+
return settings.RESOURCE_DIR + filepath
|
|
880
|
+
|
|
881
|
+
|
|
882
|
+
def _load_color_definitions(file_path):
|
|
883
|
+
"""Loads color definitions from a text file, trying multiple formats."""
|
|
884
|
+
try:
|
|
885
|
+
names, rgb_data, _ = read_txt_color(file_path, from_one=False, mode='albert')
|
|
886
|
+
return {'names': names, 'rgb': rgb_data}
|
|
887
|
+
except Exception as e1:
|
|
888
|
+
print(f"Could not read '{file_path}' in primary format. Trying fallback. Error: {e1}")
|
|
889
|
+
try:
|
|
890
|
+
names, rgb_data, _ = read_txt_color(file_path, from_one=False)
|
|
891
|
+
return {'names': names, 'rgb': rgb_data}
|
|
892
|
+
except Exception as e2:
|
|
893
|
+
print(f"Error: Failed to read color file '{file_path}'. Error: {e2}")
|
|
894
|
+
return None
|
|
895
|
+
|
|
896
|
+
|
|
897
|
+
def _update_ui_widgets(app_instance):
|
|
898
|
+
"""Safely disconnects, updates, and reconnects UI signals and widgets."""
|
|
899
|
+
try:
|
|
900
|
+
#self.dw2_cb.currentTextChanged.disconnect(self.changeColorPen)
|
|
901
|
+
app_instance.tree_colors.itemChanged.disconnect(app_instance.changeColorPen)
|
|
902
|
+
except:
|
|
903
|
+
pass
|
|
904
|
+
|
|
905
|
+
set_new_color_scheme(app_instance)
|
|
906
|
+
try:
|
|
907
|
+
#self.dw2_cb.currentTextChanged.connect(self.changeColorPen)
|
|
908
|
+
app_instance.tree_colors.itemChanged.connect(app_instance.changeColorPen)
|
|
909
|
+
except:
|
|
910
|
+
pass
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
# --- Main Function ---
|
|
914
|
+
|
|
915
|
+
def update_color_scheme(app_instance, data, data_add=None, dialog=True, update_widget=True):
|
|
916
|
+
"""
|
|
917
|
+
Updates the application's color scheme based on indices present in the data.
|
|
918
|
+
|
|
919
|
+
Args:
|
|
920
|
+
app_instance: The instance of the application class (what was 'self').
|
|
921
|
+
data (np.ndarray): The primary data array with color indices.
|
|
922
|
+
data_add (np.ndarray, optional): Additional data array with color indices.
|
|
923
|
+
dialog (bool): If True, shows a file dialog to select a color file.
|
|
924
|
+
update_widget (bool): If True, updates the UI widgets after the scheme is changed.
|
|
925
|
+
|
|
926
|
+
Returns:
|
|
927
|
+
tuple[np.ndarray, bool]: The original data array and a success flag.
|
|
928
|
+
"""
|
|
929
|
+
if data is None:
|
|
930
|
+
data = np.array([0, 1])
|
|
931
|
+
|
|
932
|
+
# 1. Determine which color indices are required
|
|
933
|
+
required_indices = _get_required_indices(data, data_add)
|
|
934
|
+
if len(required_indices) > MAX_COLORS:
|
|
935
|
+
print(f"Error: Number of unique colors exceeds the limit of {MAX_COLORS}.")
|
|
936
|
+
return data, False
|
|
937
|
+
|
|
938
|
+
current_indices = set(app_instance.color_index_rgb[:, 0].astype(int))
|
|
939
|
+
new_indices_needed = required_indices - current_indices
|
|
940
|
+
|
|
941
|
+
if not new_indices_needed:
|
|
942
|
+
return data, True # Success, no update was needed
|
|
943
|
+
|
|
944
|
+
# 2. Get the color file and load the color definitions
|
|
945
|
+
color_file_path = _get_color_filepath(app_instance, dialog, len(required_indices))
|
|
946
|
+
#if not color_file_path:
|
|
947
|
+
# return data, False # User cancelled or no file found
|
|
948
|
+
|
|
949
|
+
loaded_colors = _load_color_definitions(color_file_path)
|
|
950
|
+
#if loaded_colors is None:
|
|
951
|
+
# return data, False # Failed to load file
|
|
952
|
+
|
|
953
|
+
# 3. Merge new colors with the existing scheme and update the app's state
|
|
954
|
+
loaded_rgb_map = {int(row[0]): row for row in loaded_colors['rgb']}
|
|
955
|
+
loaded_name_map = {int(name.split('_')[0]): name for name in loaded_colors['names']}
|
|
956
|
+
|
|
957
|
+
final_rgb = list(app_instance.color_index_rgb)
|
|
958
|
+
final_names = list(app_instance.color_name)
|
|
959
|
+
|
|
960
|
+
for ii, index in enumerate(new_indices_needed):
|
|
961
|
+
if index in loaded_rgb_map:
|
|
962
|
+
final_rgb.append(loaded_rgb_map[index])
|
|
963
|
+
final_names.append(loaded_name_map.get(index, f"{index}_unknown"))
|
|
964
|
+
else:
|
|
965
|
+
new_rgb_row = [index, np.random.rand(), np.random.rand(), np.random.rand(), 1]
|
|
966
|
+
final_rgb.append(new_rgb_row)
|
|
967
|
+
final_names.append(f"{index}_structure_unknown")
|
|
968
|
+
|
|
969
|
+
# Ensure the special "Combined" color exists
|
|
970
|
+
if COMBINED_COLOR_ID not in {int(row[0]) for row in final_rgb}:
|
|
971
|
+
final_rgb.append([COMBINED_COLOR_ID, 1, 0, 0, 1])
|
|
972
|
+
final_names.append(f"{COMBINED_COLOR_ID}_Combined")
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
# Update the application state directly on the passed instance
|
|
976
|
+
app_instance.color_index_rgb, app_instance.color_name, app_instance.colorsCombinations = \
|
|
977
|
+
generate_color_scheme_info(app_instance,np.array(final_rgb), final_names)
|
|
978
|
+
|
|
979
|
+
widgets_num = [0, 1, 2, 3, 4, 5, 10, 11, 13, 23]
|
|
980
|
+
for num in widgets_num:
|
|
981
|
+
name = 'openGLWidget_' + str(num + 1)
|
|
982
|
+
widget = getattr(app_instance, name)
|
|
983
|
+
if hasattr(widget, 'colorsCombinations'):
|
|
984
|
+
widget.colorsCombinations = app_instance.colorsCombinations
|
|
985
|
+
if hasattr(widget, 'color_name'):
|
|
986
|
+
widget.color_name = app_instance.color_name
|
|
987
|
+
|
|
988
|
+
# 4. Update the UI components
|
|
989
|
+
if update_widget:
|
|
990
|
+
_update_ui_widgets(app_instance)
|
|
991
|
+
|
|
992
|
+
return data, True
|
|
993
|
+
|
|
994
|
+
|
|
995
|
+
def update_color_scheme0(self, data, data_add=None, dialog=True, update_widget=True):
|
|
926
996
|
"""
|
|
927
997
|
Updating current color scheme
|
|
928
998
|
Args:
|
|
@@ -935,7 +1005,7 @@ def update_color_scheme(self, data, data_add=None, dialog=True, update_widget=Tr
|
|
|
935
1005
|
|
|
936
1006
|
"""
|
|
937
1007
|
if data_add is not None:
|
|
938
|
-
uq1 = [l for l in np.unique(data_add) if l > 0]
|
|
1008
|
+
uq1 = [l for l in np.unique(data_add).astype('int') if l > 0]
|
|
939
1009
|
else:
|
|
940
1010
|
uq1 = []
|
|
941
1011
|
if data is None:
|
|
@@ -963,13 +1033,13 @@ def update_color_scheme(self, data, data_add=None, dialog=True, update_widget=Tr
|
|
|
963
1033
|
print('automatic files')
|
|
964
1034
|
len_u = len(np.unique(data))
|
|
965
1035
|
if len_u<=2:
|
|
966
|
-
filen =
|
|
1036
|
+
filen = settings.RESOURCE_DIR + '/color/Simple.txt'
|
|
967
1037
|
elif len_u<=9:
|
|
968
|
-
filen =
|
|
1038
|
+
filen = settings.RESOURCE_DIR + '/color/Tissue.txt'
|
|
969
1039
|
elif len_u <90:
|
|
970
|
-
filen =
|
|
1040
|
+
filen = settings.RESOURCE_DIR + '/color/albert_LUT.txt'
|
|
971
1041
|
else:
|
|
972
|
-
filen =
|
|
1042
|
+
filen = settings.RESOURCE_DIR + '/color/mcrib_LUT.txt'
|
|
973
1043
|
from_one = False
|
|
974
1044
|
try:
|
|
975
1045
|
possible_color_name, possible_color_index_rgb, _ = read_txt_color(filen, from_one=from_one, mode='albert')
|
|
@@ -1007,7 +1077,7 @@ def update_color_scheme(self, data, data_add=None, dialog=True, update_widget=Tr
|
|
|
1007
1077
|
possible_color_index_rgb = np.vstack((possible_color_index_rgb, np.array(new_color_rgb)))
|
|
1008
1078
|
|
|
1009
1079
|
#self.color_index_rgb, self.color_name, self.colorsCombinations = combinedIndex(self.colorsCombinations, possible_color_index_rgb, possible_color_name, np.unique(data), uq1)
|
|
1010
|
-
self.color_index_rgb, self.color_name, self.colorsCombinations = generate_color_scheme_info(possible_color_index_rgb, possible_color_name)
|
|
1080
|
+
self.color_index_rgb, self.color_name, self.colorsCombinations = generate_color_scheme_info(self, possible_color_index_rgb, possible_color_name)
|
|
1011
1081
|
try:
|
|
1012
1082
|
#self.dw2_cb.currentTextChanged.disconnect(self.changeColorPen)
|
|
1013
1083
|
self.tree_colors.itemChanged.disconnect(self.changeColorPen)
|
|
@@ -1193,7 +1263,7 @@ def getUnique(mat):
|
|
|
1193
1263
|
return np.unique(mat)
|
|
1194
1264
|
|
|
1195
1265
|
###################### Generate info for color schemes ##################
|
|
1196
|
-
def generate_color_scheme_info(color_index_rgb, color_name):
|
|
1266
|
+
def generate_color_scheme_info(reader, color_index_rgb, color_name):
|
|
1197
1267
|
"""
|
|
1198
1268
|
Generate color scheme information
|
|
1199
1269
|
Args:
|
|
@@ -1258,7 +1328,77 @@ def set_new_color_scheme(self):
|
|
|
1258
1328
|
addTreeRoot(parent, '9876', 'Combined', colr)
|
|
1259
1329
|
|
|
1260
1330
|
################# SET IMAGE SCHEME ###########################
|
|
1261
|
-
|
|
1331
|
+
from PyQt5 import QtGui, QtCore
|
|
1332
|
+
import os
|
|
1333
|
+
import numpy as np
|
|
1334
|
+
|
|
1335
|
+
# Place this helper method inside your main class
|
|
1336
|
+
def _is_image_already_added(self, file_path, view_index):
|
|
1337
|
+
"""Checks if an image has already been added to a specific view."""
|
|
1338
|
+
for item_data in self.imported_images:
|
|
1339
|
+
existing_file = item_data[0][0][0]
|
|
1340
|
+
existing_view_index = item_data[0][0][2]
|
|
1341
|
+
if file_path == existing_file and view_index == existing_view_index:
|
|
1342
|
+
return True
|
|
1343
|
+
return False
|
|
1344
|
+
|
|
1345
|
+
# Your updated function
|
|
1346
|
+
def update_image_sch(self, info=None, color=[1, 1, 0], loaded=False):
|
|
1347
|
+
"""
|
|
1348
|
+
Sets a new color scheme and adds items for multiple images.
|
|
1349
|
+
"""
|
|
1350
|
+
# SUGGESTION: Add a guard clause for safety
|
|
1351
|
+
if info is None:
|
|
1352
|
+
return
|
|
1353
|
+
|
|
1354
|
+
if hasattr(self, 'tree_images'):
|
|
1355
|
+
parent = self.tree_images.model().sourceModel().invisibleRootItem()
|
|
1356
|
+
fileObj, index, index_view = info
|
|
1357
|
+
|
|
1358
|
+
# Determine the description string for the view
|
|
1359
|
+
if index >= 3:
|
|
1360
|
+
indc = f'View {index_view + 1} (seg)'
|
|
1361
|
+
else:
|
|
1362
|
+
indc = f'View {index_view + 1}'
|
|
1363
|
+
|
|
1364
|
+
color_255 = [int(c * 255) for c in color]
|
|
1365
|
+
|
|
1366
|
+
for file in fileObj[0]:
|
|
1367
|
+
if '*' in file:
|
|
1368
|
+
continue
|
|
1369
|
+
|
|
1370
|
+
# SUGGESTION: Use the clearer helper function
|
|
1371
|
+
if not _is_image_already_added(self, file, index_view):
|
|
1372
|
+
self.imported_images.append([[[file, fileObj[1], index_view], index], color, loaded, indc])
|
|
1373
|
+
else:
|
|
1374
|
+
# If it already exists, skip adding it to the tree
|
|
1375
|
+
continue
|
|
1376
|
+
|
|
1377
|
+
# --- Create Tree Items ---
|
|
1378
|
+
node1 = QtGui.QStandardItem(indc)
|
|
1379
|
+
node1.setForeground(QtGui.QBrush(QtGui.QColor(*color_255)))
|
|
1380
|
+
node1.setData(index_view)
|
|
1381
|
+
|
|
1382
|
+
# SUGGESTION: Set flags correctly to prevent the double-toggle bug
|
|
1383
|
+
# DO NOT include ItemIsUserCheckable
|
|
1384
|
+
node1.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsTristate)
|
|
1385
|
+
node1.setCheckable(True)
|
|
1386
|
+
node1.setFlags(node1.flags() & QtCore.Qt.ItemIsUserCheckable)
|
|
1387
|
+
|
|
1388
|
+
# Set initial check state
|
|
1389
|
+
node1.setCheckState(QtCore.Qt.Checked if loaded else QtCore.Qt.Unchecked)
|
|
1390
|
+
|
|
1391
|
+
descp = os.path.basename(file)
|
|
1392
|
+
node2 = QtGui.QStandardItem(descp)
|
|
1393
|
+
node2.setForeground(QtGui.QBrush(QtGui.QColor(*color_255)))
|
|
1394
|
+
# SUGGESTION: No need for flags on a non-checkable item
|
|
1395
|
+
# node2.setFlags(...)
|
|
1396
|
+
#node2.setFlags(node2.flags() | QtCore.Qt.ItemIsTristate)
|
|
1397
|
+
|
|
1398
|
+
parent.appendRow([node1, node2])
|
|
1399
|
+
|
|
1400
|
+
|
|
1401
|
+
def update_image_sch_to_remove(self, info=None, color = [1,1,0],loaded = False):
|
|
1262
1402
|
"""
|
|
1263
1403
|
SET new color scheme to read multiple images
|
|
1264
1404
|
Args:
|
|
@@ -1395,7 +1535,8 @@ def clean_parent_image2(self, filename, indc,index_view):
|
|
|
1395
1535
|
if signal.checkState() == Qt.Checked:
|
|
1396
1536
|
if signal.text() in indc:
|
|
1397
1537
|
try:
|
|
1398
|
-
self.tree_images.model().sourceModel().itemChanged.disconnect(self.changeImage)
|
|
1538
|
+
#self.tree_images.model().sourceModel().itemChanged.disconnect(self.changeImage)
|
|
1539
|
+
self.tree_images.clicked.disconnect(self.on_row_clicked_image)
|
|
1399
1540
|
except:
|
|
1400
1541
|
pass
|
|
1401
1542
|
signal.setCheckState(Qt.Unchecked)
|
|
@@ -1403,7 +1544,8 @@ def clean_parent_image2(self, filename, indc,index_view):
|
|
|
1403
1544
|
#if indc in info[0][1]:
|
|
1404
1545
|
indices.append(i)
|
|
1405
1546
|
try:
|
|
1406
|
-
self.tree_images.model().sourceModel().itemChanged.connect(self.changeImage)
|
|
1547
|
+
#self.tree_images.model().sourceModel().itemChanged.connect(self.changeImage)
|
|
1548
|
+
self.tree_images.clicked.connect(self.on_row_clicked_image)
|
|
1407
1549
|
except:
|
|
1408
1550
|
pass
|
|
1409
1551
|
for ind in indices:
|
|
@@ -1426,12 +1568,14 @@ def clean_parent_image(self, index_row, indc,index_view):
|
|
|
1426
1568
|
if signal.checkState() == Qt.Checked:
|
|
1427
1569
|
if signal.text() in indc:
|
|
1428
1570
|
try:
|
|
1429
|
-
self.tree_images.model().sourceModel().itemChanged.disconnect(self.changeImage)
|
|
1571
|
+
#self.tree_images.model().sourceModel().itemChanged.disconnect(self.changeImage)
|
|
1572
|
+
self.tree_images.clicked.disconnect(self.on_row_clicked_image)
|
|
1430
1573
|
except:
|
|
1431
1574
|
pass
|
|
1432
1575
|
signal.setCheckState(Qt.Unchecked)
|
|
1433
1576
|
try:
|
|
1434
|
-
self.tree_images.model().sourceModel().itemChanged.connect(self.changeImage)
|
|
1577
|
+
#self.tree_images.model().sourceModel().itemChanged.connect(self.changeImage)
|
|
1578
|
+
self.tree_images.clicked.connect(self.on_row_clicked_image)
|
|
1435
1579
|
except:
|
|
1436
1580
|
pass
|
|
1437
1581
|
|
|
@@ -1533,6 +1677,8 @@ def read_txt_color(file, mode ='lut', from_one= False):
|
|
|
1533
1677
|
|
|
1534
1678
|
#color_name = [l.split('\t')[0]+"_"+l.split('\t')[-1][1:-2] for l in lines[id:]]
|
|
1535
1679
|
#color_name = [[r for r in re.sub(r'\s+', ' ', l).split() if r != '' and r!='\n'][0] + "_"+' '.join([r.replace('"', '') for r in re.sub(r'\s+', ' ', l[:-1]).split() if r != '' and r!='\n'][indices_non_numeric]) for l in lines[id:] if l[0]!='#']
|
|
1680
|
+
lines = [l for l in lines if l.strip() and not l.strip().startswith('#')]
|
|
1681
|
+
id = 0
|
|
1536
1682
|
color_name = [[r for r in re.sub(r'\s+', ' ', l).split() if r != '' and r!='\n'][0] + "_"+"".join([r.replace('"', '') for r in re.sub(r'\s+', ' ', l[:-1]).split() if r != '' and r!='\n'][indices_non_numeric]) for l in lines[id:] if l[0]!='#']
|
|
1537
1683
|
indices_el = [int([r for r in re.sub(r'\s+', ' ', l).split() if r != '' and r != '\n'][0]) for l in lines[id:] if l[0] != '#']
|
|
1538
1684
|
color_index_rgb = np.array([[int(float(s)) for s in [r for r in re.sub(r'\s+', ' ', l).split() if r != '' and r != '\n'][index_colr_start:index_colr_end]] for l in
|
|
@@ -1675,29 +1821,29 @@ def vox2ref(affine, ref):
|
|
|
1675
1821
|
###################### Cursors ######################
|
|
1676
1822
|
|
|
1677
1823
|
def cursorOpenHand():
|
|
1678
|
-
bitmap = QtGui.QPixmap(
|
|
1824
|
+
bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/Hand.png")
|
|
1679
1825
|
return QtGui.QCursor(bitmap)
|
|
1680
1826
|
|
|
1681
1827
|
def cursorClosedHand():
|
|
1682
|
-
bitmap = QtGui.QPixmap(
|
|
1828
|
+
bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/Handsqueezed.png")
|
|
1683
1829
|
return QtGui.QCursor(bitmap)
|
|
1684
1830
|
def cursorZoomIn():
|
|
1685
|
-
bitmap = QtGui.QPixmap(
|
|
1831
|
+
bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/zoom_in.png")
|
|
1686
1832
|
return QtGui.QCursor(bitmap)
|
|
1687
1833
|
def cursorZoomOut():
|
|
1688
|
-
bitmap = QtGui.QPixmap(
|
|
1834
|
+
bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/zoom_out.png")
|
|
1689
1835
|
return QtGui.QCursor(bitmap)
|
|
1690
1836
|
def cursorRotate():
|
|
1691
|
-
bitmap = QtGui.QPixmap(
|
|
1837
|
+
bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/rotate.png")
|
|
1692
1838
|
return QtGui.QCursor(bitmap)
|
|
1693
1839
|
def cursorArrow():
|
|
1694
|
-
#bitmap = QtGui.QPixmap(
|
|
1840
|
+
#bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/arrow.png")
|
|
1695
1841
|
return QtGui.QCursor(Qt.ArrowCursor)
|
|
1696
1842
|
def cursorPaint():
|
|
1697
|
-
bitmap = QtGui.QPixmap(
|
|
1843
|
+
bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/HandwritingPlus.png")
|
|
1698
1844
|
return QtGui.QCursor(bitmap)
|
|
1699
1845
|
def cursorPaintX():
|
|
1700
|
-
bitmap = QtGui.QPixmap(
|
|
1846
|
+
bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/HandwritingPlusX.png")
|
|
1701
1847
|
return QtGui.QCursor(bitmap)
|
|
1702
1848
|
def cursorCircle(size = 50):
|
|
1703
1849
|
|
|
@@ -1731,10 +1877,10 @@ def cursorCircle(size = 50):
|
|
|
1731
1877
|
return QtGui.QCursor(pil_image_to_qpixmap(image))
|
|
1732
1878
|
|
|
1733
1879
|
def cursorErase():
|
|
1734
|
-
bitmap = QtGui.QPixmap(
|
|
1880
|
+
bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/HandwritingMinus.png")
|
|
1735
1881
|
return QtGui.QCursor(bitmap)
|
|
1736
1882
|
def cursorEraseX():
|
|
1737
|
-
bitmap = QtGui.QPixmap(
|
|
1883
|
+
bitmap = QtGui.QPixmap(settings.RESOURCE_DIR+"/HandwritingMinusX.png")
|
|
1738
1884
|
return QtGui.QCursor(bitmap)
|
|
1739
1885
|
|
|
1740
1886
|
###################### locate proper widgets ######################
|
|
@@ -3785,8 +3931,9 @@ def histogram_equalization(source):
|
|
|
3785
3931
|
import cv2
|
|
3786
3932
|
# Reshape the 3D image into a 2D array with shape (num_slices, height * width)
|
|
3787
3933
|
num_slices, height, width = image.shape
|
|
3934
|
+
image = normalize_mri(image)
|
|
3788
3935
|
flattened_image = image.reshape((num_slices, height * width))
|
|
3789
|
-
flattened_image = normalize_mri(flattened_image)
|
|
3936
|
+
#flattened_image = normalize_mri(flattened_image)
|
|
3790
3937
|
# Apply histogram equalization to the flattened image
|
|
3791
3938
|
if method=='ehist':
|
|
3792
3939
|
alg = cv2.equalizeHist
|