从MPY中提取TIFF和Nutile数组

2024-10-02 02:43:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

enter image description here

请注意,深灰色区域是图像的一部分,我最终希望以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时,请使用:

^{pr2}$

我得到一个错误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数组),如果存在tiles,我甚至不确定该操作是否有效。在

据我有限的理解,这些tiff以JPEG压缩格式将图像数据存储在“tiles”(上面的图像包含636633)中。在

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

如果我在正确的轨道上,那么一些指导将是值得赞赏的,或者,如果有另一种方法来实现我的目标,使用vips/openslide而不使用python,我会有兴趣听到一些想法。另外,关于如何处理或理解我所描述的TIFF文件的更多信息也会很有帮助。在

理想情况包括:

1)VIP/openslide中的某种自动裁剪功能,可以从TIFF或原始mirax图像生成JPEG,如下命令所示,但不生成成千上万的图像:

vips dzsave CMU-1.mrxs[autocrop] pyramid

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


Tags: 文件方法图像区域格式jpegprinttile
1条回答
网友
1楼 · 发布于 2024-10-02 02:43:53

我会用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])

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

^{pr2}$

不过这比Python中的循环要慢一点。您可以使用crop作为extract_area的同义词。在

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

$ vipsheader -a myslide.mrxs 

看看输出结果。你也许可以计算出你的子图像的位置。我也会在openslide邮件列表上问一下,他们非常专业,非常有帮助。在

还有一件事你可以尝试:得到一个低分辨率的概述,角落检测,然后从高分辨率图像提取瓷砖。要获取幻灯片的低分辨率版本,请尝试:

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

级别7的采样率降低了2**7,所以是128x

相关问题 更多 >

    热门问题