from __future__ import annotations # Clear logger to use tiatoolbox.logger import logging if logging.getLogger().hasHandlers(): logging.getLogger().handlers.clear() from pathlib import Path import matplotlib as mpl import matplotlib.pyplot as plt import requests import skimage.color from tiatoolbox import data, logger from tiatoolbox.tools import stainnorm from tiatoolbox.wsicore import wsireader from PIL import Image import numpy as np stain_normalization_wsi_examples = [['images/sample_wsi_small.svs']] def normalize_stain(source_wsi_file, output): # create a file handler wsi_reader = wsireader.WSIReader.open(input_img=source_wsi_file.name) wsi_info = wsi_reader.info.as_dict() # we will print out each info line by line print(*list(wsi_info.items()), sep="\n") # noqa: T201 wsi_thumb = wsi_reader.slide_thumbnail(resolution=1.25, units="power") sample = wsi_reader.read_region( location=[800, 1600], level=0, size=[800, 800], # in X, Y ) target_image = data.stain_norm_target() method_name_list = ["Reinhard", "Ruifrok", "Macenko", "Vahadane"] plt.subplot(2, 3, 1) plt.imshow(sample) plt.title("Source Image") plt.axis("off") plt.subplot(2, 3, 4) plt.imshow(target_image) plt.title("Target Image") plt.axis("off") pos = [2, 3, 5, 6] for idx, method_name in enumerate(method_name_list): stain_normalizer = stainnorm.get_normalizer(method_name) stain_normalizer.fit(target_image) normed_sample = stain_normalizer.transform(sample.copy()) plt.subplot(2, 3, pos[idx]) plt.imshow(normed_sample) plt.title(method_name.capitalize()) plt.axis("off") plt.tight_layout() # plt.show() img = plt.savefig('images/test.png') image = Image.open('images/test.png') numpy_array = np.array(image) return numpy_array