Source code for phenotypic.enhance._gaussian_subtract
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from phenotypic import Image
import numpy as np
from skimage.filters import gaussian
from phenotypic.abc_ import ImageEnhancer
[docs]
class GaussianSubtract(ImageEnhancer):
"""
Background correction by Gaussian subtraction.
Estimates a smooth background via Gaussian blur and subtracts it from the
image. For agar plate colony analysis, this removes gradual illumination
gradients (vignetting, agar thickness, scanner shading) while retaining sharp
colony features, improving downstream thresholding and edge detection.
Use cases (agar plates):
- Correct uneven lighting across plates or across scan beds.
- Enhance visibility of dark colonies on bright agar by flattening the
background.
- Normalize batches captured with varying exposure/illumination profiles.
Tuning and effects:
- sigma: Sets the spatial scale of the background. Choose a value larger than
the typical colony diameter so colonies are not treated as background. Too
small will subtract colony signal and can invert contrast around edges.
- mode/cval: Controls border handling; 'reflect' often avoids rim artifacts
on circular plates. 'constant' may require matching `cval` to background.
- truncate: Extent of the Gaussian in standard deviations; rarely needs change.
- preserve_range: Keep original intensity range after filtering; useful when
subsequent steps assume the same data range/bit depth.
Caveats:
- If sigma is too low, colonies can be attenuated or produce halos.
- Very large sigma can oversmooth and retain large shadows or plate rim effects.
- Background subtraction may re-center intensities around zero; ensure later
steps handle negative values or re-normalize if needed.
Attributes:
sigma (float): Gaussian std for background scale; use > colony diameter.
mode (str): Border handling: 'reflect', 'constant', 'nearest', 'mirror', 'wrap'.
cval (float): Fill value if `mode='constant'`.
truncate (float): Gaussian support in standard deviations.
preserve_range (bool): Preserve input value range during filtering.
"""
[docs]
def __init__(
self,
sigma: float = 50.0,
mode: str = "reflect",
cval: float = 0.0,
truncate: float = 4.0,
preserve_range: bool = True,
):
"""
Parameters:
sigma (float): Background scale. Set larger than colony diameter so
colonies are preserved while slow illumination is removed.
mode (str): Border handling; 'reflect' reduces artificial rims on plates.
cval (float): Fill value when `mode='constant'`.
truncate (float): Gaussian support in standard deviations (advanced).
preserve_range (bool): Keep the original intensity range; useful if
subsequent steps or measurements assume a specific scaling.
"""
self.sigma: float = sigma
self.mode: str = mode
self.cval: float = cval
self.truncate: float = truncate
self.preserve_range: bool = preserve_range
def _operate(self, image: Image):
background = gaussian(
image=image.enh_gray[:],
sigma=self.sigma,
mode=self.mode,
cval=self.cval,
truncate=self.truncate,
preserve_range=self.preserve_range,
)
image.enh_gray[:] = image.enh_gray[:].copy() - background
return image