如何将dzi文件转换为多块金字塔tiff格式

时间:2019-11-15 09:36:10

标签: imagemagick tiff deepzoom openseadragon openslide

参考答案(how to convert dzi (deep zoom) files to full image

我是这个主题的菜鸟,如果我错了,请更正。

我正在尝试从.dzi(深度缩放图像)格式创建多平铺tiff,我的做法是:

(i)选择最高级别文件夹。

(ii)将m行的所有n列(m_n.jpeg,我指的是以这种格式保存的图像)垂直拼接为png图像。因此它们占据了相当大的空间。

(iii)最后,我使用pyvips.Image.write_to_file()将所有这些垂直png图像水平合并为一个完整的图像png。

(iv)最后使用vis im_save将完整的图像png转换为tiff。

我现在担心的是,此过程花费了将近2个小时才能制作出30,000 base_tiles的完整图像png,而且它的大小也超过了10 GB(完整图像png)。

是否有更好,更快的方法将.dzi转换为tiff?

1 个答案:

答案 0 :(得分:1)

libvips有一个arrayjoin运算符,可以将一组图块连接在一起形成大图像。

您可以这样使用它(在linux命令行上):

vips arrayjoin "$(ls *.jpeg | sort -t_ -k2g -k1g)" x.tif[tile,pyramid,compression=jpeg] --across 20

这将把所有JPG图像加载到当前目录中,将它们组装成一个巨大的网格(横跨20个图像),并作为TIFF金字塔写入。显然,您需要检查网格的大小,并调整across参数。

$()部分按照数字顺序对x_y.jpg格式的文件名先按y,然后按x排序。没有这些,瓷砖将被烦人地换位。

假定重叠为0。如果图块重叠,则需要设置hspacingvspacing选项以控制图块的放置方式。例如:

vips arrayjoin "$(ls *.jpg | sort -t_ -k2g -k1g)" x.tif --across 20 --hspacing 254 --vspacing 254

将水平和垂直每254个像素放置磁贴。

arrayjoin必须能够打开所有输入图像,因此它需要很多文件描述符。大多数Linux默认每个进程一次最多打开1024个文件,因此您可能需要提高该数目。通常,您只需编辑几个配置文件,然后再次注销即可。我将系统设置为65536,但是您可以使用任何数字。

Windows对每个进程的硬限制为2000个文件,您不能更改。您需要在该平台上的各个部分中进行组装。

这是一个可行的示例。首先,创建一个没有重叠的Deepzoom金字塔:

john@kiwi:~/pics/x$ vips dzsave ~/pics/k2.jpg x --overlap 0
john@kiwi:~/pics/x$ cd x_files/11
john@kiwi:~/pics/x/x_files/11$ ls
0_0.jpeg  0_7.jpeg  1_5.jpeg  2_3.jpeg  3_1.jpeg  3_8.jpeg  4_6.jpeg  5_4.jpeg
0_1.jpeg  0_8.jpeg  1_6.jpeg  2_4.jpeg  3_2.jpeg  4_0.jpeg  4_7.jpeg  5_5.jpeg
0_2.jpeg  1_0.jpeg  1_7.jpeg  2_5.jpeg  3_3.jpeg  4_1.jpeg  4_8.jpeg  5_6.jpeg
0_3.jpeg  1_1.jpeg  1_8.jpeg  2_6.jpeg  3_4.jpeg  4_2.jpeg  5_0.jpeg  5_7.jpeg
0_4.jpeg  1_2.jpeg  2_0.jpeg  2_7.jpeg  3_5.jpeg  4_3.jpeg  5_1.jpeg  5_8.jpeg
0_5.jpeg  1_3.jpeg  2_1.jpeg  2_8.jpeg  3_6.jpeg  4_4.jpeg  5_2.jpeg
0_6.jpeg  1_4.jpeg  2_2.jpeg  3_0.jpeg  3_7.jpeg  4_5.jpeg  5_3.jpeg

您可以看到它是由6格和9格向下的瓦片组成的网格。

现在重新组装图块并写成TIFF金字塔:

john@kiwi:~/pics/x/x_files/11$ vips arrayjoin "$(ls *.jpeg | sort -t_ -k2g -k1g)" x.tif[tile,pyramid,compression=jpeg] --across 6
john@kiwi:~/pics/x/x_files/11$ vipsheader x.tif 
x.tif: 1524x2286 uchar, 3 bands, srgb, tiffload_stream

使用pyvips就像:

#!/usr/bin/env python3

import pyvips

tiles_across = 142
tiles_down = 150

tiles = [pyvips.Image.new_from_file(f"{x}_{y}.jpeg", access="sequential")
         for y in range(tiles_down) for x in range(tiles_across)]
im = pyvips.Image.arrayjoin(tiles, across=tiles_across)

im.write_to_file("x.jpg")

这花了大约10分钟时间和6gb的内存来连接这台笔记本电脑上的21,000张瓷砖。