1

我的总体目标是将输入 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 压缩格式将图像数据存储在“图块”(上面的图像包含 636633)中。

但是,我不清楚如何提取这些图块以用作常规 JPEG 图像,甚至我概述的上述过程中的步骤顺序是否是实现从mirax 图像。

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

理想的情况包括:

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

vips dzsave CMU-1.mrxs[autocrop] pyramid

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

4

1 回答 1

1

我会使用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 下采样,因此为 128 倍。

于 2015-05-01T22:30:56.423 回答