kfb-svs转换工具
一、Whole Slide Image-WSI 基础及切割
参考链接https://zhuanlan.zhihu.com/p/346725676
pip install histolab
from histolab.data import prostate_tissue, ovarian_tissue
prostate_svs, prostate_path = prostate_tissue()
ovarian_svs, ovarian_path = ovarian_tissue()
from histolab.slide import Slide
import os
BASE_PATH = os.getcwd()
PROCESS_PATH_PROSTATE = os.path.join(BASE_PATH, 'prostate', 'processed')
PROCESS_PATH_OVARIAN = os.path.join(BASE_PATH, 'ovarian', 'processed')
prostate_slide = Slide(prostate_path, processed_path=PROCESS_PATH_PROSTATE)
ovarian_slide = Slide(ovarian_path, processed_path=PROCESS_PATH_OVARIAN)
#显示图片信息(名称、层数、各层维度)
print(f"Slide name: {prostate_slide.name}")
print(f"Levels: {prostate_slide.levels}")
print(f"Dimensions at level 0: {prostate_slide.dimensions}")
print(f"Dimensions at level 1: {prostate_slide.level_dimensions(level=1)}")
print(f"Dimensions at level 2: {prostate_slide.level_dimensions(level=2)}")
#Slide name: TCGA-CH-5753-01A-01-BS1.4311c533-f9c1-4c6f-8b10-922daa3c2e3e
#Levels: [0, 1, 2]
#Dimensions at level 0: (16000, 15316)
#Dimensions at level 1: (4000, 3829)
#Dimensions at level 2: (2000, 1914)
print(f"Slide name: {ovarian_slide.name}")
print(f"Levels: {ovarian_slide.levels}")
print(f"Dimensions at level 0: {ovarian_slide.dimensions}")
print(f"Dimensions at level 1: {ovarian_slide.level_dimensions(level=1)}")
print(f"Dimensions at level 2: {ovarian_slide.level_dimensions(level=2)}")
#Slide name: TCGA-13-1404-01A-01-TS1.cecf7044-1d29-4d14-b137-821f8d48881e
#Levels: [0, 1, 2]
#Dimensions at level 0: (30001, 33987)
#Dimensions at level 1: (7500, 8496)
#Dimensions at level 2: (1875, 2124)
#图片展示
prostate_slide.show()
ovarian_slide.show()
import openslide
import numpy as np
from IPython.display import display
import cv2
def display_wsi_info_and_level(wsi_path, level):
# 打开 WSI 文件
slide = openslide.open_slide(wsi_path)
# 获取 WSI 的尺寸
width, height = slide.dimensions
print("WSI尺寸:{}x{}".format(width, height))
# 获取 WSI 的 level 数量
num_levels = slide.level_count
dimensions = slide.level_dimensions
print("WSI Level数量:", num_levels)
print("WSI Level明细:", dimensions)
#获取WSI元数据,读取相关信息
if 'aperio.AppMag' in slide.properties.keys():
level_0_magnification = int(slide.properties['aperio.AppMag'])
elif 'openslide.mpp-x' in slide.properties.keys():
level_0_magnification = 40 if int(np.floor(float(slide.properties['openslide.mpp-x']) * 10)) == 2 else 20
else:
level_0_magnification = 40
#输出level0对应的放大倍数
print("level_0对应的放大倍数为:",level_0_magnification)
magnification = 5
# 根据levle0放大倍数和指定需要的放大倍数计算放大倍率,比如level0的放大倍数如果是40倍,那么想要5倍的话,下采样率就是40/5=8
downsample = level_0_magnification/5
# 获取与该下采样率对应的放大倍数最接近的 Level级别
level = slide.get_best_level_for_downsample(downsample)
# 打印 Level
print("{}倍放大倍率对应Level_{}".format(magnification,level))
# 显示出对应 level 的图像数据
image = slide.read_region((0, 0), slide.level_count - 5, slide.level_dimensions[5])
# 调用电脑相册显示图像
image.show()
# 直接在notebook上显示图像
display(image)
image = cv2.cvtColor(np.array(image), cv2.COLOR_RGBA2BGR) # 转换为 OpenCV 格式的图像
# 保存图像为普通的图像文件
output_path = 'path_to_output_image.jpg' # 替换为输出图像的路径
cv2.imwrite(output_path, image)
# 指定 WSI 文件路径和选择的 level
wsi_path = r"C:\Usersy\Desktop\detect_example\all\B2015\B2015.svs"
selected_level = 0
# 调用函数进行显示
display_wsi_info_and_level(wsi_path, selected_level)
-Random Extraction
from histolab.tiler import RandomTiler
random_tiles_extractor = RandomTiler(
tile_size=(128, 128),
n_tiles=30,
level=2,
seed=42,
check_tissue=True, # default
tissue_percent=80.0, # default
prefix="random/", # save tiles in the "random" subdirectory of slide's processed_path
suffix=".png" # default
)
random_tiles