diff --git a/poetry.lock b/poetry.lock index a8994b27..9b0cf3b1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -137,13 +137,13 @@ test = ["pytest (>=6)"] [[package]] name = "imcf-fiji-mocks" -version = "0.13.0" +version = "0.14.0" description = "Mocks collection for Fiji-Python. Zero functional code." optional = false python-versions = ">=2.7" files = [ - {file = "imcf_fiji_mocks-0.13.0-py2.py3-none-any.whl", hash = "sha256:cb6be2b4af480a9340d182c2bccff78f996c0048abbf05380e214a91a2f89bf2"}, - {file = "imcf_fiji_mocks-0.13.0.tar.gz", hash = "sha256:c29f2dc82a0d4e94963a9f7a455f17012ee37aa8eda4d1c9e9565496df50b063"}, + {file = "imcf_fiji_mocks-0.14.0-py2.py3-none-any.whl", hash = "sha256:df50de4e6eb9ba9b2134b67da949f88a74b0e4129824bee37425a72c4a3c4829"}, + {file = "imcf_fiji_mocks-0.14.0.tar.gz", hash = "sha256:2c297a0a24e8e48b05772acb739bb3c57d5621ae3bd40dad37370d033aff1a7b"}, ] [[package]] @@ -345,4 +345,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10" -content-hash = "f42e21607d534dc04b7be746639e9ed07e70c2ca736844b023b61598df369638" +content-hash = "c97e2a509e4d74b95df8d58a80c5dd69787a34099243c0b6fb5ce7d333404aad" diff --git a/pyproject.toml b/pyproject.toml index a5363034..aeeaff78 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,8 @@ version = "0.0.0" # - or: python = ">=3.10" [tool.poetry.dependencies] -imcf-fiji-mocks = ">=0.13.0" +# IMPORTANT: see the "poetry.lock.md" file when changing dependencies!!! +imcf-fiji-mocks = ">=0.14.0" python = ">=2.7" python-micrometa = "^15.2.3" sjlogging = ">=0.5.2" @@ -54,3 +55,9 @@ ignore = [ [tool.ruff.lint.pydocstyle] convention = "numpy" + +[tool.coverage.report] +exclude_also = [ + 'no-cover:jython-only', + 'cover:jython', +] diff --git a/src/imcflibs/imagej/objects3d.py b/src/imcflibs/imagej/objects3d.py index ce514c70..37583767 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 @@ -71,7 +72,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, +): # cover:jython """Segment a 3D binary image to get a labelled stack. Parameters @@ -90,6 +99,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,14 +121,24 @@ 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()) + + 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): diff --git a/tests/test_objects3d.py b/tests/test_objects3d.py new file mode 100644 index 00000000..a78725e4 --- /dev/null +++ b/tests/test_objects3d.py @@ -0,0 +1,12 @@ +"""Tests for the imcflibs.imagej.objects3d module.""" + +from imcflibs.imagej.objects3d import imgplus_to_population3d +from imcflibs.imagej.objects3d import maxima_finder_3d +from imcflibs.imagej.objects3d import population3d_to_imgplus +from imcflibs.imagej.objects3d import seeded_watershed +from imcflibs.imagej.objects3d import segment_3d_image + + +def test_mock_imports(): + """Test if the mock imports work fine.""" + assert True