Last active
December 13, 2023 16:39
-
-
Save PingjunChen/677ee3d3f255219ccd8e5ea5f3983212 to your computer and use it in GitHub Desktop.
Convert SVS file to TIFF image
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
__author__ = "Pingjun Chen" | |
__email__ = "chenpingjun@gmx.com" | |
import os, sys, pdb | |
import numpy as np | |
from scipy import misc | |
import matplotlib.pyplot as plt | |
from skimage import io | |
import openslide | |
import argparse | |
def save_svs_img(slide_filename, tile_size=8192): | |
slide_file = openslide.OpenSlide(slide_filename) | |
slide_width, slide_height = slide_file.dimensions | |
# tile_arr = [] | |
slide_img = np.zeros((slide_height, slide_width, 3), np.uint8) | |
x_tile_num = int(np.floor((slide_width-1)/tile_size)) + 1 | |
y_tile_num = int(np.floor((slide_height-1)/tile_size)) + 1 | |
for iy in range(y_tile_num): | |
for ix in range(x_tile_num): | |
start_x = ix * tile_size | |
len_x = tile_size if (ix + 1) * tile_size < slide_width else (slide_width - start_x) | |
start_y = iy * tile_size | |
len_y = tile_size if (iy + 1) * tile_size < slide_height else (slide_height - start_y) | |
# tile_arr.append(((start_x, start_y), (len_x, len_y))) | |
cur_tile = slide_file.read_region(location=(start_x, start_y), level=0, size=(len_x, len_y)) | |
slide_img[start_y:start_y+len_y, start_x:start_x+len_x, :] = np.array(cur_tile)[:,:,:3] | |
slide_savename = os.path.splitext(slide_filename)[0] + '.tif' | |
# misc.imsave(slide_savename, slide_img) | |
io.imsave(slide_savename, slide_img) | |
def batch_convert_svs(slide_dir, tile_size=8192): | |
svs_list = [svs_file for svs_file in os.listdir(slide_dir) if svs_file.endswith(".svs")] | |
for ind, svs_file in enumerate(svs_list): | |
print("Processing {}/{}: {}".format(ind+1, len(svs_list), svs_file)) | |
save_svs_img(svs_file, tile_size) | |
def set_args(): | |
parser = argparse.ArgumentParser(description="load svs") | |
parser.add_argument("--filedir", type=str, default="./") | |
parser.add_argument("--filename", type=str, default="124180.svs") | |
parser.add_argument("--tile-size", type=int, default=4096) | |
args = parser.parse_args() | |
return args | |
if __name__ == '__main__': | |
args = set_args() | |
# save_svs_img(args.filename, args.tile_size) | |
batch_convert_svs(args.filedir, args.tile_size) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment