从分块的 TIFF 中提取分块并存储在 numpy 数组中

Extract tiles from tiled TIFF and store in numpy array

我的总体目标是将输入的 mirax (.mrxs) 幻灯片图像中的几个区域裁剪成 JPEG 输出文件。

下面是其中一张图片的样子:

请注意,较暗的灰色区域是图像的一部分,我最终希望以 JPEG 格式提取的区域是 3 个黑色正方形区域。

现在,具体情况:

我可以在命令行上使用 vips 将颜色通道从 mirax 图像提取到 3 个单独的 TIFF 文件中:

vips extract_band INPUT.mrxs OUTPUT.tiff[tile,compression=jpeg] C --n 1

其中C对应通道号(0-2),每个输出文件大小约为250MB。

接下来的工作是从图像中识别和提取感兴趣的区域,所以我转向了几个 python 图像库,这就是我遇到困难的地方。

当我尝试使用 OpenCV 加载任何 TIFF 时:

i = cv2.imread('/home/user/input_img.tiff',cv2.IMREAD_ANYDEPTH) 

我得到一个错误 error: (-211) The total matrix size does not fit to "size_t" type in function setSize

我设法通过以下方式获得了更多的 Pillow 牵引力:

from PIL import Image
tiff = Image.open('/home/user/input_img.tiff')
print len(tiff.tile)
print tiff.tile[0]
print tiff.info

输出:

636633
('jpeg', (0, 0, 128, 128), 8, ('L', ''))
{'compression': 'jpeg', 'dpi': (25.4, 25.4)}

但是,除了加载图像之外,我似乎无法执行任何有用的操作;例如做 tiff.tostring() 结果 MemoryError (我这样做是为了尝试将 PIL 对象转换为 numpy 数组)我不确定这个操作是否有效,因为存在瓷砖。

据我有限的了解,这些 TIFF 以 JPEG 压缩格式存储 'tiles' 中的图像数据(其中上图包含 636633)。

但是,我不清楚如何提取这些图块用作常规 JPEG 图像,甚至我概述的上述过程中的步骤顺序是否是实现总体目标的潜在有用方法从 mirax 图像中提取 ROI。

如果我在正确的轨道上,那么一些指导将不胜感激,或者,如果有另一种方法可以使用 vips/openslide 而不使用 python 来实现我的目标,我很想听听想法.此外,有关如何处理或理解我描述的 TIFF 文件的更多信息也会有所帮助。

理想情况包括:

1) vips/openslide 中的某种自动裁剪功能可以从 TIFF 或原始 mirax 图像生成 JPEG,按照以下命令的操作,但不会生成数万张图像:

vips dzsave CMU-1.mrxs[autocrop] pyramid

2) 能够从 TIFF 中提取图块并将与图像区域对应的数据存储为 numpy 数组,以便使用 OpenCV 或其他方法检测 3 个 ROI。

我会使用 the vips Python binding,它非常像 PIL,但可以处理这些巨大的图像。尝试类似的东西:

from gi.repository import Vips

slide = Vips.Image.new_from_file(sys.argv[1])
tile = slide.extract_area(left, top, width, height)
tile.write_to_file(sys.argv[2])

你也可以在命令行提取区域,当然:

$ vips extract_area INPUT.mrxs OUTPUT.tiff left top width height

虽然这会比 Python 中的循环慢一点。您可以使用 crop 作为 extract_area.

的同义词

openslide 将大量元数据附加到图像,描述各种子图像的布局和位置。尝试:

$ vipsheader -a myslide.mrxs 

并查看输出。您也许可以从中计算出子图像的位置。我也会在 openslide 邮件列表上询问,他们非常专业并且非常有帮助。

您还可以尝试一件事:获取低分辨率概览,对其进行角落检测,然后从高分辨率图像中提取图块。要获得幻灯片的低分辨率版本,请尝试:

$ vips copy myslide.mrxs[level=7] overview.tif

级别 7 被下采样 2 ** 7,所以 128x。