Source code for phenotypic.enhance._gaussian_blur

from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from phenotypic import Image
from skimage.filters import gaussian

from ..abc_ import ImageEnhancer


[docs] class GaussianBlur(ImageEnhancer): """ Gaussian blur smoothing for plate images. Applies Gaussian smoothing to reduce high-frequency noise and minor texture on agar plates (e.g., scanner noise, agar granularity, condensation speckle). This can make colony boundaries more coherent and reduce false edges before edge detection or thresholding. Use cases (agar plates): - Suppress “salt-and-pepper” noise and minor agar texture so thresholding is driven by colony signal rather than noise. - Pre-filter before `SobelFilter` or Laplacian to avoid amplifying noise. - Slightly smooth within colonies to make segmentation more compact. Tuning and effects: - sigma: Controls blur strength. Choose below the typical colony radius to avoid merging close colonies. Too large sigma will wash out small colonies and narrow gaps between neighbors. - mode/cval: Define how edges are handled. For plates, 'reflect' usually avoids artificial dark/bright rims. 'constant' with a neutral `cval` may be useful for cropped regions. - truncate: Larger values include more of the Gaussian tail (slightly slower) with subtle effect on smoothness near edges. Caveats: - Excessive blur merges adjacent colonies and reduces edge sharpness. - Do not rely on blur to fix illumination gradients; prefer background subtraction (e.g., `GaussianSubtract` or `RollingBallRemoveBG`). Attributes: sigma (int): Standard deviation of the Gaussian kernel (blur strength). mode (str): Edge handling: 'reflect', 'constant', or 'nearest'. cval (float): Fill value when `mode='constant'`. truncate (float): Radius of kernel in standard deviations; kernel is truncated beyond this distance. """
[docs] def __init__( self, sigma: int = 2, *, mode: str = "reflect", cval=0.0, truncate: float = 4.0 ): """ Parameters: sigma (int): Blur strength; start near 1–3 for high-resolution scans. Keep below the colony radius to avoid merging colonies. mode (str): Boundary handling. 'reflect' is a safe default for plates; 'constant' may require setting `cval` close to background. cval (float): Constant fill value when `mode='constant'`. truncate (float): Kernel extent in standard deviations. Rarely needs adjustment; larger values slightly widen the effective kernel. """ if isinstance(sigma, int): self.sigma = sigma else: raise TypeError("sigma must be an integer") if mode in ["reflect", "constant", "nearest"]: self.mode = mode else: raise ValueError('mode must be one of "reflect", "constant", "nearest"') self.cval = cval self.truncate = truncate
def _operate(self, image: Image) -> Image: image.enh_gray[:] = gaussian( image=image.enh_gray[:], sigma=self.sigma, mode=self.mode, truncate=self.truncate, cval=self.cval, channel_axis=-1, ) return image