从 C++ 中的 SVS 格式文件中提取全比例图像

Extract a whole scale image from a SVS format file in C++

我正在尝试从 C++ 中的 SVS 文件中提取全比例图像。

我看到了the OpenSlide homepage的解释。 它说 SVS 格式是 "single-file pyramidal tiled TIFF".

所以我尝试像提取 TIFF 图像那样提取全比例图像:我从 SVS 文件中读取了所有 IFD,但是没有包含指向全比例图像的地址的 273 标签。

这就是为什么我现在有点困惑,SVS 格式的文件中没有完整比例的图像?

我从一个SVS文件中找到了一个未定义的私有标签,其编号是34675。这个标签是针对整幅图像的吗? 或者有什么好的提取方法吗?

Aperio SVS 是一种平铺格式。金字塔的所有层次都是平铺图像。基础层是第一个 TIFF 目录。 This page of the LibTiff documentation 展示了如何读取平铺图像。

简而言之,您需要查找标签 324 (TIFFTAG_TILEOFFSETS),以及标签 322 和 323 (TIFFTAG_TILEWIDTHTIFFTAG_TILELENGTH)。我强烈建议您为此使用 LibTiff,不要尝试自己动手。

SVS 文件中的自定义标签包含元数据,包括像素的物理尺寸(以微米为单位)(SVS 不设置分辨率 TIFF 标签)。

您可以读出缩略图(这是您所说的全比例图像的意思吗?)作为 openslide 关联图像。

例如,libvips 有一个由 openslide 作者编写的方便的 openslide 绑定:

$ vipsheader -f slide-associated-images CMU-1.svs
label, macro, thumbnail

列出SVS 文件中的图像。 macro是你默认得到的大金字塔,thumbnail是小概览,label是幻灯片标签的截图。

像这样获取缩略图:

$ vips copy CMU-1.svs[associated=thumbnail] x.jpg

以 JPG 图片格式阅读。

在 C++ 中,你可以这样写:

VImage thumb = VImage::new_from_file("CMU-1.svs", 
    VImage::option()->set("associated", "thumbnail"));
thumb.write_to_file("x.jpg");