如何将天珠文件转换为多层金字塔 tiff 格式

how to convert dzi files to multi-tile pyramidal tiff format

参考答案()

本人对这个话题一窍不通,如有不妥请指正

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

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

(ii) 将m行的n列全部垂直拼接(m_n.jpeg,我指的是这种格式保存的图片)为png图片。所以他们占据了相当多的space.

(iii) 最后,我使用 pyvips.Image.write_to_file().

将所有这些垂直 png 图像水平合并为单个完整图像 png

(iv) 最后使用 vips im_save,我将完整图像 png 转换为 tiff。

我现在担心的是,这个过程花费了将近 2 个小时来制作 30,000 base_tiles 的完整图像 png,而且它占 10+ GB 的大小(完整图像 png)。

有没有更好更快的方法将 .dzi 转换为 tiff?

libvips has an arrayjoin 运算符,可以将一组图块连接成一个大图像。

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

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

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

$() 部分首先按 y,然后按数字顺序对 x_y.jpg 形式的文件名进行排序。否则,瓷砖将被调换,令人讨厌。

假设重叠为 0。如果您的图块有重叠,您需要设置 hspacingvspacing 选项来控制图块的定位方式。例如:

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

将在水平和垂直方向上每 254 个像素定位一次图块。

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

Windows 每个进程有 2000 个文件的硬性限制,您无法更改。您需要 assemble 在该平台上的部分。

这是一个有效的例子。首先,创建一个没有重叠的 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 横的瓷砖组成的网格。

现在重新assemble 瓷砖并写成 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")

在这台笔记本电脑上加入 21,000 个图块需要大约 10 分钟和 6gb 的内存。