libvips / pyvips访问多通道tiffOME-Tiff的一小部分

问题描述

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

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

打开所有建议和/或其他工作流程。

解决方法

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以明显的方式从通道中获取一个矩形。

您是否打算为机器学习培训生成补丁?如果是这样,对于小补丁,fetch可能比crop快得多。 This issue包含示例代码和一些基准测试-在该示例中,crop花费41s制作12,000个32x32补丁,而fetch仅花费0.5s。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...