因课题需要处理tiff格式的病理切片文件,在用openslide读取时发现tiff只有一个最大分辨率下的level dimension,不方便后续处理。
因此需要将tiff改成openslide支持的generic tiled tiff,具体步骤如下:
根据官方引导下载vips,博主用的MacOS,所以直接brew install vips就可以了嘿嘿
下载成功后在命令行输入
vips tiffsave input.tif output.tif —-compression jpeg —-tile —-pyramid
input.tif对应原tif文件的路径,output.tif对应生成文件的路径
为方便批量转换,简单写了个shell脚本
#!/bin/zsh
for FILE in $(ls ori_tif_dir)
do
input_file="./ori_tif_dir/${FILE}"
output_file="./new_tif_dir/${FILE}"
# echo ${input_file}
echo "${FILE} is processing..."
vips tiffsave ${input_file} ${output_file} --compression jpeg --tile --pyramid
done
另:如果tiff本身就已经是金字塔格式,只想把它从opslide.imageslide改成opslide.openslide,则可以用如下命令(作者的终端默认的是zsh的shell,所以添加了双引号)
vips openslideload input.tif “output.tif[tile,compression=jpeg]”
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一年之后更新一下,为方便win系统和python使用,分别提供以上两个功能命令可直接在win下运行的python代码(感谢爱喝奶盖的SONG友情提供)
# tif转金字塔
import os, subprocess
for root, dirs, files in os.walk("path/to/old_tif_dir", topdown=False):
for name in files:
if name[0] != '.' and name[-1] != 'l':
file = os.path.join(root, name)
output_file = 'path/to/new_tif_dir/' + name
command = 'path/to/vips_dir/vips-dev-w64-all-8.15.0/vips-dev-8.15/bin/vips.exe tiffsave '+ file + ' ' + output_file +' --tile --compression jpeg'
try:
subprocess.run(command, check=True, shell=True)
print(file+' is done!')
except:
print('Wrong')
# openslide.imageslide 转 openslide.openslide
import os, subprocess
for root, dirs, files in os.walk("path/to/old_tif_dir", topdown=False):
for name in files:
if name[0] != '.' and name[-1] != 'l':
file = os.path.join(root, name)
output_file = 'path/to/new_tif_dir/' + name
command = 'path/to/vips_dir/vips-dev-w64-all-8.15.0/vips-dev-8.15/bin/vips.exe openslideload '+ file + ' ' + output_file +'[tile,compression=jpeg]'
try:
subprocess.run(command, check=True, shell=True)
print(file+' is done!')
except:
print('Wrong')