From 3f65512f2bcd63cd59f3bd9c2bafb36bdf502044 Mon Sep 17 00:00:00 2001 From: Jianxu Chen Date: Mon, 16 Mar 2026 08:21:24 +0100 Subject: [PATCH 1/3] build: add ruff config and lint integration --- Makefile | 1 + pyproject.toml | 10 +++++++++- setup.py | 1 + tox.ini | 1 + 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ffc58abe..790efb6d 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,7 @@ test: ## run pytest with coverage report pytest --cov=aicssegmentation --cov-report xml --cov-report term lint: ## run a lint check / report + ruff check aicssegmentation flake8 aicssegmentation --count --verbose --show-source --statistics black --check --exclude vendor aicssegmentation diff --git a/pyproject.toml b/pyproject.toml index e34796ec..b6c4101b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,2 +1,10 @@ [tool.black] -line-length = 120 \ No newline at end of file +line-length = 120 + +[tool.ruff] +line-length = 120 +target-version = "py39" + +[tool.ruff.lint] +select = ["E", "F", "W", "I"] +ignore = ["E203", "W291", "W503", "W293", "E261"] \ No newline at end of file diff --git a/setup.py b/setup.py index 61ff1c26..c886ecd8 100644 --- a/setup.py +++ b/setup.py @@ -20,6 +20,7 @@ "pytest>=7.1.1", "pytest-cov>=2.9.0", "pytest-raises>=0.11", + "ruff>=0.6.0", "napari", ] diff --git a/tox.ini b/tox.ini index 50d84e93..e7c160ca 100644 --- a/tox.ini +++ b/tox.ini @@ -6,6 +6,7 @@ envlist = py37, py38, lint deps = .[test] commands = + ruff check aicssegmentation flake8 aicssegmentation --count --verbose --show-source --statistics black --check aicssegmentation From 36c5139730960086b58cd4ba48b0d05df70ec6d6 Mon Sep 17 00:00:00 2001 From: Jianxu Chen Date: Tue, 17 Mar 2026 09:43:00 +0100 Subject: [PATCH 2/3] phase 1: typing, validation, logging across all core modules (#1) typing, validation, logging, linting and formating across all core modules --- .github/workflows/test-and-lint.yml | 3 + aicssegmentation/bin/batch_processing.py | 11 ++- aicssegmentation/core/MO_threshold.py | 13 ++- aicssegmentation/core/__init__.py | 97 +++++++++++++++++++ aicssegmentation/core/hessian.py | 12 +-- aicssegmentation/core/output_utils.py | 19 +++- aicssegmentation/core/pre_processing_utils.py | 76 +++++++++------ aicssegmentation/core/seg_dot.py | 45 +++++---- aicssegmentation/core/utils.py | 43 +++----- aicssegmentation/core/vessel.py | 57 ++++++----- aicssegmentation/core/visual.py | 24 +++-- .../structure_wrapper/seg_PCNA_earlyS_midS.py | 22 ++--- .../structure_wrapper/seg_PCNA_lateS.py | 22 ++--- .../seg_PCNA_lateS_hole_fill.py | 22 ++--- .../structure_wrapper/seg_actb.py | 18 ++-- .../structure_wrapper/seg_actn1.py | 18 ++-- .../structure_wrapper/seg_atp2a2.py | 20 ++-- .../structure_wrapper/seg_cardio_actn2.py | 18 ++-- .../structure_wrapper/seg_cardio_atp2a2.py | 18 ++-- .../structure_wrapper/seg_cardio_fbl.py | 22 +++-- .../structure_wrapper/seg_cardio_fbl_100x.py | 22 +++-- .../structure_wrapper/seg_cardio_myl7.py | 18 ++-- .../structure_wrapper/seg_cardio_npm1.py | 24 ++--- .../structure_wrapper/seg_cardio_npm1_100x.py | 24 ++--- .../structure_wrapper/seg_cardio_tnni1.py | 20 ++-- .../structure_wrapper/seg_cardio_ttn.py | 18 ++-- .../structure_wrapper/seg_cetn2.py | 23 ++--- .../structure_wrapper/seg_ctnnb1.py | 18 ++-- .../structure_wrapper/seg_drug_npm1.py | 23 ++--- aicssegmentation/structure_wrapper/seg_dsp.py | 23 +++-- aicssegmentation/structure_wrapper/seg_fbl.py | 22 +++-- .../seg_fbl_labelfree_4dn.py | 21 ++-- .../structure_wrapper/seg_gja1.py | 18 ++-- .../structure_wrapper/seg_h2b_interphase.py | 20 ++-- .../structure_wrapper/seg_lamp1.py | 24 ++--- .../structure_wrapper/seg_lmnb1_interphase.py | 26 ++--- .../structure_wrapper/seg_lmnb1_mitotic.py | 22 +++-- .../structure_wrapper/seg_myh10.py | 18 ++-- .../structure_wrapper/seg_npm1.py | 24 ++--- .../structure_wrapper/seg_npm1_SR.py | 24 ++--- .../seg_npm_labelfree_4dn.py | 21 ++-- .../structure_wrapper/seg_nup153.py | 18 ++-- .../structure_wrapper/seg_polr2a.py | 22 ++--- .../structure_wrapper/seg_polr2a_blob.py | 23 +++-- aicssegmentation/structure_wrapper/seg_pxn.py | 20 ++-- .../structure_wrapper/seg_rab5a.py | 18 ++-- .../structure_wrapper/seg_sec61b.py | 20 ++-- .../structure_wrapper/seg_sec61b_dual.py | 20 ++-- .../structure_wrapper/seg_slc25a17.py | 25 ++--- .../structure_wrapper/seg_smc1a.py | 20 ++-- aicssegmentation/structure_wrapper/seg_son.py | 19 ++-- .../structure_wrapper/seg_st6gal1.py | 24 ++--- .../structure_wrapper/seg_terf2.py | 19 ++-- .../structure_wrapper/seg_tjp1.py | 18 ++-- .../structure_wrapper/seg_tomm20.py | 18 ++-- .../structure_wrapper/seg_tuba1b.py | 20 ++-- .../structure_wrapper/seg_ubtf.py | 22 +++-- .../structure_wrapper/structure_segmenter.py | 1 + aicssegmentation/tests/conftest.py | 4 +- aicssegmentation/tests/test_config.py | 1 + aicssegmentation/tests/test_structures.py | 4 +- .../tests/workflow/mock_module.py | 1 + .../tests/workflow/test_all_workflows.py | 4 +- .../tests/workflow/test_batch_workflow.py | 9 +- .../tests/workflow/test_workflow.py | 2 +- .../tests/workflow/test_workflow_config.py | 14 +-- .../workflow/test_workflow_definition.py | 1 + .../tests/workflow/test_workflow_engine.py | 13 +-- .../tests/workflow/test_workflow_step.py | 6 +- aicssegmentation/util/directories.py | 4 +- aicssegmentation/workflow/batch_workflow.py | 10 +- .../workflow/segmenter_function.py | 2 +- aicssegmentation/workflow/workflow.py | 10 +- aicssegmentation/workflow/workflow_config.py | 7 +- .../workflow/workflow_definition.py | 10 +- aicssegmentation/workflow/workflow_engine.py | 10 +- aicssegmentation/workflow/workflow_step.py | 7 +- pyproject.toml | 2 +- 78 files changed, 856 insertions(+), 625 deletions(-) diff --git a/.github/workflows/test-and-lint.yml b/.github/workflows/test-and-lint.yml index 8b9717f9..d21b7fd0 100644 --- a/.github/workflows/test-and-lint.yml +++ b/.github/workflows/test-and-lint.yml @@ -37,6 +37,9 @@ jobs: run: | python -m pip install --upgrade pip pip install .[test] --verbose + - name: Lint with Ruff + run: | + ruff check aicssegmentation - name: Lint with flake8 run: | flake8 aicssegmentation --count --verbose --show-source --statistics diff --git a/aicssegmentation/bin/batch_processing.py b/aicssegmentation/bin/batch_processing.py index 6c91a958..8962a603 100644 --- a/aicssegmentation/bin/batch_processing.py +++ b/aicssegmentation/bin/batch_processing.py @@ -1,16 +1,17 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import numpy as np -import os -import sys -import logging import argparse -import traceback import importlib +import logging +import os import pathlib +import sys +import traceback from glob import glob + import aicsimageio +import numpy as np ############################################################################### # Global Objects diff --git a/aicssegmentation/core/MO_threshold.py b/aicssegmentation/core/MO_threshold.py index 908d34f7..da4506fb 100644 --- a/aicssegmentation/core/MO_threshold.py +++ b/aicssegmentation/core/MO_threshold.py @@ -1,7 +1,9 @@ +from typing import Tuple, Union + import numpy as np -from skimage.morphology import remove_small_objects, ball, dilation -from skimage.filters import threshold_triangle, threshold_otsu +from skimage.filters import threshold_otsu, threshold_triangle from skimage.measure import label +from skimage.morphology import ball, dilation, remove_small_objects def MO_low_level( @@ -47,6 +49,11 @@ def MO_low_level( global_tri = threshold_triangle(structure_img_smooth) global_median = np.percentile(structure_img_smooth, 50) th_low_level = (global_tri + global_median) / 2 + else: + raise ValueError( + f"Unsupported global_thresh_method {global_thresh_method!r}. " + "Valid options: 'tri', 'triangle', 'med', 'median', 'ave', 'ave_tri_med'." + ) bw_low_level = structure_img_smooth > th_low_level bw_low_level = remove_small_objects(bw_low_level, min_size=object_minArea, connectivity=1, out=bw_low_level) @@ -115,7 +122,7 @@ def MO( local_adjust: float = 0.98, return_object: bool = False, dilate: bool = False, -): +) -> Union[Tuple[np.ndarray, np.ndarray], np.ndarray]: """ Implementation of "Masked Object Thresholding" algorithm. Specifically, the algorithm is a hybrid thresholding method combining two levels of thresholds. diff --git a/aicssegmentation/core/__init__.py b/aicssegmentation/core/__init__.py index e69de29b..f4fce7a2 100644 --- a/aicssegmentation/core/__init__.py +++ b/aicssegmentation/core/__init__.py @@ -0,0 +1,97 @@ +"""aicssegmentation.core — image processing primitives. + +Public re-exports allow callers to do:: + + from aicssegmentation.core import intensity_normalization, filament_3d_wrapper +""" + +from .hessian import absolute_3d_hessian_eigenvalues, compute_3d_hessian_matrix +from .MO_threshold import MO, MO_high_level, MO_low_level +from .output_utils import generate_segmentation_contour, output_hook, save_segmentation +from .pre_processing_utils import ( + edge_preserving_smoothing_3d, + image_smoothing_gaussian_3d, + image_smoothing_gaussian_slice_by_slice, + intensity_normalization, + suggest_normalization_param, +) +from .seg_dot import dot_2d_slice_by_slice_wrapper, dot_3d_wrapper +from .utils import ( + absolute_eigenvaluesh, + cell_local_adaptive_threshold, + divide_nonzero, + get_3dseed_from_mid_frame, + get_middle_frame, + get_seed_for_objects, + histogram_otsu, + hole_filling, + peak_local_max_wrapper, + prune_z_slices, + remove_hot_pixel, + remove_index_object, + segmentation_intersection, + segmentation_union, + segmentation_xor, + size_filter, + sortbyabs, + topology_preserving_thinning, + watershed_wrapper, +) +from .vessel import ( + filament_2d_wrapper, + filament_3d_wrapper, + vesselness2D, + vesselness2D_single_slice, + vesselness3D, + vesselnessSliceBySlice, +) + +__all__ = [ + # hessian + "absolute_3d_hessian_eigenvalues", + "compute_3d_hessian_matrix", + # MO threshold + "MO", + "MO_high_level", + "MO_low_level", + # output + "generate_segmentation_contour", + "output_hook", + "save_segmentation", + # pre-processing + "edge_preserving_smoothing_3d", + "image_smoothing_gaussian_3d", + "image_smoothing_gaussian_slice_by_slice", + "intensity_normalization", + "suggest_normalization_param", + # spot / dot filters + "dot_2d_slice_by_slice_wrapper", + "dot_3d_wrapper", + # utilities + "absolute_eigenvaluesh", + "cell_local_adaptive_threshold", + "divide_nonzero", + "get_3dseed_from_mid_frame", + "get_middle_frame", + "get_seed_for_objects", + "histogram_otsu", + "hole_filling", + "peak_local_max_wrapper", + "prune_z_slices", + "remove_hot_pixel", + "remove_index_object", + "segmentation_intersection", + "segmentation_union", + "segmentation_xor", + "size_filter", + "sortbyabs", + "topology_preserving_thinning", + "watershed_wrapper", + # vessel / filament filters + "filament_2d_wrapper", + "filament_3d_wrapper", + "vesselness2D", + "vesselness2D_single_slice", + "vesselness3D", + "vesselnessSliceBySlice", +] diff --git a/aicssegmentation/core/hessian.py b/aicssegmentation/core/hessian.py index 1e65ce93..142dcbd1 100644 --- a/aicssegmentation/core/hessian.py +++ b/aicssegmentation/core/hessian.py @@ -1,4 +1,5 @@ from itertools import combinations_with_replacement +from typing import List import numpy as np from scipy import ndimage as ndi @@ -21,11 +22,11 @@ def compute_3d_hessian_matrix( nd_array: np.ndarray nd array from which to compute the hessian matrix. sigma: float - Standard deviation used for the Gaussian kernel to smooth the array. Defaul is 1 + Standard deviation used for the Gaussian kernel to smooth the array. Default is 1 scale: bool whether the hessian elements will be scaled by sigma squared. Default is True whiteonblack: boolean - image is white objects on black blackground or not. Default is True + image is white objects on black background or not. Default is True Return: @@ -54,7 +55,6 @@ def compute_3d_hessian_matrix( # create hessian matrix from hessian elements hessian_full = [[()] * ndim for x in range(ndim)] - # hessian_full = [[None] * ndim] * ndim for index, (ax0, ax1) in enumerate(combinations_with_replacement(range(ndim), 2)): element = hessian_elements[index] @@ -76,7 +76,7 @@ def absolute_3d_hessian_eigenvalues( sigma: float = 1, scale: bool = True, whiteonblack: bool = True, -): +) -> List[np.ndarray]: """ Eigenvalues of the hessian matrix calculated from the input array sorted by absolute value. @@ -86,11 +86,11 @@ def absolute_3d_hessian_eigenvalues( nd_array: np.ndarray nd array from which to compute the hessian matrix. sigma: float - Standard deviation used for the Gaussian kernel to smooth the array. Defaul is 1 + Standard deviation used for the Gaussian kernel to smooth the array. Default is 1 scale: bool whether the hessian elements will be scaled by sigma squared. Default is True whiteonblack: boolean - image is white objects on black blackground or not. Default is True + image is white objects on black background or not. Default is True Return: ------------ diff --git a/aicssegmentation/core/output_utils.py b/aicssegmentation/core/output_utils.py index 865ac7c6..23370708 100644 --- a/aicssegmentation/core/output_utils.py +++ b/aicssegmentation/core/output_utils.py @@ -1,7 +1,9 @@ from pathlib import Path +from typing import Sequence + import numpy as np -from skimage.morphology import erosion, ball from aicsimageio.writers import OmeTiffWriter +from skimage.morphology import ball, erosion def save_segmentation( @@ -10,7 +12,7 @@ def save_segmentation( output_path: Path, fn: str, suffix: str = "_struct_segmentation", -): +) -> None: """save the segmentation into a tiff file Parameters: @@ -37,7 +39,7 @@ def save_segmentation( OmeTiffWriter.save(data=bd, uri=out_fn, dim_order="ZYX") -def generate_segmentation_contour(im): +def generate_segmentation_contour(im: np.ndarray) -> np.ndarray: """generate the contour of the segmentation""" bd = np.logical_xor(erosion(im > 0, footprint=ball(1)), im > 0) @@ -48,9 +50,16 @@ def generate_segmentation_contour(im): return bd -def output_hook(im, names, out_flag, output_path, fn): +def output_hook( + im: Sequence[np.ndarray], + names: Sequence[str], + out_flag: Sequence[bool], + output_path: Path, + fn: str, +) -> None: """general hook for cutomized output""" - assert len(im) == len(names) and len(names) == len(out_flag) + if not (len(im) == len(names) == len(out_flag)): + raise ValueError("im, names, and out_flag must have the same length") for i in range(len(out_flag)): if out_flag[i]: diff --git a/aicssegmentation/core/pre_processing_utils.py b/aicssegmentation/core/pre_processing_utils.py index a8be1b46..cacac3af 100644 --- a/aicssegmentation/core/pre_processing_utils.py +++ b/aicssegmentation/core/pre_processing_utils.py @@ -1,10 +1,19 @@ -import numpy as np +import logging from typing import List -from scipy.stats import norm + +import numpy as np from scipy.ndimage import gaussian_filter +from scipy.stats import norm +try: + import itk +except ImportError: + itk = None -def intensity_normalization(struct_img: np.ndarray, scaling_param: List): +logger = logging.getLogger(__name__) + + +def intensity_normalization(struct_img: np.ndarray, scaling_param: List) -> np.ndarray: """Normalize the intensity of input image so that the value range is from 0 to 1. Parameters: @@ -27,13 +36,14 @@ def intensity_normalization(struct_img: np.ndarray, scaling_param: List): Auto-contrast normalization. Similat to above case, but only intensity value between c and d will be used to calculated mean and std. """ - assert len(scaling_param) > 0 + if not scaling_param: + raise ValueError("scaling_param must not be empty") if len(scaling_param) == 1: if scaling_param[0] < 1: - print("intensity normalization: min-max normalization with NO absolute" + "intensity upper bound") + logger.info("intensity normalization: min-max normalization with NO absolute intensity upper bound") else: - print(f"intensity norm: min-max norm with upper bound {scaling_param[0]}") + logger.info(f"intensity norm: min-max norm with upper bound {scaling_param[0]}") struct_img[struct_img > scaling_param[0]] = struct_img.min() strech_min = struct_img.min() strech_max = struct_img.max() @@ -45,24 +55,27 @@ def intensity_normalization(struct_img: np.ndarray, scaling_param: List): struct_img[struct_img < strech_min] = strech_min elif len(scaling_param) == 4: img_valid = struct_img[np.logical_and(struct_img > scaling_param[2], struct_img < scaling_param[3])] - assert ( - img_valid.size > 0 - ), f"Adjust intensity normalization parameters {scaling_param[2]} and {scaling_param[3]} to include the image with range {struct_img.min()}:{struct_img.max()}" # noqa: E501 + if img_valid.size == 0: + raise ValueError( + f"Adjust intensity normalization parameters {scaling_param[2]} and {scaling_param[3]} " + f"to include the image with range {struct_img.min()}:{struct_img.max()}" + ) m, s = norm.fit(img_valid.flat) strech_min = max(scaling_param[2] - scaling_param[0] * s, struct_img.min()) strech_max = min(scaling_param[3] + scaling_param[1] * s, struct_img.max()) struct_img[struct_img > strech_max] = strech_max struct_img[struct_img < strech_min] = strech_min - assert ( - strech_min <= strech_max - ), f"Please adjust intensity normalization parameters so that {strech_min}<={strech_max}" + if strech_min > strech_max: + raise ValueError( + f"Please adjust intensity normalization parameters so that {strech_min}<={strech_max}" + ) struct_img = (struct_img - strech_min + 1e-8) / (strech_max - strech_min + 1e-8) # print('intensity normalization completes') return struct_img -def image_smoothing_gaussian_3d(struct_img, sigma, truncate_range=3.0): +def image_smoothing_gaussian_3d(struct_img: np.ndarray, sigma: float, truncate_range: float = 3.0) -> np.ndarray: """ wrapper for 3D Guassian smoothing """ @@ -72,7 +85,9 @@ def image_smoothing_gaussian_3d(struct_img, sigma, truncate_range=3.0): return structure_img_smooth -def image_smoothing_gaussian_slice_by_slice(struct_img, sigma, truncate_range=3.0): +def image_smoothing_gaussian_slice_by_slice( + struct_img: np.ndarray, sigma: float, truncate_range: float = 3.0 +) -> np.ndarray: """ wrapper for applying 2D Guassian smoothing slice by slice on a 3D image """ @@ -90,8 +105,8 @@ def edge_preserving_smoothing_3d( numberOfIterations: int = 10, conductance: float = 1.2, timeStep: float = 0.0625, - spacing: List = [1, 1, 1], -): + spacing: List[float] = [1, 1, 1], +) -> np.ndarray: """perform edge preserving smoothing on a 3D image Parameters: @@ -111,7 +126,10 @@ def edge_preserving_smoothing_3d( ------------- https://itk.org/Doxygen/html/classitk_1_1GradientAnisotropicDiffusionImageFilter.html """ - import itk + if itk is None: + raise ImportError( + "itk is required for edge_preserving_smoothing_3d. Install it with: pip install itk" + ) itk_img = itk.GetImageFromArray(struct_img.astype(np.float32)) @@ -131,46 +149,46 @@ def edge_preserving_smoothing_3d( return img_smooth_ag -def suggest_normalization_param(structure_img0): +def suggest_normalization_param(structure_img0: np.ndarray) -> None: """ suggest scaling parameter assuming the image is a representative example of this cell structure """ m, s = norm.fit(structure_img0.flat) - print(f"mean intensity of the stack: {m}") - print(f"the standard deviation of intensity of the stack: {s}") + logger.info(f"mean intensity of the stack: {m}") + logger.info(f"the standard deviation of intensity of the stack: {s}") p99 = np.percentile(structure_img0, 99.99) - print(f"0.9999 percentile of the stack intensity is: {p99}") + logger.info(f"0.9999 percentile of the stack intensity is: {p99}") pmin = structure_img0.min() - print(f"minimum intensity of the stack: {pmin}") + logger.info(f"minimum intensity of the stack: {pmin}") pmax = structure_img0.max() - print(f"maximum intensity of the stack: {pmax}") + logger.info(f"maximum intensity of the stack: {pmax}") up_ratio = 0 for up_i in np.arange(0.5, 1000, 0.5): if m + s * up_i > p99: if m + s * up_i > pmax: - print(f"suggested upper range is {up_i-0.5}, which is {m+s*(up_i-0.5)}") + logger.info(f"suggested upper range is {up_i-0.5}, which is {m+s*(up_i-0.5)}") up_ratio = up_i - 0.5 else: - print(f"suggested upper range is {up_i}, which is {m+s*up_i}") + logger.info(f"suggested upper range is {up_i}, which is {m+s*up_i}") up_ratio = up_i break low_ratio = 0 for low_i in np.arange(0.5, 1000, 0.5): if m - s * low_i < pmin: - print(f"suggested lower range is {low_i-0.5}, which is {m-s*(low_i-0.5)}") + logger.info(f"suggested lower range is {low_i-0.5}, which is {m-s*(low_i-0.5)}") low_ratio = low_i - 0.5 break - print(f"So, suggested parameter for normalization is [{low_ratio}, {up_ratio}]") - print( + logger.info(f"So, suggested parameter for normalization is [{low_ratio}, {up_ratio}]") + logger.info( "To further enhance the contrast: You may increase the first value " + "(may loss some dim parts), or decrease the second value" + "(may loss some texture in super bright regions)" ) - print("To slightly reduce the contrast: You may decrease the first value, or " + "increase the second value") + logger.info("To slightly reduce the contrast: You may decrease the first value, or " + "increase the second value") diff --git a/aicssegmentation/core/seg_dot.py b/aicssegmentation/core/seg_dot.py index 32c2ce23..d566bafd 100644 --- a/aicssegmentation/core/seg_dot.py +++ b/aicssegmentation/core/seg_dot.py @@ -1,9 +1,10 @@ +from typing import Sequence + import numpy as np -from typing import List from scipy.ndimage import gaussian_laplace -def dot_3d(struct_img: np.ndarray, log_sigma: float, cutoff=-1): +def dot_3d(struct_img: np.ndarray, log_sigma: float, cutoff: float = -1) -> np.ndarray: """apply 3D spot filter on a 3D image Parameters: @@ -19,15 +20,17 @@ def dot_3d(struct_img: np.ndarray, log_sigma: float, cutoff=-1): the cutoff value to apply on the filter result. If the cutoff is negative, no cutoff will be applied. Default is -1 """ - assert len(struct_img.shape) == 3 - responce = -1 * (log_sigma**2) * gaussian_laplace(struct_img, log_sigma) + if struct_img.ndim != 3: + raise ValueError("dot_3d expects a 3D image") + + response = -1 * (log_sigma**2) * gaussian_laplace(struct_img, log_sigma) if cutoff < 0: - return responce + return response else: - return responce > cutoff + return response > cutoff -def dot_2d(struct_img, log_sigma, cutoff=-1): +def dot_2d(struct_img: np.ndarray, log_sigma: float, cutoff: float = -1) -> np.ndarray: """apply 2D spot filter on a 2D image Parameters: @@ -43,15 +46,17 @@ def dot_2d(struct_img, log_sigma, cutoff=-1): the cutoff value to apply on the filter result. If the cutoff is negative, no cutoff will be applied. Default is -1 """ - assert len(struct_img.shape) == 2 - responce = -1 * (log_sigma**2) * gaussian_laplace(struct_img, log_sigma) + if struct_img.ndim != 2: + raise ValueError("dot_2d expects a 2D image") + + response = -1 * (log_sigma**2) * gaussian_laplace(struct_img, log_sigma) if cutoff < 0: - return responce + return response else: - return responce > cutoff + return response > cutoff -def dot_3d_wrapper(struct_img: np.ndarray, s3_param: List): +def dot_3d_wrapper(struct_img: np.ndarray, s3_param: Sequence[Sequence[float]]) -> np.ndarray: """wrapper for 3D spot filter Parameters: @@ -73,12 +78,12 @@ def dot_3d_wrapper(struct_img: np.ndarray, s3_param: List): bw = np.zeros(struct_img.shape, dtype=bool) for fid in range(len(s3_param)): log_sigma = s3_param[fid][0] - responce = -1 * (log_sigma**2) * gaussian_laplace(struct_img, log_sigma) - bw = np.logical_or(bw, responce > s3_param[fid][1]) + response = -1 * (log_sigma**2) * gaussian_laplace(struct_img, log_sigma) + bw = np.logical_or(bw, response > s3_param[fid][1]) return bw -def logSlice(image: np.ndarray, sigma_list: List, threshold: float): +def logSlice(image: np.ndarray, sigma_list: Sequence[float], threshold: float) -> np.ndarray: """apply multi-scale 2D spot filter on a 2D image and binarize with threshold Parameters: @@ -101,7 +106,7 @@ def logSlice(image: np.ndarray, sigma_list: List, threshold: float): return seg -def dot_slice_by_slice(struct_img: np.ndarray, log_sigma: float, cutoff=-1): +def dot_slice_by_slice(struct_img: np.ndarray, log_sigma: float, cutoff: float = -1) -> np.ndarray: """apply 2D spot filter on 3D image slice by slice Parameters: @@ -127,7 +132,7 @@ def dot_slice_by_slice(struct_img: np.ndarray, log_sigma: float, cutoff=-1): return res > cutoff -def dot_2d_slice_by_slice_wrapper(struct_img: np.ndarray, s2_param: List): +def dot_2d_slice_by_slice_wrapper(struct_img: np.ndarray, s2_param: Sequence[Sequence[float]]) -> np.ndarray: """wrapper for 2D spot filter on 3D image slice by slice Parameters: @@ -149,8 +154,8 @@ def dot_2d_slice_by_slice_wrapper(struct_img: np.ndarray, s2_param: List): bw = np.zeros(struct_img.shape, dtype=bool) for fid in range(len(s2_param)): log_sigma = s2_param[fid][0] - responce = np.zeros_like(struct_img) + response = np.zeros_like(struct_img) for zz in range(struct_img.shape[0]): - responce[zz, :, :] = -1 * (log_sigma**2) * gaussian_laplace(struct_img[zz, :, :], log_sigma) - bw = np.logical_or(bw, responce > s2_param[fid][1]) + response[zz, :, :] = -1 * (log_sigma**2) * gaussian_laplace(struct_img[zz, :, :], log_sigma) + bw = np.logical_or(bw, response > s2_param[fid][1]) return bw diff --git a/aicssegmentation/core/utils.py b/aicssegmentation/core/utils.py index 60d22819..12c728b9 100644 --- a/aicssegmentation/core/utils.py +++ b/aicssegmentation/core/utils.py @@ -2,8 +2,11 @@ import numpy as np from scipy.ndimage import distance_transform_edt +from skimage.feature import peak_local_max +from skimage.filters import threshold_otsu, threshold_triangle from skimage.measure import label, regionprops -from skimage.morphology import ball, disk, dilation, erosion, medial_axis, remove_small_objects +from skimage.morphology import ball, dilation, disk, erosion, medial_axis, remove_small_objects +from skimage.segmentation import watershed def hole_filling(bw: np.ndarray, hole_min: int, hole_max: int, fill_2d: bool = True) -> np.ndarray: @@ -62,13 +65,12 @@ def hole_filling(bw: np.ndarray, hole_min: int, hole_max: int, fill_2d: bool = T too_small_mask = too_small[background_lab] fill_out[too_small_mask] = 0 else: - print("error in image shape") - return + raise ValueError("hole_filling expects a 2D or 3D image") return np.logical_or(bw, fill_out) -def size_filter(img: np.ndarray, min_size: int, method: str = "3D", connectivity: int = 1): +def size_filter(img: np.ndarray, min_size: int, method: str = "3D", connectivity: int = 1) -> np.ndarray: """size filter Parameters: @@ -82,7 +84,8 @@ def size_filter(img: np.ndarray, min_size: int, method: str = "3D", connectivity connnectivity: int the connectivity to use when computing object size """ - assert len(img.shape) == 3, "image has to be 3D" + if len(img.shape) != 3: + raise ValueError("size_filter expects a 3D image") if method == "3D": return remove_small_objects(img > 0, min_size=min_size, connectivity=connectivity) elif method == "slice_by_slice": @@ -241,15 +244,14 @@ def get_middle_frame(struct_img: np.ndarray, method: str = "z") -> int: mid_frame = struct_img.shape[0] // 2 else: - print("unsupported method") - quit() + raise ValueError(f"unsupported method {method!r}") return mid_frame def get_3dseed_from_mid_frame( bw: np.ndarray, - stack_shape: List = None, + stack_shape: List[int] = None, mid_frame: int = -1, hole_min: int = 1, bg_seed: bool = True, @@ -273,8 +275,6 @@ def get_3dseed_from_mid_frame( bg_seed=True will add a background seed at the first frame (z=0). """ - from skimage.morphology import remove_small_objects - out = remove_small_objects(bw > 0, hole_min) out1 = label(out) @@ -300,7 +300,8 @@ def remove_hot_pixel(seg: np.ndarray) -> np.ndarray: remove hot pixel from segmentation """ - assert len(seg.shape) == 3, "input segmentation must be 3D" + if len(seg.shape) != 3: + raise ValueError("remove_hot_pixel expects a 3D segmentation") # make sure the segmentation is 0/1 seg = seg.astype(np.uint8) @@ -353,8 +354,6 @@ def get_seed_for_objects( bg_seed=True will add a background seed at the first frame (z=0). """ - from skimage.morphology import remove_small_objects - # determine middle slice mid_z = get_middle_frame(raw, method="intensity") @@ -386,7 +385,7 @@ def get_seed_for_objects( return seed.astype(int) -def segmentation_union(seg: List) -> np.ndarray: +def segmentation_union(seg: List[np.ndarray]) -> np.ndarray: """merge multiple segmentations into a single result Parameters @@ -398,7 +397,7 @@ def segmentation_union(seg: List) -> np.ndarray: return np.logical_or.reduce(seg) -def segmentation_intersection(seg: List) -> np.ndarray: +def segmentation_intersection(seg: List[np.ndarray]) -> np.ndarray: """get the intersection of multiple segmentations into a single result Parameters @@ -410,7 +409,7 @@ def segmentation_intersection(seg: List) -> np.ndarray: return np.logical_and.reduce(seg) -def segmentation_xor(seg: List) -> np.ndarray: +def segmentation_xor(seg: List[np.ndarray]) -> np.ndarray: """get the XOR of multiple segmentations into a single result Parameters @@ -435,8 +434,6 @@ def remove_index_object(label: np.ndarray, id_to_remove: List[int] = [1], in_pla def peak_local_max_wrapper(struct_img_for_peak: np.ndarray, bw: np.ndarray) -> np.ndarray: - from skimage.feature import peak_local_max - local_maxi = peak_local_max(struct_img_for_peak, labels=label(bw), min_distance=2) local_maxi_image = np.zeros_like(struct_img_for_peak) local_maxi_image[tuple(local_maxi.T)] = True @@ -444,11 +441,6 @@ def peak_local_max_wrapper(struct_img_for_peak: np.ndarray, bw: np.ndarray) -> n def watershed_wrapper(bw: np.ndarray, local_maxi: np.ndarray) -> np.ndarray: - from scipy.ndimage import distance_transform_edt - from skimage.measure import label - from skimage.morphology import dilation, ball - from skimage.segmentation import watershed - distance = distance_transform_edt(bw) im_watershed = watershed( -distance, @@ -498,10 +490,7 @@ def prune_z_slices(bw: np.ndarray): return seg -def cell_local_adaptive_threshold(structure_img_smooth: np.ndarray, cell_wise_min_area: int): - from skimage.filters import threshold_triangle, threshold_otsu - from skimage.morphology import dilation - +def cell_local_adaptive_threshold(structure_img_smooth: np.ndarray, cell_wise_min_area: int) -> np.ndarray: # cell-wise local adaptive thresholding th_low_level = threshold_triangle(structure_img_smooth) diff --git a/aicssegmentation/core/vessel.py b/aicssegmentation/core/vessel.py index be5d38b5..f8682527 100644 --- a/aicssegmentation/core/vessel.py +++ b/aicssegmentation/core/vessel.py @@ -1,11 +1,13 @@ -import numpy as np import copy -from typing import List -from .utils import divide_nonzero +from typing import Sequence + +import numpy as np + from .hessian import absolute_3d_hessian_eigenvalues +from .utils import divide_nonzero -def filament_3d_wrapper(struct_img: np.ndarray, f3_param: List[List]): +def filament_3d_wrapper(struct_img: np.ndarray, f3_param: Sequence[Sequence[float]]) -> np.ndarray: """wrapper for 3d filament filter Parameters: @@ -29,17 +31,18 @@ def filament_3d_wrapper(struct_img: np.ndarray, f3_param: List[List]): T. Jerman, et al. Enhancement of vascular structures in 3D and 2D angiographic images. IEEE transactions on medical imaging. 2016 Apr 4;35(9):2107-18. """ - assert len(struct_img.shape) == 3, "image has to be 3D" + if len(struct_img.shape) != 3: + raise ValueError("filament_3d_wrapper expects a 3D image") bw = np.zeros(struct_img.shape, dtype=bool) for fid in range(len(f3_param)): sigma = f3_param[fid][0] eigenvalues = absolute_3d_hessian_eigenvalues(struct_img, sigma=sigma, scale=True, whiteonblack=True) - responce = compute_vesselness3D(eigenvalues[1], eigenvalues[2], tau=1) - bw = np.logical_or(bw, responce > f3_param[fid][1]) + response = compute_vesselness3D(eigenvalues[1], eigenvalues[2], tau=1) + bw = np.logical_or(bw, response > f3_param[fid][1]) return bw -def filament_2d_wrapper(struct_img: np.ndarray, f2_param: List[List]): +def filament_2d_wrapper(struct_img: np.ndarray, f2_param: Sequence[Sequence[float]]) -> np.ndarray: """wrapper for 2d filament filter Parameters: @@ -71,8 +74,8 @@ def filament_2d_wrapper(struct_img: np.ndarray, f2_param: List[List]): for fid in range(len(f2_param)): sigma = f2_param[fid][0] eigenvalues = absolute_3d_hessian_eigenvalues(struct_img, sigma=sigma, scale=True, whiteonblack=True) - responce = compute_vesselness2D(eigenvalues[1], tau=1) - bw = np.logical_or(bw, responce > f2_param[fid][1]) + response = compute_vesselness2D(eigenvalues[1], tau=1) + bw = np.logical_or(bw, response > f2_param[fid][1]) elif len(struct_img.shape) == 3: mip = np.amax(struct_img, axis=0) for fid in range(len(f2_param)): @@ -82,13 +85,19 @@ def filament_2d_wrapper(struct_img: np.ndarray, f2_param: List[List]): for zz in range(struct_img.shape[0]): tmp = np.concatenate((struct_img[zz, :, :], mip), axis=1) eigenvalues = absolute_3d_hessian_eigenvalues(tmp, sigma=sigma, scale=True, whiteonblack=True) - responce = compute_vesselness2D(eigenvalues[1], tau=1) - res[zz, :, : struct_img.shape[2] - 3] = responce[:, : struct_img.shape[2] - 3] + response = compute_vesselness2D(eigenvalues[1], tau=1) + res[zz, :, : struct_img.shape[2] - 3] = response[:, : struct_img.shape[2] - 3] bw = np.logical_or(bw, res > f2_param[fid][1]) return bw -def vesselness3D(nd_array: np.ndarray, sigmas: List, tau=1, whiteonblack=True, cutoff: float = -1): +def vesselness3D( + nd_array: np.ndarray, + sigmas: Sequence[float], + tau: float = 1, + whiteonblack: bool = True, + cutoff: float = -1, +) -> np.ndarray: """Multi-scale 3D filament filter Parameters: @@ -115,7 +124,7 @@ def vesselness3D(nd_array: np.ndarray, sigmas: List, tau=1, whiteonblack=True, c """ if not nd_array.ndim == 3: - raise (ValueError("Only 3 dimensions is currently supported")) + raise ValueError("Only 3 dimensions is currently supported") # adapted from https://github.com/scikit-image/scikit-image/blob/master/skimage/filters/_frangi.py#L74 # noqa E501 if np.any(np.asarray(sigmas) < 0.0): @@ -143,11 +152,11 @@ def vesselness3D(nd_array: np.ndarray, sigmas: List, tau=1, whiteonblack=True, c def vesselness2D( nd_array: np.ndarray, - sigmas: List, + sigmas: Sequence[float], tau: float = 1, whiteonblack: bool = True, cutoff: float = -1, -): +) -> np.ndarray: """Multi-scale 2D filament filter Parameters: @@ -174,7 +183,7 @@ def vesselness2D( """ if not nd_array.ndim == 2: - raise (ValueError("Only 2 dimensions is currently supported")) + raise ValueError("Only 2 dimensions is currently supported") # adapted from https://github.com/scikit-image/scikit-image/blob/master/skimage/filters/_frangi.py#L74 # noqa E501 if np.any(np.asarray(sigmas) < 0.0): @@ -203,11 +212,11 @@ def vesselness2D( def vesselness2D_single_slice( nd_array: np.ndarray, single_z: int, - sigmas: List, + sigmas: Sequence[float], tau: float = 1, whiteonblack: bool = True, cutoff: float = -1, -): +) -> np.ndarray: """Multi-scale 2D filament filter Parameters: @@ -236,7 +245,7 @@ def vesselness2D_single_slice( """ if not nd_array.ndim == 3: - raise (ValueError("Only 3 dimensions is currently supported")) + raise ValueError("Only 3 dimensions is currently supported") # adapted from https://github.com/scikit-image/scikit-image/blob/master/skimage/filters/_frangi.py#L74 # noqa E501 if np.any(np.asarray(sigmas) < 0.0): @@ -253,11 +262,11 @@ def vesselness2D_single_slice( def vesselnessSliceBySlice( nd_array: np.ndarray, - sigmas: List, + sigmas: Sequence[float], tau: float = 1, whiteonblack: bool = True, cutoff: float = -1, -): +) -> np.ndarray: """ wrapper for applying multi-scale 2D filament filter on 3D images in a slice by slice fashion @@ -293,7 +302,7 @@ def vesselnessSliceBySlice( return response > cutoff -def compute_vesselness3D(eigen2, eigen3, tau): +def compute_vesselness3D(eigen2: np.ndarray, eigen3: np.ndarray, tau: float) -> np.ndarray: """backend for computing 3D filament filter""" lambda3m = copy.copy(eigen3) @@ -309,7 +318,7 @@ def compute_vesselness3D(eigen2, eigen3, tau): return response -def compute_vesselness2D(eigen2, tau): +def compute_vesselness2D(eigen2: np.ndarray, tau: float) -> np.ndarray: """backend for computing 2D filament filter""" Lambda3 = copy.copy(eigen2) diff --git a/aicssegmentation/core/visual.py b/aicssegmentation/core/visual.py index e199283c..f42bfc6f 100644 --- a/aicssegmentation/core/visual.py +++ b/aicssegmentation/core/visual.py @@ -1,5 +1,14 @@ -import numpy as np +import logging + import matplotlib.pyplot as plt +import numpy as np +from matplotlib import cm + +from aicssegmentation.core.seg_dot import logSlice + +from .vessel import vesselness2D + +logger = logging.getLogger(__name__) def sliceViewer(im: np.ndarray, zz: int): @@ -49,8 +58,6 @@ def random_colormap(nn: int = 10000): >>> # img_label is output of a label function and represent all connected components >>> plt.imshow(img_label, cmap=random_colormap()) """ - from matplotlib import cm - viridis = cm.get_cmap("viridis", nn) for ii in range(nn): for jj in range(3): @@ -101,8 +108,6 @@ def blob2dExplorer_single(im, sigma, th): >>> ) >>> ); """ - from aicssegmentation.core.seg_dot import logSlice - bw = logSlice(im, (sigma[0], sigma[1], 1), th) plt.imshow(im) plt.show() @@ -147,8 +152,6 @@ def fila2dExplorer_single(im, sigma, th): >>> ) >>> ); """ - from .vessel import vesselness2D - tmp = vesselness2D(im, [sigma], tau=1, whiteonblack=True) plt.imshow(im) plt.show() @@ -208,7 +211,7 @@ def segmentation_quick_view(seg: np.ndarray): """ valid_pxl = np.unique(seg[seg > 0]) if len(valid_pxl) < 1: - print("segmentation is empty") + logger.warning("segmentation is empty") return seg = seg > 0 @@ -218,7 +221,7 @@ def segmentation_quick_view(seg: np.ndarray): return seg -def single_fluorescent_view(im): +def single_fluorescent_view(im: np.ndarray) -> np.ndarray: """wrapper for visualizing an image stack in ITK viewer Parameter: @@ -233,7 +236,8 @@ def single_fluorescent_view(im): """ - assert len(im.shape) == 3 + if len(im.shape) != 3: + raise ValueError("single_fluorescent_view expects a 3D image") im = im.astype(np.float32) im = (im - im.min()) / (im.max() - im.min()) diff --git a/aicssegmentation/structure_wrapper/seg_PCNA_earlyS_midS.py b/aicssegmentation/structure_wrapper/seg_PCNA_earlyS_midS.py index 145d8000..228b894f 100644 --- a/aicssegmentation/structure_wrapper/seg_PCNA_earlyS_midS.py +++ b/aicssegmentation/structure_wrapper/seg_PCNA_earlyS_midS.py @@ -1,20 +1,20 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union -from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.seg_dot import dot_3d -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +import numpy as np +from skimage.filters import threshold_otsu from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) - -from skimage.filters import threshold_otsu +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_3d +from aicssegmentation.core.vessel import vesselness3D def Workflow_PCNA_earlyS_midS( diff --git a/aicssegmentation/structure_wrapper/seg_PCNA_lateS.py b/aicssegmentation/structure_wrapper/seg_PCNA_lateS.py index ae81dede..e9143e92 100644 --- a/aicssegmentation/structure_wrapper/seg_PCNA_lateS.py +++ b/aicssegmentation/structure_wrapper/seg_PCNA_lateS.py @@ -1,20 +1,20 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union -from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.seg_dot import dot_3d -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +import numpy as np +from skimage.filters import threshold_otsu from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) - -from skimage.filters import threshold_otsu +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_3d +from aicssegmentation.core.vessel import vesselness3D def Workflow_PCNA_lateS( diff --git a/aicssegmentation/structure_wrapper/seg_PCNA_lateS_hole_fill.py b/aicssegmentation/structure_wrapper/seg_PCNA_lateS_hole_fill.py index a3d9e98c..6b539d06 100644 --- a/aicssegmentation/structure_wrapper/seg_PCNA_lateS_hole_fill.py +++ b/aicssegmentation/structure_wrapper/seg_PCNA_lateS_hole_fill.py @@ -1,20 +1,20 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union -from aicssegmentation.core.seg_dot import dot_3d -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +import numpy as np +from scipy import ndimage +from skimage.filters import threshold_otsu from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) - -from skimage.filters import threshold_otsu -from scipy import ndimage +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_3d def Workflow_PCNA_lateS_hole_fill( diff --git a/aicssegmentation/structure_wrapper/seg_actb.py b/aicssegmentation/structure_wrapper/seg_actb.py index efb8ea09..0f3d8b6c 100644 --- a/aicssegmentation/structure_wrapper/seg_actb.py +++ b/aicssegmentation/structure_wrapper/seg_actb.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, edge_preserving_smoothing_3d, + intensity_normalization, ) from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_actb( diff --git a/aicssegmentation/structure_wrapper/seg_actn1.py b/aicssegmentation/structure_wrapper/seg_actn1.py index c0bbba54..4f29f2e8 100644 --- a/aicssegmentation/structure_wrapper/seg_actn1.py +++ b/aicssegmentation/structure_wrapper/seg_actn1.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, edge_preserving_smoothing_3d, + intensity_normalization, ) from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_atcn1( diff --git a/aicssegmentation/structure_wrapper/seg_atp2a2.py b/aicssegmentation/structure_wrapper/seg_atp2a2.py index a6d817b7..ef5fec57 100644 --- a/aicssegmentation/structure_wrapper/seg_atp2a2.py +++ b/aicssegmentation/structure_wrapper/seg_atp2a2.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path -from aicssegmentation.core.vessel import vesselnessSliceBySlice -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.vessel import vesselnessSliceBySlice def Workflow_atp2a2( diff --git a/aicssegmentation/structure_wrapper/seg_cardio_actn2.py b/aicssegmentation/structure_wrapper/seg_cardio_actn2.py index 9cf7b87f..c67bac14 100644 --- a/aicssegmentation/structure_wrapper/seg_cardio_actn2.py +++ b/aicssegmentation/structure_wrapper/seg_cardio_actn2.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, edge_preserving_smoothing_3d, + intensity_normalization, ) from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_cardio_actn2( diff --git a/aicssegmentation/structure_wrapper/seg_cardio_atp2a2.py b/aicssegmentation/structure_wrapper/seg_cardio_atp2a2.py index 286a1473..7c65954a 100644 --- a/aicssegmentation/structure_wrapper/seg_cardio_atp2a2.py +++ b/aicssegmentation/structure_wrapper/seg_cardio_atp2a2.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, edge_preserving_smoothing_3d, + intensity_normalization, ) from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_cardio_atp2a2( diff --git a/aicssegmentation/structure_wrapper/seg_cardio_fbl.py b/aicssegmentation/structure_wrapper/seg_cardio_fbl.py index 02d07730..3f281a81 100644 --- a/aicssegmentation/structure_wrapper/seg_cardio_fbl.py +++ b/aicssegmentation/structure_wrapper/seg_cardio_fbl.py @@ -1,19 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom +from skimage.filters import threshold_otsu, threshold_triangle +from skimage.measure import label from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_3d, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_slice_by_slice -from skimage.filters import threshold_triangle, threshold_otsu -from skimage.measure import label -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_cardio_fbl( diff --git a/aicssegmentation/structure_wrapper/seg_cardio_fbl_100x.py b/aicssegmentation/structure_wrapper/seg_cardio_fbl_100x.py index e25f9adc..db85755c 100644 --- a/aicssegmentation/structure_wrapper/seg_cardio_fbl_100x.py +++ b/aicssegmentation/structure_wrapper/seg_cardio_fbl_100x.py @@ -1,19 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom +from skimage.filters import threshold_otsu, threshold_triangle +from skimage.measure import label from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_3d, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_slice_by_slice -from skimage.filters import threshold_triangle, threshold_otsu -from skimage.measure import label -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_cardio_fbl_100x( diff --git a/aicssegmentation/structure_wrapper/seg_cardio_myl7.py b/aicssegmentation/structure_wrapper/seg_cardio_myl7.py index 5ab09df5..2690e572 100644 --- a/aicssegmentation/structure_wrapper/seg_cardio_myl7.py +++ b/aicssegmentation/structure_wrapper/seg_cardio_myl7.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, edge_preserving_smoothing_3d, + intensity_normalization, ) from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_cardio_myl7( diff --git a/aicssegmentation/structure_wrapper/seg_cardio_npm1.py b/aicssegmentation/structure_wrapper/seg_cardio_npm1.py index 54020e33..44a9db36 100644 --- a/aicssegmentation/structure_wrapper/seg_cardio_npm1.py +++ b/aicssegmentation/structure_wrapper/seg_cardio_npm1.py @@ -1,19 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects, ball, dilation -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - image_smoothing_gaussian_3d, -) -from aicssegmentation.core.seg_dot import dot_slice_by_slice -from skimage.filters import threshold_triangle, threshold_otsu +from typing import Union + +import numpy as np +from scipy.ndimage import zoom +from skimage.filters import threshold_otsu, threshold_triangle from skimage.measure import label +from skimage.morphology import ball, dilation, remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + image_smoothing_gaussian_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_slice_by_slice def Workflow_cardio_npm1( diff --git a/aicssegmentation/structure_wrapper/seg_cardio_npm1_100x.py b/aicssegmentation/structure_wrapper/seg_cardio_npm1_100x.py index ab6d6c39..6142f7df 100644 --- a/aicssegmentation/structure_wrapper/seg_cardio_npm1_100x.py +++ b/aicssegmentation/structure_wrapper/seg_cardio_npm1_100x.py @@ -1,19 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects, ball, dilation -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - image_smoothing_gaussian_3d, -) -from aicssegmentation.core.seg_dot import dot_slice_by_slice -from skimage.filters import threshold_triangle, threshold_otsu +from typing import Union + +import numpy as np +from scipy.ndimage import zoom +from skimage.filters import threshold_otsu, threshold_triangle from skimage.measure import label +from skimage.morphology import ball, dilation, remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + image_smoothing_gaussian_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_slice_by_slice def Workflow_cardio_npm1_100x( diff --git a/aicssegmentation/structure_wrapper/seg_cardio_tnni1.py b/aicssegmentation/structure_wrapper/seg_cardio_tnni1.py index b38ce1a6..b9dfc9a1 100644 --- a/aicssegmentation/structure_wrapper/seg_cardio_tnni1.py +++ b/aicssegmentation/structure_wrapper/seg_cardio_tnni1.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path -from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.vessel import vesselness3D def Workflow_cardio_tnni1( diff --git a/aicssegmentation/structure_wrapper/seg_cardio_ttn.py b/aicssegmentation/structure_wrapper/seg_cardio_ttn.py index 14ae2b3f..2135b8ac 100644 --- a/aicssegmentation/structure_wrapper/seg_cardio_ttn.py +++ b/aicssegmentation/structure_wrapper/seg_cardio_ttn.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, edge_preserving_smoothing_3d, + intensity_normalization, ) from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_cardio_ttn( diff --git a/aicssegmentation/structure_wrapper/seg_cetn2.py b/aicssegmentation/structure_wrapper/seg_cetn2.py index 91a23401..ee9456d2 100644 --- a/aicssegmentation/structure_wrapper/seg_cetn2.py +++ b/aicssegmentation/structure_wrapper/seg_cetn2.py @@ -1,21 +1,22 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects, dilation, ball +from typing import Union + +import numpy as np +from scipy.ndimage import distance_transform_edt, zoom +from skimage.measure import label +from skimage.morphology import ball, dilation, remove_small_objects from skimage.segmentation import watershed + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_slice_by_slice, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_3d from aicssegmentation.core.utils import peak_local_max_wrapper -from scipy.ndimage import distance_transform_edt -from skimage.measure import label -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_cetn2( diff --git a/aicssegmentation/structure_wrapper/seg_ctnnb1.py b/aicssegmentation/structure_wrapper/seg_ctnnb1.py index cc6b7059..9e493d62 100644 --- a/aicssegmentation/structure_wrapper/seg_ctnnb1.py +++ b/aicssegmentation/structure_wrapper/seg_ctnnb1.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_3d, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_slice_by_slice -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_ctnnb1( diff --git a/aicssegmentation/structure_wrapper/seg_drug_npm1.py b/aicssegmentation/structure_wrapper/seg_drug_npm1.py index b3e49717..996f6e28 100644 --- a/aicssegmentation/structure_wrapper/seg_drug_npm1.py +++ b/aicssegmentation/structure_wrapper/seg_drug_npm1.py @@ -1,19 +1,20 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - image_smoothing_gaussian_3d, -) -from skimage.filters import threshold_triangle, threshold_otsu +from typing import Union + +import numpy as np +from scipy.ndimage import zoom +from skimage.filters import threshold_otsu, threshold_triangle from skimage.measure import label +from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, +) +from aicssegmentation.core.pre_processing_utils import ( + image_smoothing_gaussian_3d, + intensity_normalization, ) -from scipy.ndimage import zoom - from aicssegmentation.core.seg_dot import dot_3d_wrapper diff --git a/aicssegmentation/structure_wrapper/seg_dsp.py b/aicssegmentation/structure_wrapper/seg_dsp.py index 2de1e647..1b492ce3 100644 --- a/aicssegmentation/structure_wrapper/seg_dsp.py +++ b/aicssegmentation/structure_wrapper/seg_dsp.py @@ -1,24 +1,23 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects, dilation, ball +from typing import Union + +import numpy as np +from scipy.ndimage import distance_transform_edt, zoom +from skimage.measure import label +from skimage.morphology import ball, dilation, remove_small_objects from skimage.segmentation import watershed +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_slice_by_slice, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_3d from aicssegmentation.core.utils import peak_local_max_wrapper -from scipy.ndimage import distance_transform_edt -from skimage.measure import label -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom - def Workflow_dsp( struct_img: np.ndarray, diff --git a/aicssegmentation/structure_wrapper/seg_fbl.py b/aicssegmentation/structure_wrapper/seg_fbl.py index 5497dc72..1420778e 100644 --- a/aicssegmentation/structure_wrapper/seg_fbl.py +++ b/aicssegmentation/structure_wrapper/seg_fbl.py @@ -1,19 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom +from skimage.filters import threshold_otsu, threshold_triangle +from skimage.measure import label from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_3d, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_slice_by_slice -from skimage.filters import threshold_triangle, threshold_otsu -from skimage.measure import label -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_fbl( diff --git a/aicssegmentation/structure_wrapper/seg_fbl_labelfree_4dn.py b/aicssegmentation/structure_wrapper/seg_fbl_labelfree_4dn.py index 17f51dd8..87f16934 100644 --- a/aicssegmentation/structure_wrapper/seg_fbl_labelfree_4dn.py +++ b/aicssegmentation/structure_wrapper/seg_fbl_labelfree_4dn.py @@ -1,20 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - image_smoothing_gaussian_3d, -) -from aicssegmentation.core.seg_dot import dot_2d_slice_by_slice_wrapper -from skimage.filters import threshold_triangle, threshold_otsu +from typing import Union + +import numpy as np +from skimage.filters import threshold_otsu, threshold_triangle from skimage.measure import label +from skimage.morphology import remove_small_objects # do not remove #### from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) +from aicssegmentation.core.pre_processing_utils import ( + image_smoothing_gaussian_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_2d_slice_by_slice_wrapper def Workflow_fbl_labelfree_4dn( diff --git a/aicssegmentation/structure_wrapper/seg_gja1.py b/aicssegmentation/structure_wrapper/seg_gja1.py index 2862800c..d6c08d1b 100644 --- a/aicssegmentation/structure_wrapper/seg_gja1.py +++ b/aicssegmentation/structure_wrapper/seg_gja1.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_slice_by_slice, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_3d -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_gja1( diff --git a/aicssegmentation/structure_wrapper/seg_h2b_interphase.py b/aicssegmentation/structure_wrapper/seg_h2b_interphase.py index fed721af..80aa2fb2 100644 --- a/aicssegmentation/structure_wrapper/seg_h2b_interphase.py +++ b/aicssegmentation/structure_wrapper/seg_h2b_interphase.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) -from aicssegmentation.core.seg_dot import dot_2d_slice_by_slice_wrapper +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_2d_slice_by_slice_wrapper def Workflow_h2b_interphase( diff --git a/aicssegmentation/structure_wrapper/seg_lamp1.py b/aicssegmentation/structure_wrapper/seg_lamp1.py index ee4b522b..d2622f3e 100644 --- a/aicssegmentation/structure_wrapper/seg_lamp1.py +++ b/aicssegmentation/structure_wrapper/seg_lamp1.py @@ -1,19 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.measure import label -from aicssegmentation.core.vessel import vesselnessSliceBySlice -from aicssegmentation.core.seg_dot import dot_slice_by_slice -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - image_smoothing_gaussian_slice_by_slice, -) +from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + image_smoothing_gaussian_slice_by_slice, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_slice_by_slice +from aicssegmentation.core.vessel import vesselnessSliceBySlice def Workflow_lamp1( diff --git a/aicssegmentation/structure_wrapper/seg_lmnb1_interphase.py b/aicssegmentation/structure_wrapper/seg_lmnb1_interphase.py index ce63bb9c..50ab9b44 100644 --- a/aicssegmentation/structure_wrapper/seg_lmnb1_interphase.py +++ b/aicssegmentation/structure_wrapper/seg_lmnb1_interphase.py @@ -1,24 +1,26 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union -# function for core algorithm -from aicssegmentation.core.vessel import filament_2d_wrapper +import numpy as np +from scipy.ndimage import zoom +from skimage.segmentation import find_boundaries, watershed + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_3d, + intensity_normalization, ) from aicssegmentation.core.utils import ( + get_3dseed_from_mid_frame, get_middle_frame, hole_filling, - get_3dseed_from_mid_frame, ) -from skimage.segmentation import find_boundaries, watershed -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom + +# function for core algorithm +from aicssegmentation.core.vessel import filament_2d_wrapper def Workflow_lmnb1_interphase( diff --git a/aicssegmentation/structure_wrapper/seg_lmnb1_mitotic.py b/aicssegmentation/structure_wrapper/seg_lmnb1_mitotic.py index b6fccede..b149f754 100644 --- a/aicssegmentation/structure_wrapper/seg_lmnb1_mitotic.py +++ b/aicssegmentation/structure_wrapper/seg_lmnb1_mitotic.py @@ -1,19 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union -# function for core algorithm -from aicssegmentation.core.vessel import filament_2d_wrapper -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - image_smoothing_gaussian_3d, -) +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + image_smoothing_gaussian_3d, + intensity_normalization, +) + +# function for core algorithm +from aicssegmentation.core.vessel import filament_2d_wrapper def Workflow_lmnb1_mitotic( diff --git a/aicssegmentation/structure_wrapper/seg_myh10.py b/aicssegmentation/structure_wrapper/seg_myh10.py index cdcb99bf..c65fa5ad 100644 --- a/aicssegmentation/structure_wrapper/seg_myh10.py +++ b/aicssegmentation/structure_wrapper/seg_myh10.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, edge_preserving_smoothing_3d, + intensity_normalization, ) from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_myh10( diff --git a/aicssegmentation/structure_wrapper/seg_npm1.py b/aicssegmentation/structure_wrapper/seg_npm1.py index 42494a51..2319b645 100644 --- a/aicssegmentation/structure_wrapper/seg_npm1.py +++ b/aicssegmentation/structure_wrapper/seg_npm1.py @@ -1,19 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects, ball, dilation -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - image_smoothing_gaussian_3d, -) -from aicssegmentation.core.seg_dot import dot_slice_by_slice -from skimage.filters import threshold_triangle, threshold_otsu +from typing import Union + +import numpy as np +from scipy.ndimage import zoom +from skimage.filters import threshold_otsu, threshold_triangle from skimage.measure import label +from skimage.morphology import ball, dilation, remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + image_smoothing_gaussian_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_slice_by_slice def Workflow_npm1( diff --git a/aicssegmentation/structure_wrapper/seg_npm1_SR.py b/aicssegmentation/structure_wrapper/seg_npm1_SR.py index b518d0de..f67456c7 100644 --- a/aicssegmentation/structure_wrapper/seg_npm1_SR.py +++ b/aicssegmentation/structure_wrapper/seg_npm1_SR.py @@ -1,19 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects, dilation, ball -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - image_smoothing_gaussian_3d, -) -from aicssegmentation.core.seg_dot import dot_slice_by_slice -from skimage.filters import threshold_triangle, threshold_otsu +from typing import Union + +import numpy as np +from scipy.ndimage import zoom +from skimage.filters import threshold_otsu, threshold_triangle from skimage.measure import label +from skimage.morphology import ball, dilation, remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + image_smoothing_gaussian_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_slice_by_slice def Workflow_npm1_SR( diff --git a/aicssegmentation/structure_wrapper/seg_npm_labelfree_4dn.py b/aicssegmentation/structure_wrapper/seg_npm_labelfree_4dn.py index 129b0524..c6e8abb5 100644 --- a/aicssegmentation/structure_wrapper/seg_npm_labelfree_4dn.py +++ b/aicssegmentation/structure_wrapper/seg_npm_labelfree_4dn.py @@ -1,20 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - image_smoothing_gaussian_3d, -) -from aicssegmentation.core.seg_dot import dot_2d_slice_by_slice_wrapper -from skimage.filters import threshold_triangle, threshold_otsu +from typing import Union + +import numpy as np +from skimage.filters import threshold_otsu, threshold_triangle from skimage.measure import label +from skimage.morphology import remove_small_objects # do not remove #### from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) +from aicssegmentation.core.pre_processing_utils import ( + image_smoothing_gaussian_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_2d_slice_by_slice_wrapper def Workflow_npm_labelfree_4dn( diff --git a/aicssegmentation/structure_wrapper/seg_nup153.py b/aicssegmentation/structure_wrapper/seg_nup153.py index cbc6b3ce..985305db 100644 --- a/aicssegmentation/structure_wrapper/seg_nup153.py +++ b/aicssegmentation/structure_wrapper/seg_nup153.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, edge_preserving_smoothing_3d, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_3d_wrapper -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_nup153( diff --git a/aicssegmentation/structure_wrapper/seg_polr2a.py b/aicssegmentation/structure_wrapper/seg_polr2a.py index 5d2fbbac..7ab9ff02 100644 --- a/aicssegmentation/structure_wrapper/seg_polr2a.py +++ b/aicssegmentation/structure_wrapper/seg_polr2a.py @@ -1,20 +1,20 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union -from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.seg_dot import dot_3d -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +import numpy as np +from skimage.filters import threshold_otsu from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) - -from skimage.filters import threshold_otsu +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_3d +from aicssegmentation.core.vessel import vesselness3D def Workflow_polr2a( diff --git a/aicssegmentation/structure_wrapper/seg_polr2a_blob.py b/aicssegmentation/structure_wrapper/seg_polr2a_blob.py index d28dfb6f..a361767e 100644 --- a/aicssegmentation/structure_wrapper/seg_polr2a_blob.py +++ b/aicssegmentation/structure_wrapper/seg_polr2a_blob.py @@ -1,22 +1,21 @@ -from typing import Union from pathlib import Path -import numpy as np -from skimage.morphology import remove_small_objects, watershed, dilation, ball -from aicssegmentation.core.utils import peak_local_max_wrapper +from typing import Union +import numpy as np +from scipy.ndimage import distance_transform_edt, zoom from skimage.measure import label +from skimage.morphology import ball, dilation, remove_small_objects, watershed + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_slice_by_slice, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_3d -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from aicssegmentation.core.utils import remove_hot_pixel -from scipy.ndimage import distance_transform_edt -from scipy.ndimage import zoom +from aicssegmentation.core.utils import peak_local_max_wrapper, remove_hot_pixel def Workflow_polr2a_blob( diff --git a/aicssegmentation/structure_wrapper/seg_pxn.py b/aicssegmentation/structure_wrapper/seg_pxn.py index bd0c8ac2..95d4c372 100644 --- a/aicssegmentation/structure_wrapper/seg_pxn.py +++ b/aicssegmentation/structure_wrapper/seg_pxn.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path -from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.vessel import vesselness3D def Workflow_pxn( diff --git a/aicssegmentation/structure_wrapper/seg_rab5a.py b/aicssegmentation/structure_wrapper/seg_rab5a.py index 0d35ffcf..a427d7cb 100644 --- a/aicssegmentation/structure_wrapper/seg_rab5a.py +++ b/aicssegmentation/structure_wrapper/seg_rab5a.py @@ -1,18 +1,20 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_slice_by_slice, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_3d -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) from aicssegmentation.core.utils import hole_filling -from scipy.ndimage import zoom def Workflow_rab5a( diff --git a/aicssegmentation/structure_wrapper/seg_sec61b.py b/aicssegmentation/structure_wrapper/seg_sec61b.py index c00238f6..0b87fd37 100644 --- a/aicssegmentation/structure_wrapper/seg_sec61b.py +++ b/aicssegmentation/structure_wrapper/seg_sec61b.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path -from aicssegmentation.core.vessel import vesselnessSliceBySlice -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.vessel import vesselnessSliceBySlice def Workflow_sec61b( diff --git a/aicssegmentation/structure_wrapper/seg_sec61b_dual.py b/aicssegmentation/structure_wrapper/seg_sec61b_dual.py index 980c7f7e..58d4fcda 100644 --- a/aicssegmentation/structure_wrapper/seg_sec61b_dual.py +++ b/aicssegmentation/structure_wrapper/seg_sec61b_dual.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path -from aicssegmentation.core.vessel import vesselnessSliceBySlice -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.vessel import vesselnessSliceBySlice def Workflow_sec61b_dual( diff --git a/aicssegmentation/structure_wrapper/seg_slc25a17.py b/aicssegmentation/structure_wrapper/seg_slc25a17.py index 01ef3890..55dd007a 100644 --- a/aicssegmentation/structure_wrapper/seg_slc25a17.py +++ b/aicssegmentation/structure_wrapper/seg_slc25a17.py @@ -1,21 +1,22 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects, dilation, ball +from typing import Union + +import numpy as np +from scipy.ndimage import distance_transform_edt, zoom +from skimage.measure import label +from skimage.morphology import ball, dilation, remove_small_objects from skimage.segmentation import watershed -from aicssegmentation.core.utils import peak_local_max_wrapper + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_slice_by_slice, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_3d -from scipy.ndimage import distance_transform_edt -from skimage.measure import label -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom +from aicssegmentation.core.utils import peak_local_max_wrapper def Workflow_slc25a17( diff --git a/aicssegmentation/structure_wrapper/seg_smc1a.py b/aicssegmentation/structure_wrapper/seg_smc1a.py index 3a029692..c3779f5b 100644 --- a/aicssegmentation/structure_wrapper/seg_smc1a.py +++ b/aicssegmentation/structure_wrapper/seg_smc1a.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) -from aicssegmentation.core.seg_dot import dot_2d_slice_by_slice_wrapper +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_2d_slice_by_slice_wrapper def Workflow_smc1a( diff --git a/aicssegmentation/structure_wrapper/seg_son.py b/aicssegmentation/structure_wrapper/seg_son.py index 32298b1d..f86be9c4 100644 --- a/aicssegmentation/structure_wrapper/seg_son.py +++ b/aicssegmentation/structure_wrapper/seg_son.py @@ -1,18 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union -from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.seg_dot import dot_3d -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +import numpy as np from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_3d +from aicssegmentation.core.vessel import vesselness3D def Workflow_son( diff --git a/aicssegmentation/structure_wrapper/seg_st6gal1.py b/aicssegmentation/structure_wrapper/seg_st6gal1.py index e0e7fe91..f7e407ad 100644 --- a/aicssegmentation/structure_wrapper/seg_st6gal1.py +++ b/aicssegmentation/structure_wrapper/seg_st6gal1.py @@ -1,20 +1,22 @@ -import numpy as np -from typing import Union from pathlib import Path -from skimage.morphology import remove_small_objects, ball, dilation +from typing import Union + +import numpy as np +from scipy.ndimage import zoom +from skimage.filters import threshold_otsu, threshold_triangle +from skimage.measure import label +from skimage.morphology import ball, dilation, remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_3d, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_3d -from skimage.measure import label -from skimage.filters import threshold_triangle, threshold_otsu from aicssegmentation.core.utils import topology_preserving_thinning -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_st6gal1( diff --git a/aicssegmentation/structure_wrapper/seg_terf2.py b/aicssegmentation/structure_wrapper/seg_terf2.py index ac4a377d..c14cde39 100644 --- a/aicssegmentation/structure_wrapper/seg_terf2.py +++ b/aicssegmentation/structure_wrapper/seg_terf2.py @@ -1,18 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union -from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.seg_dot import dot_3d -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +import numpy as np from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.seg_dot import dot_3d +from aicssegmentation.core.vessel import vesselness3D def Workflow_terf2( diff --git a/aicssegmentation/structure_wrapper/seg_tjp1.py b/aicssegmentation/structure_wrapper/seg_tjp1.py index 6682563c..0891c55e 100644 --- a/aicssegmentation/structure_wrapper/seg_tjp1.py +++ b/aicssegmentation/structure_wrapper/seg_tjp1.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_3d, + intensity_normalization, ) from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_tjp1( diff --git a/aicssegmentation/structure_wrapper/seg_tomm20.py b/aicssegmentation/structure_wrapper/seg_tomm20.py index 1c981642..0d2289e0 100644 --- a/aicssegmentation/structure_wrapper/seg_tomm20.py +++ b/aicssegmentation/structure_wrapper/seg_tomm20.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_3d, + intensity_normalization, ) from aicssegmentation.core.vessel import vesselnessSliceBySlice -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_tomm20( diff --git a/aicssegmentation/structure_wrapper/seg_tuba1b.py b/aicssegmentation/structure_wrapper/seg_tuba1b.py index 13510747..b8a2cc90 100644 --- a/aicssegmentation/structure_wrapper/seg_tuba1b.py +++ b/aicssegmentation/structure_wrapper/seg_tuba1b.py @@ -1,17 +1,19 @@ -import numpy as np -from typing import Union from pathlib import Path -from aicssegmentation.core.vessel import vesselness3D -from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, - edge_preserving_smoothing_3d, -) +from typing import Union + +import numpy as np +from scipy.ndimage import zoom from skimage.morphology import remove_small_objects + from aicssegmentation.core.output_utils import ( - save_segmentation, generate_segmentation_contour, + save_segmentation, ) -from scipy.ndimage import zoom +from aicssegmentation.core.pre_processing_utils import ( + edge_preserving_smoothing_3d, + intensity_normalization, +) +from aicssegmentation.core.vessel import vesselness3D def Workflow_tuba1b( diff --git a/aicssegmentation/structure_wrapper/seg_ubtf.py b/aicssegmentation/structure_wrapper/seg_ubtf.py index 379b47df..027cb423 100644 --- a/aicssegmentation/structure_wrapper/seg_ubtf.py +++ b/aicssegmentation/structure_wrapper/seg_ubtf.py @@ -1,19 +1,21 @@ -import numpy as np -from typing import Union from pathlib import Path +from typing import Union + +import numpy as np +from scipy.ndimage import zoom +from skimage.filters import threshold_otsu, threshold_triangle +from skimage.measure import label from skimage.morphology import remove_small_objects + +from aicssegmentation.core.output_utils import ( + generate_segmentation_contour, + save_segmentation, +) from aicssegmentation.core.pre_processing_utils import ( - intensity_normalization, image_smoothing_gaussian_3d, + intensity_normalization, ) from aicssegmentation.core.seg_dot import dot_slice_by_slice -from skimage.filters import threshold_triangle, threshold_otsu -from skimage.measure import label -from aicssegmentation.core.output_utils import ( - save_segmentation, - generate_segmentation_contour, -) -from scipy.ndimage import zoom def Workflow_ubtf( diff --git a/aicssegmentation/structure_wrapper/structure_segmenter.py b/aicssegmentation/structure_wrapper/structure_segmenter.py index 365e7600..027f7f95 100644 --- a/aicssegmentation/structure_wrapper/structure_segmenter.py +++ b/aicssegmentation/structure_wrapper/structure_segmenter.py @@ -1,5 +1,6 @@ import importlib import logging + import numpy as np # Defaults cloned from existing ../bin/batch_processing script diff --git a/aicssegmentation/tests/conftest.py b/aicssegmentation/tests/conftest.py index 6683a52e..4abb8b0b 100644 --- a/aicssegmentation/tests/conftest.py +++ b/aicssegmentation/tests/conftest.py @@ -1,7 +1,7 @@ -import pytest - from pathlib import Path +import pytest + @pytest.fixture def resources_dir() -> Path: diff --git a/aicssegmentation/tests/test_config.py b/aicssegmentation/tests/test_config.py index 27a2f040..add1030a 100644 --- a/aicssegmentation/tests/test_config.py +++ b/aicssegmentation/tests/test_config.py @@ -1,4 +1,5 @@ import json + from aicssegmentation.util.directories import Directories diff --git a/aicssegmentation/tests/test_structures.py b/aicssegmentation/tests/test_structures.py index ea81db27..6ee5a1ec 100644 --- a/aicssegmentation/tests/test_structures.py +++ b/aicssegmentation/tests/test_structures.py @@ -1,9 +1,9 @@ import importlib +from pathlib import Path + import numpy as np import pytest - from aicsimageio import imread -from pathlib import Path from aicsimageio.writers import OmeTiffWriter AGREE_THRESH = 0.997 diff --git a/aicssegmentation/tests/workflow/mock_module.py b/aicssegmentation/tests/workflow/mock_module.py index 06c3b432..1aea4eff 100644 --- a/aicssegmentation/tests/workflow/mock_module.py +++ b/aicssegmentation/tests/workflow/mock_module.py @@ -1,4 +1,5 @@ from typing import List + import numpy as np diff --git a/aicssegmentation/tests/workflow/test_all_workflows.py b/aicssegmentation/tests/workflow/test_all_workflows.py index f4c3df3d..903dec5b 100644 --- a/aicssegmentation/tests/workflow/test_all_workflows.py +++ b/aicssegmentation/tests/workflow/test_all_workflows.py @@ -1,9 +1,9 @@ import pytest - from aicsimageio import imread + from aicssegmentation.workflow import WorkflowEngine -from . import SUPPORTED_STRUCTURE_NAMES +from . import SUPPORTED_STRUCTURE_NAMES IMG_SCALING = {"cetn2": 5100} diff --git a/aicssegmentation/tests/workflow/test_batch_workflow.py b/aicssegmentation/tests/workflow/test_batch_workflow.py index 5caface6..bda4951c 100644 --- a/aicssegmentation/tests/workflow/test_batch_workflow.py +++ b/aicssegmentation/tests/workflow/test_batch_workflow.py @@ -1,11 +1,12 @@ +from pathlib import Path +from unittest import mock + import numpy as np import pytest - -from unittest import mock -from aicsimageio.writers.ome_tiff_writer import OmeTiffWriter -from pathlib import Path from aicsimageio import AICSImage +from aicsimageio.writers.ome_tiff_writer import OmeTiffWriter from numpy import random + from aicssegmentation.workflow.batch_workflow import BatchWorkflow from aicssegmentation.workflow.workflow_config import WorkflowConfig diff --git a/aicssegmentation/tests/workflow/test_workflow.py b/aicssegmentation/tests/workflow/test_workflow.py index a145fa84..17bb4d01 100644 --- a/aicssegmentation/tests/workflow/test_workflow.py +++ b/aicssegmentation/tests/workflow/test_workflow.py @@ -1,8 +1,8 @@ import numpy as np +from skimage import data from aicssegmentation.workflow.workflow import Workflow from aicssegmentation.workflow.workflow_config import WorkflowConfig -from skimage import data class TestWorkflow: diff --git a/aicssegmentation/tests/workflow/test_workflow_config.py b/aicssegmentation/tests/workflow/test_workflow_config.py index 45b40606..e9a4c9da 100644 --- a/aicssegmentation/tests/workflow/test_workflow_config.py +++ b/aicssegmentation/tests/workflow/test_workflow_config.py @@ -1,10 +1,12 @@ -import pytest import json - from pathlib import Path -from aicssegmentation.workflow.workflow_config import WorkflowConfig + +import pytest + from aicssegmentation.util.directories import Directories -from aicssegmentation.workflow.workflow_definition import WorkflowDefinition, PrebuiltWorkflowDefinition +from aicssegmentation.workflow.workflow_config import WorkflowConfig +from aicssegmentation.workflow.workflow_definition import PrebuiltWorkflowDefinition, WorkflowDefinition + from . import SUPPORTED_STRUCTURE_NAMES @@ -25,11 +27,11 @@ def test_get_all_functions(self): @pytest.mark.parametrize("name", [None, "", " "]) def test_get_workflow_definition_empty_name_fails(self, name): with pytest.raises(ValueError): - workflow_def = self._workflow_config.get_workflow_definition(name) + self._workflow_config.get_workflow_definition(name) def test_get_workflow_definition_unavailable_workflow_fails(self): with pytest.raises(ValueError): - workflow_def = self._workflow_config.get_workflow_definition("unsupported workflow") + self._workflow_config.get_workflow_definition("unsupported workflow") @pytest.mark.parametrize("name", SUPPORTED_STRUCTURE_NAMES) def test_get_workflow_definition(self, name): diff --git a/aicssegmentation/tests/workflow/test_workflow_definition.py b/aicssegmentation/tests/workflow/test_workflow_definition.py index aa6acc74..88444885 100644 --- a/aicssegmentation/tests/workflow/test_workflow_definition.py +++ b/aicssegmentation/tests/workflow/test_workflow_definition.py @@ -1,6 +1,7 @@ import pytest from aicssegmentation.workflow.workflow_definition import PrebuiltWorkflowDefinition + from . import SUPPORTED_STRUCTURE_NAMES diff --git a/aicssegmentation/tests/workflow/test_workflow_engine.py b/aicssegmentation/tests/workflow/test_workflow_engine.py index 85a47fff..95dafc25 100644 --- a/aicssegmentation/tests/workflow/test_workflow_engine.py +++ b/aicssegmentation/tests/workflow/test_workflow_engine.py @@ -1,13 +1,14 @@ -from aicssegmentation.exceptions import ArgumentNullError -from aicssegmentation.workflow.workflow import Workflow -import pytest +from unittest.mock import MagicMock, create_autospec + import numpy as np +import pytest -from unittest.mock import MagicMock, create_autospec +from aicssegmentation.exceptions import ArgumentNullError +from aicssegmentation.util.directories import Directories +from aicssegmentation.workflow.workflow import Workflow from aicssegmentation.workflow.workflow_config import WorkflowConfig -from aicssegmentation.workflow.workflow_engine import WorkflowEngine from aicssegmentation.workflow.workflow_definition import PrebuiltWorkflowDefinition, WorkflowDefinition -from aicssegmentation.util.directories import Directories +from aicssegmentation.workflow.workflow_engine import WorkflowEngine class TestWorkflowEngine: diff --git a/aicssegmentation/tests/workflow/test_workflow_step.py b/aicssegmentation/tests/workflow/test_workflow_step.py index 1586d4d2..7457adf2 100644 --- a/aicssegmentation/tests/workflow/test_workflow_step.py +++ b/aicssegmentation/tests/workflow/test_workflow_step.py @@ -1,11 +1,11 @@ -from aicssegmentation.workflow.segmenter_function import FunctionParameter, WidgetType -import pytest import numpy as np +import pytest +from aicssegmentation.workflow.segmenter_function import FunctionParameter, WidgetType from aicssegmentation.workflow.workflow_step import ( + SegmenterFunction, WorkflowStep, WorkflowStepCategory, - SegmenterFunction, ) diff --git a/aicssegmentation/util/directories.py b/aicssegmentation/util/directories.py index 9c7b3ca2..66e6d07d 100644 --- a/aicssegmentation/util/directories.py +++ b/aicssegmentation/util/directories.py @@ -1,7 +1,7 @@ -import aicssegmentation - from pathlib import Path +import aicssegmentation + class Directories: """ diff --git a/aicssegmentation/workflow/batch_workflow.py b/aicssegmentation/workflow/batch_workflow.py index 86461b5d..08520ce9 100644 --- a/aicssegmentation/workflow/batch_workflow.py +++ b/aicssegmentation/workflow/batch_workflow.py @@ -1,12 +1,14 @@ -import numpy as np - from datetime import datetime +from pathlib import Path from typing import List, Union + +import numpy as np from aicsimageio import AICSImage from aicsimageio.writers import OmeTiffWriter -from pathlib import Path -from aicssegmentation.util.filesystem import FileSystemUtilities + from aicssegmentation.exceptions import ArgumentNullError +from aicssegmentation.util.filesystem import FileSystemUtilities + from .workflow import Workflow from .workflow_definition import WorkflowDefinition diff --git a/aicssegmentation/workflow/segmenter_function.py b/aicssegmentation/workflow/segmenter_function.py index b7e5ed3c..3b9f4c38 100644 --- a/aicssegmentation/workflow/segmenter_function.py +++ b/aicssegmentation/workflow/segmenter_function.py @@ -1,5 +1,5 @@ -from enum import Enum from dataclasses import dataclass +from enum import Enum from typing import Dict, List, Union diff --git a/aicssegmentation/workflow/workflow.py b/aicssegmentation/workflow/workflow.py index f0e6f473..2121d074 100644 --- a/aicssegmentation/workflow/workflow.py +++ b/aicssegmentation/workflow/workflow.py @@ -1,11 +1,13 @@ -import numpy as np import logging - from typing import Any, Dict, List + +import numpy as np +from napari.layers import Image + from aicssegmentation.exceptions import ArgumentNullError -from .workflow_step import WorkflowStep + from .workflow_definition import WorkflowDefinition -from napari.layers import Image +from .workflow_step import WorkflowStep log = logging.getLogger(__name__) diff --git a/aicssegmentation/workflow/workflow_config.py b/aicssegmentation/workflow/workflow_config.py index 31eaf40e..87883132 100644 --- a/aicssegmentation/workflow/workflow_config.py +++ b/aicssegmentation/workflow/workflow_config.py @@ -1,10 +1,11 @@ import json - from pathlib import Path from typing import Dict, List + from aicssegmentation.util.directories import Directories -from .segmenter_function import SegmenterFunction, FunctionParameter, WidgetType -from .workflow_definition import WorkflowDefinition, PrebuiltWorkflowDefinition + +from .segmenter_function import FunctionParameter, SegmenterFunction, WidgetType +from .workflow_definition import PrebuiltWorkflowDefinition, WorkflowDefinition from .workflow_step import WorkflowStep, WorkflowStepCategory diff --git a/aicssegmentation/workflow/workflow_definition.py b/aicssegmentation/workflow/workflow_definition.py index 6ee3d0f0..48e9be79 100644 --- a/aicssegmentation/workflow/workflow_definition.py +++ b/aicssegmentation/workflow/workflow_definition.py @@ -1,10 +1,12 @@ -import numpy as np +from dataclasses import dataclass +from typing import List +import numpy as np from aicsimageio import imread -from typing import List -from dataclasses import dataclass -from aicssegmentation.util.lazy import lazy_property + from aicssegmentation.util.directories import Directories +from aicssegmentation.util.lazy import lazy_property + from .workflow_step import WorkflowStep diff --git a/aicssegmentation/workflow/workflow_engine.py b/aicssegmentation/workflow/workflow_engine.py index 38d44139..787e6d3e 100644 --- a/aicssegmentation/workflow/workflow_engine.py +++ b/aicssegmentation/workflow/workflow_engine.py @@ -1,12 +1,14 @@ +from pathlib import Path +from typing import List, Union + import numpy as np -from typing import List, Union from aicssegmentation.exceptions import ArgumentNullError -from .workflow import Workflow + from .batch_workflow import BatchWorkflow -from .workflow_definition import WorkflowDefinition +from .workflow import Workflow from .workflow_config import WorkflowConfig -from pathlib import Path +from .workflow_definition import WorkflowDefinition class WorkflowEngine: diff --git a/aicssegmentation/workflow/workflow_step.py b/aicssegmentation/workflow/workflow_step.py index cca48eba..903f8aaf 100644 --- a/aicssegmentation/workflow/workflow_step.py +++ b/aicssegmentation/workflow/workflow_step.py @@ -1,9 +1,10 @@ import importlib -import numpy as np - from dataclasses import dataclass from enum import Enum -from typing import Dict, List, Any +from typing import Any, Dict, List + +import numpy as np + from .segmenter_function import SegmenterFunction diff --git a/pyproject.toml b/pyproject.toml index b6c4101b..5d793c41 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,4 +7,4 @@ target-version = "py39" [tool.ruff.lint] select = ["E", "F", "W", "I"] -ignore = ["E203", "W291", "W503", "W293", "E261"] \ No newline at end of file +ignore = ["E203", "W291", "W293", "E261"] \ No newline at end of file From 54389baf4ab74c42af0a45652cff23259686b58c Mon Sep 17 00:00:00 2001 From: Jianxu Chen Date: Tue, 17 Mar 2026 09:49:47 +0100 Subject: [PATCH 3/3] empty push