我的总体目标是将输入 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。