phenotypic.prefab.HeavyWatershedPipeline#
- class phenotypic.prefab.HeavyWatershedPipeline(gaussian_sigma: int = 5, gaussian_mode: str = 'reflect', gaussian_truncate: float = 4.0, watershed_footprint: Literal['auto'] | ndarray | int | None = None, watershed_min_size: int = 50, watershed_compactness: float = 0.001, watershed_connectivity: int = 1, watershed_relabel: bool = True, watershed_ignore_zeros: bool = True, border_remover_size: int = 25, circularity_cutoff: float = 0.5, texture_scale: int = 5, texture_warn: bool = False, benchmark: bool = False, **kwargs)[source]
Bases:
PrefabPipelineDetect and measure colonies using watershed segmentation for touching colonies.
A robust pipeline that uses watershed region-growing to separate touching or overlapping colonies that single-threshold methods merge into one object. Includes multi-stage preprocessing, morphological refinement, and grid alignment.
- Steps:
GaussianBlur — smooth noise
CLAHE — boost local contrast
MedianFilter — remove residual speckle
WatershedDetector — region-growing segmentation
BorderObjectRemover — remove partial edge colonies
LowCircularityRemover — remove non-circular artifacts
GridOversizedObjectRemover — remove merged multi-well objects
ReduceMultipleGridObjects — keep one colony per well
GridAligner — straighten the grid
MaskFill — fill interior holes
Measurements: MeasureShape, MeasureColor, MeasureTexture, MeasureIntensity.
- Best For:
Dense plates where colonies touch or overlap.
Late time-point plates with large, merging colonies.
Plates where Otsu detection merges adjacent colonies into single objects.
- Consider Also:
HeavyOtsuPipelinewhen colonies are well-separated.RoundPeaksPipelinefor a faster approach on round, non-touching colonies.
See also
Tutorial 8: Using Prefab Pipelines for a visual comparison of prefab pipelines. Prefab Pipelines: Which One for Which Organism for guidance on choosing a prefab pipeline.
Methods
Initializes an image processing pipeline for various image analysis tasks such as object detection, segmentation, and measurement.
The class provides an interface to process and apply a series of operations on an Image.
Applies processing to the given image and measures the results.
Apply the pipeline and progressively add layers to a napari viewer.
Apply the pipeline and capture a snapshot of the image after each operation.
Return execution times and memory usage for operations and measurements.
Deserialize a PrefabPipeline from JSON.
Get a copy of the measurements dictionary.
Get a copy of the operations dictionary.
Measures properties of a given image and optionally includes metadata.
Sets the measurements to be used for further computation.
Sets the operations to be performed.
Set the post-measurement transforms.
Serialize the pipeline configuration to JSON format.
Return (and optionally display) the root widget.
Attributes
Get pipeline description.
- Parameters:
gaussian_sigma (int)
gaussian_mode (str)
gaussian_truncate (float)
watershed_footprint (Literal['auto'] | ~numpy.ndarray | int | None)
watershed_min_size (int)
watershed_compactness (float)
watershed_connectivity (int)
watershed_relabel (bool)
watershed_ignore_zeros (bool)
border_remover_size (int)
circularity_cutoff (float)
texture_scale (int)
texture_warn (bool)
benchmark (bool)
- __init__(gaussian_sigma: int = 5, gaussian_mode: str = 'reflect', gaussian_truncate: float = 4.0, watershed_footprint: Literal['auto'] | ndarray | int | None = None, watershed_min_size: int = 50, watershed_compactness: float = 0.001, watershed_connectivity: int = 1, watershed_relabel: bool = True, watershed_ignore_zeros: bool = True, border_remover_size: int = 25, circularity_cutoff: float = 0.5, texture_scale: int = 5, texture_warn: bool = False, benchmark: bool = False, **kwargs)[source]
Initializes an image processing pipeline for various image analysis tasks such as object detection, segmentation, and measurement. This pipeline uses a combination of operations, including filtering, segmentation, and morphological processing, followed by shape, intensity, texture, and color measurements.
- Parameters:
gaussian_sigma (int, optional) – Standard deviation for Gaussian blur filter. Defaults to 5.
gaussian_mode (str, optional) – Mode parameter for Gaussian blur filter (e.g., ‘reflect’). Defaults to ‘reflect’.
gaussian_truncate (float, optional) – Truncate value for Gaussian kernel to limit its size. Defaults to 4.0.
watershed_footprint (Literal['auto'] | np.ndarray | int | None, optional) – Footprint size or structure for the watershed algorithm. Defaults to None.
watershed_min_size (int, optional) – Minimum size of the objects to be retained after watershed segmentation. Defaults to 50.
watershed_compactness (float, optional) – Compactness parameter for the watershed algorithm to control how tightly regions are formed. Defaults to 0.001.
watershed_connectivity (int, optional) – Connectivity parameter for region connectivity in watershed segmentation. Defaults to 1.
watershed_relabel (bool, optional) – Whether to relabel the regions after watershed segmentation. Defaults to True.
watershed_ignore_zeros (bool, optional) – Whether to ignore zero-valued regions in the watershed algorithm. Defaults to True.
border_remover_size (int, optional) – Size of the border in pixels to be removed during border object removal. Defaults to 25.
circularity_cutoff (float, optional) – Threshold for object circularity below which objects will be removed. Defaults to 0.5.
texture_scale (int, optional) – Scale parameter for texture measurement. Defaults to 5.
texture_warn (bool, optional) – Whether to issue warnings for invalid texture measurements. Defaults to False.
benchmark (bool, optional) – Whether to enable benchmarking of pipeline performance. Defaults to False.
**kwargs – Additional keyword arguments for parent class initialization.
- __del__()
Automatically stop tracemalloc when the object is deleted.
- __getstate__()
Prepare the object for pickling by disposing of any widgets.
This ensures that UI components (which may contain unpickleable objects like input functions or thread locks) are cleaned up before serialization.
Note
This method modifies the object state by calling dispose_widgets(). Any active widgets will be detached from the object.
- __str__() str
Return a JSON-formatted string representation of the pipeline.
The generated JSON string provides a structured representation of the object’s current state, including its operations and measurements. This output can be used for logging, debugging, or to recreate the object’s configuration in another context.
- Returns:
A JSON-formatted string that encodes the object’s current configuration in a human-readable manner. This includes the phenotypic version, pipeline name, description, and the lists of operations and measurements.
- Return type:
- apply(image: Image, inplace: bool = False, reset: bool | None = None) GridImage | Image
The class provides an interface to process and apply a series of operations on an Image. The operations are maintained in a queue and executed sequentially when applied to the given Image.
- Parameters:
image (Image) – The arr Image to be processed. The type Image refers to an instance of the Image object to which transformations are applied.
inplace (bool, optional) – A flag indicating whether to apply the transformations directly on the provided Image (True) or create a copy of the Image before performing transformations (False). Defaults to False.
reset (bool, optional) – Whether to reset the image before applying the pipeline. If None (default), uses the pipeline’s reset setting from __init__. If explicitly set to True or False, overrides the pipeline setting.
- Return type:
Union[GridImage, Image]
- apply_and_measure(image: Image, inplace: bool = False, reset: bool | None = None, include_metadata: bool = True) pd.DataFrame
Applies processing to the given image and measures the results.
This function first applies a processing method to the supplied image, adjusting it based on the given parameters. After processing, the resulting image is measured, and a DataFrame containing the measurement data is returned.
- Parameters:
image (Image) – The image to process and measure.
inplace (bool) – Whether to modify the original image directly or work on a copy. Default is False.
reset (bool, optional) – Whether to reset any previous processing on the image before applying the current method. If None (default), uses the pipeline’s reset setting. If explicitly set, overrides the pipeline setting.
include_metadata (bool) – Whether to include metadata in the measurement results. Default is True.
- Returns:
A DataFrame containing measurement data for the processed image.
- Return type:
pd.DataFrame
- apply_napari(image: Image, inplace: bool = False, reset: bool | None = None, viewer: napari.Viewer | None = None) NapariPipelineResult
Apply the pipeline and progressively add layers to a napari viewer.
Creates (or reuses) a napari viewer and adds the original image layers as a baseline, then adds the modified layer after each operation completes. Layer names follow the pattern
{step:02d}_{OperationName}_{accessor}.- Parameters:
image (Image) – The input image to process.
inplace (bool) – If
Truethe image is modified in place; otherwise a copy is made first. Defaults toFalse.reset (bool | None) – Whether to reset the image before applying operations.
None(default) uses the pipeline-level setting.viewer (napari.Viewer | None) – An existing napari viewer to add layers to. If
None(default), a new viewer is created.
- Returns:
Named tuple with the final image and the napari viewer reference.
- Return type:
NapariPipelineResult
- Raises:
ImportError – If napari is not installed.
- apply_with_intermediates(image: Image, inplace: bool = False, reset: bool | None = None, output_dir: str | Path | None = None) IntermediateResult
Apply the pipeline and capture a snapshot of the image after each operation.
Behaves identically to
apply()(respecting inplace, reset, benchmark timing, and verbose/tqdm progress) but additionally records the image state after every operation completes.- Parameters:
image (Image) – The input image to process.
inplace (bool) – If
Truethe image is modified in place; otherwise a copy is made first. Defaults toFalse.reset (Optional[bool]) – Whether to reset the image before applying operations.
None(default) uses the pipeline-level setting.output_dir (Optional[Union[str, Path]]) – Optional directory path. When provided, each intermediate image is persisted to an HDF5 file inside this directory (created automatically) and the corresponding dict value is set to
Noneto conserve memory. WhenNone, intermediates are kept in memory asImagecopies.
- Returns:
A named tuple containing the final image and a dictionary mapping operation names to intermediate snapshots (or
Nonewhen output_dir is used).- Return type:
IntermediateResult
- benchmark_results() pandas.DataFrame
Return execution times and memory usage for operations and measurements.
This method should be called after applying the pipeline on an image to get the execution times and memory consumption of the different processes.
When an operation is itself an
ImagePipelineCore(nested pipeline), its sub-operations are expanded as indented sub-rows beneath the parent entry with names like"ParentOp > ChildOp".- Returns:
- A DataFrame with columns
Process Type, Process Name,Execution Time (s),Memory Delta (MB), andRSS After (MB).
- A DataFrame with columns
- Return type:
pd.DataFrame
- property desc: str
Get pipeline description. Returns class docstring if no description set.
- classmethod from_json(json_data: str | Path | dict, benchmark: bool = False, verbose: bool = False) PrefabPipeline
Deserialize a PrefabPipeline from JSON.
PrefabPipeline subclasses build their ops/meas inside
__init__, so the basefrom_json(which passesops=directly) would conflict. This override deserializes viaImagePipelineand re-tags the instance as the correct PrefabPipeline subclass.- Parameters:
- Returns:
A PrefabPipeline (or subclass) instance with the loaded configuration.
- Return type:
- get_meas() Dict[str, MeasureFeatures]
Get a copy of the measurements dictionary.
Returns a shallow copy to prevent accidental mutation of internal state.
- Returns:
- Dictionary mapping measurement names to
MeasureFeatures instances.
- Return type:
Dict[str, MeasureFeatures]
- get_ops() Dict[str, ImageOperation]
Get a copy of the operations dictionary.
Returns a shallow copy to prevent accidental mutation of internal state.
- Returns:
- Dictionary mapping operation names to
ImageOperation instances.
- Return type:
Dict[str, ImageOperation]
- measure(image: Image, include_metadata=True) pd.DataFrame
Measures properties of a given image and optionally includes metadata. The method performs measurements using a set of predefined measurement operations. If benchmarking is enabled, the execution time of each measurement is recorded. When verbose mode is active, detailed logging of the measurement process is displayed. A progress bar is used to track progress if the tqdm library is available.
- Parameters:
image (Image) – The image object for which measurements are performed. It must support the info method and optionally a grid or objects attribute.
include_metadata (bool, optional) – Indicates whether metadata should be included in the measurements. Defaults to True.
- Returns:
- A DataFrame containing the results of all performed measurements combined
on the same index.
- Return type:
pd.DataFrame
- Raises:
Exception – An exception is raised if a measurement operation fails while being applied to the image.
- set_meas(measurements: List[MeasureFeatures] | Dict[str, MeasureFeatures])
Sets the measurements to be used for further computation. The input can be either a list of MeasureFeatures objects or a dictionary with string keys and MeasureFeatures objects as values.
The method processes the given input to construct a dictionary mapping measurement names to MeasureFeatures instances. If a list is passed, unique class names of the MeasureFeatures instances in the list are used as keys.
- Parameters:
measurements (List[MeasureFeatures] | Dict[str, MeasureFeatures]) – A collection of measurement features either as a list of MeasureFeatures objects, where class names are used as keys for dictionary creation, or as a dictionary where keys are predefined strings and values are MeasureFeatures objects.
- Raises:
TypeError – If the measurements argument is neither a list nor a dictionary.
- set_ops(ops: List[ImageOperation | ImagePipeline] | Dict[str, ImageOperation | ImagePipeline])
Sets the operations to be performed. The operations can be passed as either a list of ImageOperation or ImagePipeline instances or a dictionary mapping operation names to ImageOperation or ImagePipeline instances. This method ensures that each operation in the list has a unique name. Raises a TypeError if the input is neither a list nor a dictionary.
- Parameters:
ops (List[ImageOperation | ImagePipeline] | Dict[str, ImageOperation | ImagePipeline]) – A list of ImageOperation or ImagePipeline objects, or a dictionary where keys are operation names and values are ImageOperation or ImagePipeline objects.
- Raises:
TypeError – If the input is not a list or a dictionary.
- set_post(post: List[PostMeasurement] | Dict[str, PostMeasurement])
Set the post-measurement transforms.
- Parameters:
post (List[PostMeasurement] | Dict[str, PostMeasurement]) – A list or dictionary of PostMeasurement objects. If a list, class names are used as keys.
- Raises:
TypeError – If post is neither a list nor a dictionary.
- to_json(filepath: str | Path | None = None) str
Serialize the pipeline configuration to JSON format.
This method captures the pipeline’s operations and measurements. It excludes internal state (attributes starting with ‘_’) and pandas DataFrames to keep the serialization clean and focused on reproducible configuration.
- Parameters:
filepath (str | Path | None) – Optional path to save the JSON. If None, returns JSON string. Can be a string or Path object.
- Returns:
JSON string representation of the pipeline configuration.
- Return type:
Example
Serialize a pipeline to JSON format:
>>> from phenotypic import ImagePipeline >>> from phenotypic.detect import OtsuDetector >>> from phenotypic.measure import MeasureShape >>> pipe = ImagePipeline(pipe_cfgs=[OtsuDetector()], meas=[MeasureShape()]) >>> json_str = pipe.to_json() >>> pipe.to_json('my_pipeline.json') # Save to file
- widget(image: Image | None = None, show: bool = False) Widget
Return (and optionally display) the root widget.
- Parameters:
image (Image | None) – Optional image to visualize. If provided, visualization controls will be added to the widget.
show (bool) – Whether to display the widget immediately. Defaults to False.
- Returns:
The root widget.
- Return type:
ipywidgets.Widget
- Raises:
ImportError – If ipywidgets or IPython are not installed.