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) )
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
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)
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))