libvips/pyvips访问多通道tiff(OMETiff)的小部分

2024-09-22 20:29:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: 文件方法内存图像crop规范像素建议
1条回答
网友
1楼 · 发布于 2024-09-22 20:29:18

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页,每页为439x167像素。您可以在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以明显的方式从通道获取rect

您是否计划为ML培训生成修补程序?如果是,对于小补丁,fetch可以比crop快得多This issue有示例代码和一些基准测试-在该示例中,crop需要41s来生成12000个32x32补丁,但是fetch只需要0.5s

相关问题 更多 >