【问题标题】:libvips / pyvips access small sections of a multi-channel tiff (OME-Tiff)libvips / pyvips 访问多通道 tiff (OME-Tiff) 的一小部分
【发布时间】:2020-10-22 16:45:16
【问题描述】:

想知道是否有一种快速的方法可以使用 pyvips / libvips 返回 ome-tiff 文件的给定通道的特定像素范围。 crop 不允许指定频道。

我的 OME-Tiff 很大 (10 GB+),所以我不想将整个图像加载到内存中。

接受任何建议和/或其他工作流程。

【问题讨论】:

  • 您可以通过tifffilezarr 数组或组的形式延迟访问数据。例如。 zarr.open(tifffile.imread('multi-channel-z-series.ome.tif', aszarr=True), mode='r')[1, 1:4, 32:64, 32:64].

标签: python image-processing tiff vips


【解决方案1】:

pyvips 支持多页文档作为“厕所卷”图像(抱歉)。您将n=-1 设置为加载所有页面,它们显示为非常高、薄的图像,页面垂直堆叠。元数据项page-height 给出了每张纸的高度(以像素为单位)。

这里的文档:

https://libvips.github.io/libvips/API/current/VipsForeignSave.html#vips-tiffload

例如:

$ vipsheader -a multi-channel-z-series.ome.tif 
multi-channel-z-series.ome.tif: 439x167 char, 1 band, b-w, tiffload
width: 439
height: 167
bands: 1
format: char
coding: none
interpretation: b-w
xoffset: 0
yoffset: 0
xres: 0
yres: 0
filename: multi-channel-z-series.ome.tif
vips-loader: tiffload
n-pages: 15
image-description: <?xml version="1.0" encoding="UTF-8"?><!-- Warning: this comment is an OME-XML metadata block, which contains crucial dimensional parameters and other important metadata. Please edit cautiously (if at all), and back up the original data before doing so...
resolution-unit: cm
orientation: 1

您可以看到这是一个 15 页的 OME 图像。 pyvips 默认会加载第 0 页,每页为 439 x 167 像素。您可以在image-description 中获取 XML 以查看完整的 OME 频道元数据。

$ vipsheader -f image-description multi-channel-z-series.ome.tif
<?xml version="1.0" encoding="UTF-8"?>
<!--- ... etc.

在 Python 中你可以这样做:

$ python3
Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyvips
>>> x = pyvips.Image.new_from_file("multi-channel-z-series.ome.tif", n=-1)
>>> x.size
>>> x.width
439
>>> x.height
2505
>>> x.get("page-height")
167
>>> x.height / x.get("page-height")
15.0

因此,您可以使用crop 以显而易见的方式从频道中获取矩形。

您是否打算为 ML 训练生成补丁?如果你是,fetch 可以比crop 快得多小补丁。 This issue 有示例代码和一些基准测试 --- 在该示例中,crop 需要 41 秒来制作 12,000 个 32x32 补丁,但 fetch 只需 0.5 秒。

【讨论】:

  • 感谢 John,感谢您对图书馆的所有权。快速提问——如果我只是想加载第 n 个通道,我可以给 n=10 加载第 10 个通道,还是更快地执行 n=-1 并进行垂直偏移数学运算。
  • Nvm -- 我看到 n 是页数。
  • 使用page=10 只拉出第10 页,使用n= 设置要获取的页数。瓦片是按需解压缩的,因此它不会对运行时产生太大影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多