全视野图像WSI都比较大,通常为10w×10w左右。为了能用他来训练算法需要将其剪切为瓦片(patch)。之前用GDAL切但是切的很慢。找了好久终于找到了使用python_openslide的用法,记录一下。
效果目的:将11w×8.5w像素、1.5G的tif图切成512*512大小,切出来应该有3.8w左右个patch。
python_openslide:把WSI(patch文件夹与WSI在同一目录)放在不同盘处理的速度不同,经过尝试得到数据(初始patch生成速度和最后patch生成速度数值上等于patch文件夹中按patch修改日期排序的第二分钟的文件数量和倒数第二分钟的文件数量):
| WSI及patch位置 | 初始patch生成速度 | 最后patch生成速度 | 全程用时 |
|---|---|---|---|
| C盘 | 3724张/分钟 | 3280张/分钟 | 11分钟 |
| D盘 | 2650张/分钟 | 1337张/分钟 | 25分钟 |
| 移动硬盘 | 2092张/分钟 | 445张/分钟 | 59分钟 |
切出来有36.5G。
速度差别还挺大的,应该是硬盘读取速度的原因吧。
上代码:
import openslide
import numpy as np
import imageio # 用于保存瓦片
slide = openslide.OpenSlide("H:\qiepian\qiepian\52001488-3.tif")
dst_path = 'H:\qiepian\openslide_patch512\'
[m, n] = slide.dimensions # 得出高倍下的(宽,高)
print(m, n)
N = 512
ml = N * m//N
nl = N * n//N
for i in range(0, ml, N): # 这里由于只是想实现剪切功能,暂时忽略边缘不足N*N的部分
for j in range(0, nl, N):
im = np.array(slide.read_region((i, j), 0, (N, N)))
imageio.imwrite(dst_path + str(i) + '-' + str(j) + '.tif', im) # patch命名为‘x-y’
slide.close() # 关闭文件
C++_GDAL:
代码及效果见另一篇博客。
点个赞再走~~~~



