def test_macenko_normalization(self):
        """Test macenko_pca normalization."""
        stain_unmixing_routine_params = {
            'stains': ['hematoxylin', 'eosin'],
            'stain_unmixing_method': 'macenko_pca',
        }

        print("Macenko - Unmasked, using default, 'idealized' W_target")
        tissue_rgb_normalized = deconvolution_based_normalization(
            tissue_rgb,
            stain_unmixing_routine_params=stain_unmixing_routine_params)
        self.assertTupleEqual(tuple(
            [int(tissue_rgb_normalized[..., i].mean()) for i in range(3)]),
            (192, 161, 222)
        )

        print("Macenko - Unmasked, using W_target from good image")
        tissue_rgb_normalized = deconvolution_based_normalization(
            tissue_rgb, W_target=W_target,
            stain_unmixing_routine_params=stain_unmixing_routine_params)
        self.assertTupleEqual(tuple(
            [int(tissue_rgb_normalized[..., i].mean()) for i in range(3)]),
            (198, 163, 197)
        )

        print("Macenko - Masked, using W_target from good image")
        tissue_rgb_normalized = deconvolution_based_normalization(
            tissue_rgb, W_target=W_target, mask_out=mask_out,
            stain_unmixing_routine_params=stain_unmixing_routine_params)
        self.assertTupleEqual(tuple(
            [int(tissue_rgb_normalized[..., i].mean()) for i in range(3)]),
            (194, 172, 201)
        )
Example #2
0
def return_norm_image(img, mask, W_source=None, W_target=None):
    img = deconvolution_based_normalization(
        img,
        W_source=W_source,
        W_target=W_target,
        im_target=None,
        stains=['hematoxylin', 'eosin'],
        mask_out=~mask,
        stain_unmixing_routine_params={"I_0": 215})
    return img
Example #3
0
    def test_macenko_normalization(self):
        """Test macenko_pca normalization."""
        stain_unmixing_routine_params = {
            'stains': ['hematoxylin', 'eosin'],
            'stain_unmixing_method': 'macenko_pca',
        }

        # TCGA-A2-A3XS-DX1_xmin21421_ymin37486_.png, Amgad et al, 2019)
        # for macenco (obtained using rgb_separate_stains_macenko_pca()
        # and using reordered such that columns are the order:
        # Hamtoxylin, Eosin, Null
        W_target = np.array([[0.5807549, 0.08314027, 0.08213795],
                             [0.71681094, 0.90081588, 0.41999816],
                             [0.38588316, 0.42616716, -0.90380025]])

        # Macenko - Unmasked, using default, 'idealized' W_target"
        tissue_rgb_normalized = deconvolution_based_normalization(
            cfg.tissue_rgb,
            stain_unmixing_routine_params=stain_unmixing_routine_params)
        assert tuple([
            int(tissue_rgb_normalized[..., i].mean()) for i in range(3)
        ]) == (182, 121, 211)

        # Macenko - Unmasked, using W_target from good image
        tissue_rgb_normalized = deconvolution_based_normalization(
            cfg.tissue_rgb,
            W_target=W_target,
            stain_unmixing_routine_params=stain_unmixing_routine_params)
        assert tuple([
            int(tissue_rgb_normalized[..., i].mean()) for i in range(3)
        ]) == (187, 124, 175)

        # Macenko - Masked, using W_target from good image
        tissue_rgb_normalized = deconvolution_based_normalization(
            cfg.tissue_rgb,
            W_target=W_target,
            mask_out=cfg.mask_out,
            stain_unmixing_routine_params=stain_unmixing_routine_params)
        assert tuple([
            int(tissue_rgb_normalized[..., i].mean()) for i in range(3)
        ]) == (187, 125, 174)
Example #4
0
def colornorm(self, image_location, save_location, img_file):

    # color norm. standard (from TCGA-A2-A3XS-DX1, Amgad et al, 2019)
    cnorm = {
        'mu': np.array([8.74108109, -0.12440419, 0.0444982]),
        'sigma': np.array([0.6135447, 0.10989545, 0.0286032]),
    }

    # TCGA-A2-A3XS-DX1_xmin21421_ymin37486_.png, Amgad et al, 2019)
    # for macenco (obtained using rgb_separate_stains_macenko_pca()
    # and reordered such that columns are the order:
    # Hamtoxylin, Eosin, Null
    W_target = np.array([[0.5807549, 0.08314027, 0.08213795],
                         [0.71681094, 0.90081588, 0.41999816],
                         [0.38588316, 0.42616716, -0.90380025]])

    # specify stains of input image
    stains = [
        'hematoxylin',  # nuclei stain
        'eosin',  # cytoplasm stain
        'null'
    ]  # set to null if input contains only two stains

    imInput = skimage.io.imread(os.path.join(image_location,
                                             img_file))[:, :, :3]

    stain_unmixing_routine_params = {
        'stains': ['hematoxylin', 'eosin'],
        'stain_unmixing_method': 'macenko_pca',
    }
    im_norm = deconvolution_based_normalization(
        imInput,
        W_target=W_target,
        stain_unmixing_routine_params=stain_unmixing_routine_params)

    stain_color_map = htk.preprocessing.color_deconvolution.stain_color_map

    # create stain matrix
    W = np.array([stain_color_map[st] for st in stains]).T

    # perform standard color deconvolution
    imDeconvolved = htk.preprocessing.color_deconvolution.color_deconvolution(
        im_norm, W)

    norm = Image.fromarray(im_norm)
    norm_bw = norm.convert('L')
    imDeconvolved.Stains[:, :, 2] = np.array(norm_bw)
    decon = Image.fromarray(imDeconvolved.Stains)

    norm.save(os.path.join(save_location + '_norm', img_file))
    norm_bw.save(os.path.join(save_location + '_bw', img_file))
    decon.save(os.path.join(save_location + '_decon', img_file))