glasscut.stain_normalizers package¶
Submodules¶
glasscut.stain_normalizers.base module¶
Base classes for stain normalization.
This module provides abstract base classes and mixins for implementing stain normalization strategies in histopathology image processing.
- class glasscut.stain_normalizers.base.StainNormalizer[source]¶
Bases:
ABCAbstract base class for stain normalization strategies.
Stain normalization is a crucial preprocessing step in digital pathology to reduce color variations caused by staining protocols and imaging conditions.
Subclasses must implement the fit and transform methods.
- class glasscut.stain_normalizers.base.TransformerStainMatrixMixin[source]¶
Bases:
objectMixin implementing fit/transform for matrix-based stain normalizers.
This mixin assumes the subclass implements a stain_matrix method that returns a 3×3 stain matrix.
- fit(target_image, **kwargs)[source]¶
Fit stain normalizer using target image.
- Parameters:
target_image (Image.Image) – Target image for stain normalization. Can be RGB or RGBA.
**kwargs – Additional arguments passed to stain_matrix method. Commonly includes background_intensity (int, default 240).
- Return type:
None
- transform(image, **kwargs)[source]¶
Normalize staining of image.
- Parameters:
image (Image.Image) – Image to normalize. Can be RGB or RGBA.
**kwargs – Additional arguments passed to stain_matrix method. Commonly includes background_intensity (int, default 240).
- Returns:
Image with normalized stain.
- Return type:
Image.Image
- abstractmethod stain_matrix(img_rgb, background_intensity=240, **kwargs)[source]¶
Calculate stain matrix for image.
- Parameters:
img_rgb (Image.Image) – Input image.
background_intensity (int, optional) – Background transmitted light intensity. Default is 240.
**kwargs – Additional arguments specific to the normalization method.
- Returns:
Stain matrix of image. Shape (3, 3).
- Return type:
np.ndarray
glasscut.stain_normalizers.macenko module¶
- class glasscut.stain_normalizers.macenko.MacenkoStainNormalizer[source]¶
Bases:
TransformerStainMatrixMixin,StainNormalizerStain normalizer using M. Macenko et al.’s method.
This method performs unsupervised color deconvolution to identify stain vectors, then normalizes stain concentrations to a reference image. It works well for standard H&E stained histopathology images.
The algorithm: 1. Converts image to optical density (OD) space 2. Performs principal component analysis on OD values 3. Identifies stain vectors using angular decomposition 4. Normalizes stain concentrations to match reference
Examples
>>> from PIL import Image >>> from glasscut.stain_normalizers import MacenkoStainNormalizer >>> normalizer = MacenkoStainNormalizer() >>> ref_image = Image.open("reference.png") >>> normalizer.fit(ref_image) >>> test_image = Image.open("test.png") >>> normalized_image = normalizer.transform(test_image)
- stain_color_map = {'dab': array([0.27, 0.57, 0.78]), 'eosin': array([0.07, 0.99, 0.11]), 'hematoxylin': array([0.65, 0.7 , 0.29]), 'null': array([0., 0., 0.])}¶
- stain_matrix(img_rgb, background_intensity=240, **kwargs)[source]¶
Estimate stain matrix using Macenko’s method.
- Parameters:
img_rgb (PIL.Image.Image) – Input image in RGB or RGBA format.
background_intensity (int, optional) – Background transmitted light intensity. Default is 240.
**kwargs – Additional keyword arguments.
alpha (int, optional) – Minimum angular percentile. Default is 1.
beta (float, optional) – Threshold for OD magnitude filtering. Default is 0.15.
stains (list of str, optional) – List of stain names in order. Default is
["hematoxylin", "eosin"].
- Returns:
Calculated 3×3 stain matrix with stain vectors as columns.
- Return type:
np.ndarray
- Raises:
ValueError – If stains is not a 2-element list.
ValueError – If image is not RGB or RGBA.
glasscut.stain_normalizers.reinhardt module¶
- class glasscut.stain_normalizers.reinhardt.ReinhardtStainNormalizer[source]¶
Bases:
StainNormalizerStain normalizer using E. Reinhardt et al.’s color transfer method.
This method normalizes stain appearance by matching the mean and standard deviation of each channel in LAB color space between source and target images. The normalization is performed only on tissue regions.
The algorithm is: 1. Identify tissue using tissue masking 2. Convert to LAB color space 3. Compute per-channel mean and std on tissue 4. Normalize source statistics to match target statistics 5. Convert back to RGB
- target_means¶
Target mean values per LAB channel.
- Type:
np.ndarray or None
- target_stds¶
Target standard deviation values per LAB channel.
- Type:
np.ndarray or None
Notes
This method is computationally fast and suitable for real-time preview during stain normalization parameter tuning. However, it may not preserve color relationships as well as matrix-based methods for complex stains.
Examples
>>> from PIL import Image >>> from glasscut.stain_normalizers import ReinhardtStainNormalizer >>> normalizer = ReinhardtStainNormalizer() >>> ref_image = Image.open("reference.png") >>> normalizer.fit(ref_image) >>> test_image = Image.open("test.png") >>> normalized_image = normalizer.transform(test_image)
- fit(target_image, **kwargs)[source]¶
Fit stain normalizer using target image.
- Parameters:
target_image (Image.Image) – Target image for stain normalization. Can be RGB or RGBA.
**kwargs – Additional arguments (unused for Reinhardt method).
- Return type:
None
- transform(image, **kwargs)[source]¶
Normalize staining of image.
- Parameters:
image (Image.Image) – Image to normalize. Can be RGB or RGBA.
**kwargs – Additional arguments (unused for Reinhardt method).
- Returns:
Image with normalized stain.
- Return type:
Image.Image
- static rgb_to_lab(img_rgb)[source]¶
Convert RGB image to LAB color space.
- Parameters:
img_rgb (Image.Image) – Input image in RGB or RGBA format.
- Returns:
Array representation of the image in LAB space.
- Return type:
np.ndarray
- Raises:
ValueError – If the input image is grayscale.
Module contents¶
Stain normalization module for histopathology image preprocessing.
This module provides multiple stain normalization methods to standardize color variations in histological images, which is critical for downstream analysis and computer vision tasks.
Available Methods¶
MacenkoStainNormalizer: Unsupervised color deconvolution-based method, well-suited for H&E stained images. Fast and robust.
ReinhardtStainNormalizer: Color transfer-based method, computationally efficient and good for interactive normalization.
References
For method details, see the docstrings of individual normalizer classes.
Examples
Basic usage with Macenko normalizer:
>>> from PIL import Image
>>> from glasscut.stain_normalizers import MacenkoStainNormalizer
>>> normalizer = MacenkoStainNormalizer()
>>> reference_image = Image.open("reference.png")
>>> normalizer.fit(reference_image)
>>> test_image = Image.open("test.png")
>>> normalized = normalizer.transform(test_image)
Usage with Reinhardt normalizer:
>>> from glasscut.stain_normalizers import ReinhardtStainNormalizer
>>> normalizer = ReinhardtStainNormalizer()
>>> normalizer.fit(reference_image)
>>> normalized = normalizer.transform(test_image)
- class glasscut.stain_normalizers.StainNormalizer[source]¶
Bases:
ABCAbstract base class for stain normalization strategies.
Stain normalization is a crucial preprocessing step in digital pathology to reduce color variations caused by staining protocols and imaging conditions.
Subclasses must implement the fit and transform methods.
- class glasscut.stain_normalizers.TransformerStainMatrixMixin[source]¶
Bases:
objectMixin implementing fit/transform for matrix-based stain normalizers.
This mixin assumes the subclass implements a stain_matrix method that returns a 3×3 stain matrix.
- fit(target_image, **kwargs)[source]¶
Fit stain normalizer using target image.
- Parameters:
target_image (Image.Image) – Target image for stain normalization. Can be RGB or RGBA.
**kwargs – Additional arguments passed to stain_matrix method. Commonly includes background_intensity (int, default 240).
- Return type:
None
- transform(image, **kwargs)[source]¶
Normalize staining of image.
- Parameters:
image (Image.Image) – Image to normalize. Can be RGB or RGBA.
**kwargs – Additional arguments passed to stain_matrix method. Commonly includes background_intensity (int, default 240).
- Returns:
Image with normalized stain.
- Return type:
Image.Image
- abstractmethod stain_matrix(img_rgb, background_intensity=240, **kwargs)[source]¶
Calculate stain matrix for image.
- Parameters:
img_rgb (Image.Image) – Input image.
background_intensity (int, optional) – Background transmitted light intensity. Default is 240.
**kwargs – Additional arguments specific to the normalization method.
- Returns:
Stain matrix of image. Shape (3, 3).
- Return type:
np.ndarray
- class glasscut.stain_normalizers.MacenkoStainNormalizer[source]¶
Bases:
TransformerStainMatrixMixin,StainNormalizerStain normalizer using M. Macenko et al.’s method.
This method performs unsupervised color deconvolution to identify stain vectors, then normalizes stain concentrations to a reference image. It works well for standard H&E stained histopathology images.
The algorithm: 1. Converts image to optical density (OD) space 2. Performs principal component analysis on OD values 3. Identifies stain vectors using angular decomposition 4. Normalizes stain concentrations to match reference
Examples
>>> from PIL import Image >>> from glasscut.stain_normalizers import MacenkoStainNormalizer >>> normalizer = MacenkoStainNormalizer() >>> ref_image = Image.open("reference.png") >>> normalizer.fit(ref_image) >>> test_image = Image.open("test.png") >>> normalized_image = normalizer.transform(test_image)
- stain_color_map = {'dab': array([0.27, 0.57, 0.78]), 'eosin': array([0.07, 0.99, 0.11]), 'hematoxylin': array([0.65, 0.7 , 0.29]), 'null': array([0., 0., 0.])}¶
- stain_matrix(img_rgb, background_intensity=240, **kwargs)[source]¶
Estimate stain matrix using Macenko’s method.
- Parameters:
img_rgb (PIL.Image.Image) – Input image in RGB or RGBA format.
background_intensity (int, optional) – Background transmitted light intensity. Default is 240.
**kwargs – Additional keyword arguments.
alpha (int, optional) – Minimum angular percentile. Default is 1.
beta (float, optional) – Threshold for OD magnitude filtering. Default is 0.15.
stains (list of str, optional) – List of stain names in order. Default is
["hematoxylin", "eosin"].
- Returns:
Calculated 3×3 stain matrix with stain vectors as columns.
- Return type:
np.ndarray
- Raises:
ValueError – If stains is not a 2-element list.
ValueError – If image is not RGB or RGBA.
- class glasscut.stain_normalizers.ReinhardtStainNormalizer[source]¶
Bases:
StainNormalizerStain normalizer using E. Reinhardt et al.’s color transfer method.
This method normalizes stain appearance by matching the mean and standard deviation of each channel in LAB color space between source and target images. The normalization is performed only on tissue regions.
The algorithm is: 1. Identify tissue using tissue masking 2. Convert to LAB color space 3. Compute per-channel mean and std on tissue 4. Normalize source statistics to match target statistics 5. Convert back to RGB
- target_means¶
Target mean values per LAB channel.
- Type:
np.ndarray or None
- target_stds¶
Target standard deviation values per LAB channel.
- Type:
np.ndarray or None
Notes
This method is computationally fast and suitable for real-time preview during stain normalization parameter tuning. However, it may not preserve color relationships as well as matrix-based methods for complex stains.
Examples
>>> from PIL import Image >>> from glasscut.stain_normalizers import ReinhardtStainNormalizer >>> normalizer = ReinhardtStainNormalizer() >>> ref_image = Image.open("reference.png") >>> normalizer.fit(ref_image) >>> test_image = Image.open("test.png") >>> normalized_image = normalizer.transform(test_image)
- fit(target_image, **kwargs)[source]¶
Fit stain normalizer using target image.
- Parameters:
target_image (Image.Image) – Target image for stain normalization. Can be RGB or RGBA.
**kwargs – Additional arguments (unused for Reinhardt method).
- Return type:
None
- transform(image, **kwargs)[source]¶
Normalize staining of image.
- Parameters:
image (Image.Image) – Image to normalize. Can be RGB or RGBA.
**kwargs – Additional arguments (unused for Reinhardt method).
- Returns:
Image with normalized stain.
- Return type:
Image.Image
- static rgb_to_lab(img_rgb)[source]¶
Convert RGB image to LAB color space.
- Parameters:
img_rgb (Image.Image) – Input image in RGB or RGBA format.
- Returns:
Array representation of the image in LAB space.
- Return type:
np.ndarray
- Raises:
ValueError – If the input image is grayscale.