From f3f3c8f0548278d8c296ba9bd9bafe01a2c770a1 Mon Sep 17 00:00:00 2001 From: Laurent Guerard Date: Wed, 25 Mar 2026 11:54:30 +0100 Subject: [PATCH 1/2] Add options to segment_3d_image for removing objects touching borders --- src/imcflibs/imagej/objects3d.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/imcflibs/imagej/objects3d.py b/src/imcflibs/imagej/objects3d.py index ce514c70..1476c8ae 100644 --- a/src/imcflibs/imagej/objects3d.py +++ b/src/imcflibs/imagej/objects3d.py @@ -71,7 +71,15 @@ def imgplus_to_population3d(imp): return Objects3DPopulation(img) -def segment_3d_image(imp, title=None, min_thresh=1, min_vol=None, max_vol=None): +def segment_3d_image( + imp, + title=None, + min_thresh=1, + min_vol=None, + max_vol=None, + remove_touching_borders=False, + remove_touching_borders_z=False, +): """Segment a 3D binary image to get a labelled stack. Parameters @@ -90,6 +98,11 @@ def segment_3d_image(imp, title=None, min_thresh=1, min_vol=None, max_vol=None): max_vol : int, optional Maximum volume (in voxels) above which objects get filtered. Defaults to None. + remove_touching_borders : bool, optional + Whether to remove objects that touch the borders in X and Y. Defaults to False. + remove_touching_borders_z : bool, optional + Whether to remove objects that touch the z-axis borders. Defaults to False. + Returns ------- @@ -107,10 +120,15 @@ def segment_3d_image(imp, title=None, min_thresh=1, min_vol=None, max_vol=None): labeler.setMinSizeCalibrated(min_vol, img) if max_vol: labeler.setMaxSizeCalibrated(max_vol, img) - # Generate labelled segmentation seg = labeler.getLabels(img) seg.setScale(cal.pixelWidth, cal.pixelDepth, cal.getUnits()) + + if remove_touching_borders: + obj = seg.getObjects3DPopulation() + obj.removeObjectsTouchingBorders(seg, remove_touching_borders_z) + seg = ImageHandler.wrap(population3d_to_imgplus(imp, obj)) + if title: seg.setTitle(title) From 0eab3ddd4721d79a86a7d14321d77fbbf3c8dad5 Mon Sep 17 00:00:00 2001 From: Laurent Guerard Date: Thu, 26 Mar 2026 11:28:44 +0100 Subject: [PATCH 2/2] Refactor segment_3d_image to use RemoveBorderLabelsPlugin for borders filtering --- src/imcflibs/imagej/objects3d.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/imcflibs/imagej/objects3d.py b/src/imcflibs/imagej/objects3d.py index 1476c8ae..1c58cabe 100644 --- a/src/imcflibs/imagej/objects3d.py +++ b/src/imcflibs/imagej/objects3d.py @@ -8,6 +8,7 @@ from de.mpicbg.scf.imgtools.image.create.image import ImageCreationUtilities from de.mpicbg.scf.imgtools.image.create.labelmap import WatershedLabeling from ij import IJ +from inra.ijpb.plugins import RemoveBorderLabelsPlugin from mcib3d.geom import Objects3DPopulation from mcib3d.image3d import ImageHandler, ImageLabeller from mcib3d.image3d.processing import MaximaFinder @@ -124,15 +125,20 @@ def segment_3d_image( seg = labeler.getLabels(img) seg.setScale(cal.pixelWidth, cal.pixelDepth, cal.getUnits()) - if remove_touching_borders: - obj = seg.getObjects3DPopulation() - obj.removeObjectsTouchingBorders(seg, remove_touching_borders_z) - seg = ImageHandler.wrap(population3d_to_imgplus(imp, obj)) + seg = RemoveBorderLabelsPlugin().remove( + seg.getImagePlus(), + remove_touching_borders, + remove_touching_borders, + remove_touching_borders, + remove_touching_borders, + remove_touching_borders_z, + remove_touching_borders_z, + ) if title: seg.setTitle(title) - return seg.getImagePlus() + return seg def maxima_finder_3d(imp, min_threshold=0, noise=100, rxy=1.5, rz=1.5):