我的总体目标是将输入mirax(.mrxs)幻灯片图像中的几个区域裁剪为JPEG输出文件。
以下是其中一张图片的样子:
x1c 0d1x的数据
请注意,深灰色区域是图像的一部分,我最终希望以JPEG格式提取的区域是3个黑色正方形区域。
现在,具体来说:
我能够使用命令行上的vips将mirax图像中的颜色通道提取到3个单独的TIFF文件中:
vips extract_band INPUT.mrxs OUTPUT.tiff[tile,compression=jpeg] C --n 1
字符串
其中C
对应于通道号(0-2),每个输出文件的大小约为250 MB。
接下来的工作是以某种方式从图像中识别和提取感兴趣的区域,所以我转向了几个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
我设法让枕头多一点牵引力,通过做:
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的总体目标的潜在有用方法。
如果我的方向是正确的,那么我希望得到一些指导,或者,如果有其他方法可以在没有python的情况下使用vips/openslide来实现我的目标,我会很有兴趣听到一些想法。此外,更多关于我如何处理或理解我所描述的TIFF文件的信息也会有帮助。
理想的情况包括:
1)vips/openslide中的某种自动裁剪功能,可以从TIFF或原始mirax图像生成JPEG,沿着以下命令,但不会生成成千上万的图像:
vips dzsave CMU-1.mrxs[autocrop] pyramid
型
2)能够从TIFF中提取图块,并将与图像区域对应的数据存储为numpy数组,以便使用OpenCV或其他方法检测3个ROI。
1条答案
按热度按时间2guxujil1#
我会使用the vips Python binding,它非常像PIL,但可以处理这些巨大的图像。尝试以下操作:
字符串
当然,您也可以在命令行上提取区域:
型
OpenSlide将许多元数据附加到图像,描述各种子图像的布局和位置。试试看:
型
并查看输出。你也许可以从中计算出子图像的位置。我也会在openslide邮件列表上询问,他们是Maven和有帮助的。
还有一件事你可以试试:得到一个低分辨率的概览,在其上进行角检测,然后从高分辨率图像中提取区块。要获取幻灯片的低分辨率版本,请尝试:
型
级别7被下采样2**7,因此为128x。